内核fuzz手艺系列(1)——trinity | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

内核fuzz手艺系列(1)——trinity

申博_行业观察 申博 221次浏览 未收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

这是内核fuzz手艺系列的第一篇。

媒介

提到linux内核fuzz如今最盛行的对象是syzkaller,不外在syzkaller涌现之前(github上初次commit是2015年10月)linux内核fuzz用到最多的对象是trinity(github上初次commit是2006年3月,1.0版本宣布于2012年8月),而且就在2019年1月方才宣布了1.9版本。网上也有种种魔改版在android下面跑的。比起来trinity算得上是元老级的fuzz对象了。本文会细致剖析trinity如今最新的1.9版本的完成。

应用macOS 的 Folder Actions 功用完成耐久化掌握

与Windows平台相比,为macOS平台渗透测试介绍新型战术、技术和程序(TTP)的文章数要少得多。因此,本文将为读者详细介绍一种新型的方法:利用Apfell框架中的JavaScript for Automation(JXA)代理实现对macOS的持久控制。 我们知道,mac

团体架构

下面是《LCA: The Trinity fuzz tester》这篇文章中给的一张图。
内核fuzz手艺系列(1)——trinity
trinity-main实行种种初始化,然后建立实行体系挪用的子历程。trinity-main建立的同享内存地区用于纪录种种全局信息(翻开文件形貌标记、实行的体系挪用总数和胜利和失利的体系挪用数等等)和每一个子历程的种种信息(pid和实行的体系挪用信息等等)。
trinity-watchdog确保体系一般事情。它会搜检子历程是不是正在运转(能够会在体系挪用中被停息),若是没有运转,则会将其杀死。当主历程检测到个中一个子历程已住手时(由于trinity-watchdog将其住手或出于别的缘由)会启动一个新的子历程来替代它。trinity-watchdog还看管同享内存地区的完整性。
(PS:《LCA: The Trinity fuzz tester》这篇文章是几年之前的了,依据后文的源码剖析如今trinity-watchdog的功用已被整合到trinity-main中)
在trinity文件夹下除子目次,另有下面这些源代码文件。

  • blockdevs.c:块装备相干(如今没有效到)
    内核fuzz手艺系列(1)——trinity
  • child.c:实行fuzz的子历程
  • debug.c:调试功用
  • devices.c:剖析/proc/devices和/proc/misc以对ioctl举行fuzz
  • ftrace.c:ftrace功用,纪录到/boot/trace.txt文件
  • generate-args.c:体系挪用参数的天生开释等处置惩罚
  • kcov.c:代码覆盖率功用(如今没有效到)
  • locks.c:锁功用,依据前面的叙说我们晓得有多个历程操纵同享内存地区,以是须要加锁
  • log-files.c:将日记纪录到当地文件
  • udp.c:将日记纪录到长途服务器
  • log.c:对udp.c和log-files.c的封装
    能够经由历程命令行参数挑选将日记纪录到长途服务器或许当地文件,也能够禁用日记功用。默许将日记纪录到当地文件。将日记纪录到服务器相干完成在server文件夹中。

    这里我们只看将日记纪录到当地文件中的状况。主历程的日记纪录到trinity.log。
    内核fuzz手艺系列(1)——trinity
    每一个子历程都将它实行的体系挪用信息写入一个零丁的日记文件trinity-child1.log\trinity-child2.log……。
    内核fuzz手艺系列(1)——trinity

  • arg-decoder.c:子历程在实行体系挪用前后会挪用到个中的函数纪录信息到syscallrecord构造体中的prebuffer(子历程child编号/pid/每次实行体系挪用顺次递增的编号/是不是是32位/体系挪用名和参数)和postbuffer(返回值/错误代码)中,然后写入到trinity-childx.log(如上图中所示)
    内核fuzz手艺系列(1)——trinity
  • main.c:被trinity.c经由历程main_loop函数挪用,实行主要功用
  • objects.c:治理体系挪用顶用到的文件形貌符,每一种文件形貌符细致的操纵在fds文件夹中
    内核fuzz手艺系列(1)——trinity
  • output.c:打印信息
  • params.c:命令行参数处置惩罚
  • pathnames.c:体系挪用参数若是是路径名供应相干参数
  • pids.c:pid治理
  • post-mortem.c:检测到taint今后向trinity-post-mortem.log写入每一个子历程末了一个体系挪用信息
  • results.c:体系挪用实行胜利今后的处置惩罚
  • shm.c:同享内存地区的初始化和建立
  • signals.c:旌旗灯号功用
  • stats.c:打印体系挪用实行总数,胜利的数目,失利的数目和错误代码
  • syscall.c:实行体系挪用
  • sysv-shm.c:初始化时建立供体系挪用运用的同享内存(是用shmget函数建立的同享内存,不是前面说的shm.c顶用mmap函数建立的用来纪录种种全局信息的模仿的同享内存,背面没有特别申明提到同享内存指的是后者)
  • tables-biarch.c:同时运用64位和32位两种架构的体系挪用
  • tables-uniarch.c:只运用一种架构的体系挪用
  • tables.c:对tables-biarch.c和tables-uniarch.c的封装
    能够经由历程命令行参数指定一种架构。
  • taint.c:taint功用
  • trinity.c:实行一些初始化操纵并挪用main.c中的main_loop函数
  • uid.c:uid的初始化和搜检等功用
  • utils.c:一些辅佐函数

trinity文件夹下含有源代码文件的子目次以下。

  • childops:该目次下有四个文件,如今用到的只要random-syscall.c这一个文件,别的的在child.c中被解释掉了。random_syscall函数固然就是随机举行体系挪用了,背面再细致引见
  • fds:前面已引见
  • include:用到的头文件
  • ioctls:ioctl相干fuzz。每组ioctl都用ioctl_group构造体透露表现,ioctls中的ioctls.c供应get_random_ioctl_group等函数,经由历程syscalls中的ioctl.c中的syscallentry构造体举行挪用
    内核fuzz手艺系列(1)——trinity
    syscallentry构造体中的sanitise函数用来在天生体系挪用参数今后对参数举行调解。这里就是挪用的sanitise_ioctl函数,sanitise_ioctl函数会挪用ioctl_group构造体中的sanitise函数,关于sgx_grp挪用的是pick_random_ioctl函数从这一组ioctl中随机挑选一个。
    内核fuzz手艺系列(1)——trinity
  • mm:该目次下有四个文件,maps-initial.c建立初始的内存映照,每一个子历程随后会将它们复制为本身的私有副本
    内核fuzz手艺系列(1)——trinity
    内核fuzz手艺系列(1)——trinity
    内核fuzz手艺系列(1)——trinity
    fault-write.c和fault-read.c离别供应random_map_writefn函数和random_map_readfn函数供dirty_mapping函数随机对映照做一些操纵。前面能够看到建立子历程挪用init_child_mappings函数今后就会挪用dirty_mapping函数,此外在mmap和mmap2体系挪用返回今后也会随机挪用dirty_mapping函数。
    内核fuzz手艺系列(1)——trinity
    内核fuzz手艺系列(1)——trinity
    内核fuzz手艺系列(1)——trinity
    syscallentry构造体中的post函数在体系挪用返回今后被挪用。
    内核fuzz手艺系列(1)——trinity
    maps.c供应了前面所说的dirty_mapping函数和init_child_mappings函数,另有别的一些相干函数。
  • net:net相干fuzz。和ioctls差不多,在syscalls中的send.c/setsockopt.c/socket.c中挪用
  • rand:天生随机数,随机长度,随机地点等
  • server:前面已引见
  • syscalls:被fuzz的体系挪用,运用syscallentry构造体形貌
  • tools:只要一个analyze-sockets.c源代码文件,用来剖析socket文件

trinity-main

下面我们从trinity.c的main函数最先剖析。
起首设置最大子历程数max_children为CPU核心数的4倍。然后处置惩罚参数,除前面说到的另有几个对照有效的选项,好比-c透露表现fuzz指定的体系挪用;-N透露表现指定fuzz的体系挪用数目;-V接收目次参数,顺序随机翻开该目次中的文件,并将天生的文件形貌符传递给体系挪用,有助于发明特定文件体系范例中的破绽等等。
接下来建立并初始化同享内存地区。同享内存地区shm_s构造体界说在include\shm.h中,该构造体中的children是一个二维数组,数组中的每一个元素都是指向子历程运用的childdata构造体的指针。
内核fuzz手艺系列(1)——trinity
内核fuzz手艺系列(1)——trinity
初始化体系挪用,团体架构中已提到了体系挪用是经由历程include\syscallentry.h中的syscallentry构造体界说的,syscalltable构造体中的entry是一个指向syscallentry构造体的指针,以是经由历程指向syscalltable构造体的指针table经由历程table[i].entry能够取到一切的syscallentry。在include目次下arch-xxx.h界说了分歧架构的syscalltable。
内核fuzz手艺系列(1)——trinity
好比今后操纵体系是__x86_64__,那末include的是arch-x86-64.h。
内核fuzz手艺系列(1)——trinity
在arch-x86-64.h内里界说了今后同时运用64位和32位两种架构的体系挪用。
内核fuzz手艺系列(1)——trinity
在syscallentry构造体中能够看到每一个体系挪用中包罗体系挪用名、参数个数、返回值范例和每一个参数的参数名、范例、取值局限等等。
内核fuzz手艺系列(1)——trinity
在初始化体系挪用的历程中会挪用它们的init函数。只要perf_event_open这个体系挪用界说了响应的init函数。
内核fuzz手艺系列(1)——trinity
内核fuzz手艺系列(1)——trinity
初始化文件形貌符,团体架构中已提到了objects.c治理体系挪用顶用到的文件形貌符,每一种文件形貌符细致的操纵在fds文件夹中,都用fd_provider构造体透露表现,初始化时挪用它们的open函数。
内核fuzz手艺系列(1)——trinity
另有别的的一些初始化操纵,今后重点就在于main_loop函数,从main_loop函数退出今后实行一些清算善后的操纵。在main_loop函数中起首纪录下main函数已最先,然后挪用fork_children函数建立实行体系挪用的子历程。在while轮回中,只要子历程还在运转,就一向实行下面这些操纵:
1.起首在handle_children函数中守候子历程住手的旌旗灯号。若是1秒今后没有接收到则返回。若是接收到则找到响应的子历程然后挪用handle_child函数处置惩罚。
在handle_child函数中若是子历程是一般住手则纪录该子历程已退出,删除它的一切有关援用,从新建立子历程;若是子历程是非常住手或许停息则挪用响应的处置惩罚函数handle_childsig,handle_childsig函数除做一些纪录,别的的处置惩罚和handle_child函数大抵雷同。
2.搜检内核是不是taint,是则挪用stop_ftrace函数住手ftrace并挪用post-mortem.c中的tainted_postmortem函数,团体架构中已提到了其功用是检测到taint今后向trinity-post-mortem.log写入每一个子历程末了一个体系挪用信息。
内核fuzz手艺系列(1)——trinity
3.搜检同享内存地区是不是破坏,是不是持有同享内存地区的锁和每一个子历程运用的childdata构造体中的syscallrecord的锁。
内核fuzz手艺系列(1)——trinity
4.若是经由历程-N参数设定了fuzz体系挪用的数目那末搜检是不是到达该数目。
内核fuzz手艺系列(1)——trinity
5.搜检每一个子历程在举行末了一次体系挪用之前纪录的时候戳,纪录历程是不是处于僵尸状况。若是已过去了30秒或许40秒及以上则发送SIGKILL旌旗灯号杀死历程。
内核fuzz手艺系列(1)——trinity
内核fuzz手艺系列(1)——trinity
若是一切的历程都处于僵尸状况,随机发送SIGKILL旌旗灯号杀死历程。
6.打印今后状况,若是正在运转的历程少于max_children则再建立历程。
内核fuzz手艺系列(1)——trinity
退出while轮回今后若是同享内存地区没有破坏继承挪用handle_children函数。若是另有子历程运转则杀死并纪录下main函数已完毕。

子历程

下面我们重点来看子历程中的操纵。前面我们已晓得了子历程是由fork_children函数建立的。在fork_children函数中挪用了spawn_child函数。spawn_child函数中fork胜利今后挪用了child_process函数。在经由一些初始化操纵今后,若是uid不为0,会挪用到random_syscall函数。团体架构中已提到了childops目次下的random-syscall.c中的random_syscall函数。
内核fuzz手艺系列(1)——trinity
random_syscall函数中起首随机挑选一个体系挪用。若是同时启用了64位的体系挪用和32位的体系挪用则有10%的概率挑选32位的体系挪用。若是该体系挪用设置了AVOID_SYSCALL或许NI_SYSCALL标记的话还须要将其从active_syscall表中删除并从新挑选。
内核fuzz手艺系列(1)——trinity
内核fuzz手艺系列(1)——trinity
内核fuzz手艺系列(1)——trinity
接下来天生函数参数。若是函数参数范例为ARG_UNDEFINED则随机天生一个数作为参数,关于其他的参数范例在generic_sanitise函数中挪用fill_arg函数天生。在fill_arg函数中依据参数范例挪用分歧的函数天生对应的参数。
内核fuzz手艺系列(1)——trinity
内核fuzz手艺系列(1)——trinity
好比参数是ARG_NON_NULL_ADDRESS范例(好比write函数的第二个参数),从初始化时sysv-shm.c建立的同享内存中找一块。
再好比参数是ARG_SOCKETINFO范例(好比getsockname函数的第一个参数),从初始化文件形貌符时建立的OBJ_FD_SOCKET中找一个。
若是设置了EXTRA_FORK标记,在一个fork出的历程中实行体系挪用。如今只要execveat和execve体系挪用设置了这个标记,由于它们会将子历程替代掉。
内核fuzz手艺系列(1)——trinity
实行体系挪用今后马上举行taint检测。
内核fuzz手艺系列(1)——trinity
若是体系挪用返回值为-1申明挪用失利,错误代码是ENOSYS(函数没有完成)则将其从active_syscall表中删除,关于别的的错误代码举行纪录。
不然申明挪用胜利,关于ARG_FD范例和ARG_LEN范例的参数举行纪录。
内核fuzz手艺系列(1)——trinity
今后就是一些清算的事情。
内核fuzz手艺系列(1)——trinity
本文的剖析就到此为止了。总的来说trinity还对照原始,不克不及自动天生复现的POC,函数参数范例有限,不支持代码覆盖率……今后有时候会分享更多内核fuzz对象的道理,能够会写成一个系列。

区块链安全—深入分析ATN漏洞

一、ATN介绍 ATN作为全球首个区块链+AI项目,是一个去中心化的、无需授权的、用户自定义人工智能即服务(AIaaS)和使用接口的开放区块链平台。ATN公有链将引入DBot的Oracle预言机、跨链互操作技术,且通过石墨烯架构实现高并发TPS,侧重解


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明内核fuzz手艺系列(1)——trinity
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址