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

内核破绽发掘手艺系列(6)——TriforceAFL和KAFL

申博_人物事迹 申博 181次浏览 未收录 0个评论

媒介

AFL(http://lcamtuf.coredump.cx/afl/)和对应的windows上的winAFL(https://github.com/googleprojectzero/winafl)可以说是用户态顺序二进制破绽发掘无人不知的神器,关于它们的剖析解读在网上也随处都是。很天然有人就做出了AFL用于内核fuzz的尝试。这篇文章引见两个相干的东西。第一个是nccgroup的TriforceAFL(https://github.com/nccgroup/TriforceAFL),它对AFL和QEMU举行了patch,TriforceLinuxSyscallFuzzer(https://github.com/nccgroup/TriforceLinuxSyscallFuzzer)可以运用TriforceAFL对内核fuzz。第二个是德国波鸿鲁尔大学的KAFL(https://github.com/RUB-SysSec)。我们先解说AFL中的qemu mode,然后细致研讨TriforceAFL和TriforceLinuxSyscallFuzzer的完成,末了简朴引见KAFL。

AFL中的qemu mode

关于AFL的完成已有很多剖析,这里仅仅引见AFL中的qemu mode。QEMU可以:

  1. 将一个架构(被模仿的架构)的BB(basic blocks,基本块)翻译到另一个架构(QEMU正在之上运转的架构)
  2. 将TB(translated blocks,翻译块)存储在TBC(translated block cache,翻译块缓存)中,一次翻译并屡次运用
  3. 在基本块中增添prologue和epilogue,以处置惩罚基本块之间的跳转、恢复掌握等操纵
    内核破绽发掘手艺系列(6)——TriforceAFL和KAFL

让我们看一下笼统的qemu实行流程:

  1. 启动预天生的代码prologue,初始化历程并跳转到二进制文件的_start
  2. 查找缓存中包括_start PC(program counter,顺序计数器)的已翻译块,假如没有天生翻译并缓存它
  3. 跳转到已翻译的块并实行它
    内核破绽发掘手艺系列(6)——TriforceAFL和KAFL

AFL运用fork server模子来fuzz顺序。运转目的的qemu实例将用作一个fork server,它将经由历程fds 198(掌握行列)和199(状况行列)与fuzzer历程通讯。这个fork server实例的克隆用于运转测试用例。目的的实行跟踪可以经由历程同享内存(shm)抵达fuzzer历程。
cpu_tb_exec函数担任实行TB,而且可以在个中取得诸如PC地点之类的信息。当指令指针定位于_start并实行平常的fork server操纵时实行下面的代码片断。
afl_setup函数设置子历程中存储跟踪数据数组的同享内存。
afl_forkserver函数担任建立fork server并监听fd以启动克隆。
afl_maybe_log函数第一次挪用setup并为每次实行TB更新同享跟踪内存。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
tb_find函数担任查找TB,它会在须要翻译时挪用tb_gen_code函数。在这里增添afl_request_tsl函数来关照fork server翻译这个块并将其保存在内存中,以便将来克隆。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
父历程此时正在afl_forkserver函数挪用的afl_wait_tsl函数里守候,终究afl_wait_tsl函数会挪用tb_gen_code函数来在父历程的缓存中翻译一个块。如许将来的子历程就可以运用这个缓存了,防止每一个块翻译屡次。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
syscall.patch在fork server发作SIGABRT的时刻通报准确的pid和tgid。
elfload.patch用于纪录afl_entry_point,afl_start_code和afl_end_code。它们在afl_maybe_log函数中用于某些边境搜检。

TriforceAFL

TriforceAFL中的qemu mode

平常当运用AFL fuzz时,每一个测试用例都邑启动一个驱动顺序并运转直到完成或崩溃。当对操纵体系举行fuzz时,这并不老是能够的。TriforceAFL许可操纵体系启动并加载一个驱动顺序,该驱动顺序掌握fuzz的生命周期以及托管测试用例。
运用TriforceAFL对内核fuzz将实行以下步骤:启动操纵体系,操纵体系将挪用fuzz驱动顺序作为其启动历程的一部份。驱动顺序将:启动AFL fork server;猎取一个测试用例;启用剖析器的跟踪;剖析测试用例;启用内核或内核的某些部份的跟踪;基于已剖析的输入举行体系挪用;关照测试用例已胜利完成(假如测试用例没有因为panic而提早住手)。在为每一个测试用例反复启动fork server以后,afl-fuzz顺序将部署一切这些步骤。下面就来看看详细完成。
因为fuzzer在虚拟机的fork副本中运转,因而每一个测试用例的内核的内存状况都是断绝的。假如操纵体系运用除内存以外的任何别的资本,这些资本将不会在测试用例之间断绝。因而,平常愿望运用内存文件体系(如Linux ramdisk映像)指导操纵体系。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
将一个称为aflCall的特别的指令增添到CPU,在QEMU的disas_insn函数中完成了指令的翻译,详细完成是在该函数中增添了一个处置惩罚该指令的case。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
它支撑startForkserver/getWork/startWork/doneWork这几个操纵。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
startForkserver:这个挪用致使虚拟机启动AFL fork server。在这个挪用以后,虚拟机中的每一个操纵都将在虚拟机fork的副本中运转,该副本只延续到测试用例完毕。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
getWork:这个挪用致使虚拟机从host中的文件读取下一个输入,并将其内容复制到guest的缓冲区中。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
startWork:此挪用许可跟踪AFL的edge map。只对startWork挪用中指定的虚拟地点局限实行跟踪。此挪用可以屡次实行,以调解跟踪指令的局限。可以挑选在驱动顺序剖析输入文件时跟踪它自身,然后在基于输入文件实行体系挪用时跟踪内核。AFL的搜索算法只知道被跟踪的edge,这个挪用供应了一种方法来调解要跟踪的部份。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
doneWork:这个挪用关照虚拟机测试用例已完成。它许可驱动顺序通报退出代码。虚拟机的fork副本将运用指定的退出代码退出,该代码由fork server与AFL通讯,并用于肯定测试用例的效果。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
增添的处置惩罚供应的敕令行参数的部份,可以看到传入了getWork读取的host中的文件的称号,panic函数地点和log_store函数地点:
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
在gen_intermediate_code_internal函数中增添的gen_aflBBlock函数:
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
当是panic函数时以exit(32)完毕:
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
当是log_store函数时纪录日记:
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
QEMU以TB为单元举行翻译并实行。这也就是说每当在code cache实行完一个TB以后,掌握权必需交还给QEMU。这很没有效率。所以只需TB实行完以后,它的腾跃目的肯定且该腾跃目的也已在code cache里,那我们就把这两个TB串接起来。这个就叫做block chaining。偶然QEMU最先实行一个基本块,然后被中缀。然后,它能够会从一最先就从新实行该块,或许转换还没有实行的块的一部份并实行它。这将致使edge map中涌现一些分外的edge。
所以起首禁用QEMU的chaining特征:
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
将AFL的跟踪特征从cpu_exec函数移动到cpu_tb_exec函数,以便仅在基本块实行到完成时才跟踪它(AFL的新版本也移动到cpu_tb_exec函数了):
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
前面我们说过AFL的QEMU可以防止每一个块被翻译屡次,当模仿只要一个地点空间的用户形式顺序时这个特征可以很好地事情,然则关于在差别地点空间中有很多顺序的完全体系就不太适宜了。现在只对内核地点运用这个特征(/TriforceAFL/docs/triforce_internals.txt中说现在没有运用这个功用,是在驱动顺序运转之前运转一个heater顺序完成的,有关heater的部份在TriforceLinuxSyscallFuzzer中为人人剖析)。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
在QEMU的内存分派函数ram_block_add中patch掉了设置QEMU_MADV_DONTFORK标志的代码以便子历程运用TB:
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
AFL的用户形式QEMU模仿没有题目,因为它是一个单线程顺序。但是,QEMU在运转全体系模仿器时运用多个线程。在大多数UNIX体系中fork一个多线程顺序时,子历程中只保存挪用fork的线程。fork也不保存重要的线程状况,并能够使锁、互斥锁、信号量和别的线程对象处于未定义的状况。为了处理这个题目,我们并不马上启动fork server,而是设置了一个标志来通知CPU住手。当CPU看到这个标志设置时,它退出CPU轮回,向IO线程发送关照,纪录一些CPU状况,然后退出CPU线程。IO线程吸收它的关照并实行一个fork。此时只要两个线程——CPU线程和内部RCU线程。RCU线程已被设想用于准确处置惩罚fork,不须要住手。在子历程中,CPU将运用之前纪录的信息从新启动,并可以在住手的处所继承实行。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
另外还新增了一个qemu_mode/qemu/block/privmem.c文件,这是一个存储驱动顺序,模仿平常IDE磁盘并支撑写时拷贝。

经由过程非常处置惩罚机制完成破绽应用

0x1:MS09-032简介 2009 年 7 月 5 日,微软爆出了 MPEG-2 视频漏洞,也就是著名的 Microsoft DirectShow MPEG-2 视频 ActiveX 控件远程代码执行漏洞。该漏洞微软编号为 MS09-032,CVE 编号为 CVE-2008-0015,对应补丁号为 KB 973346。 该漏洞存在于微软 DirectShow 组件 msvidctl.dll 中,文件路径: C:\WINDOWS\system32 \ msvidctl.dll,程序员由于粗心大意,将传入参数 buff 误写为&buff,而&buff 附近恰巧存放着 S.E.H 异常处理函数指针,于是可以通过覆盖 S.E.H 并结合 Heap spray 技术实现 exploit。 该漏洞几乎影响到微软当时全部的操作的系统。由于 Vista 和 2008 操作系统上具有一些保护机制,虽然存在漏洞,但是 exploit 代码不能被轻易执行。 0x2:Windows 异常处理机制简介 操作系统或程序在运行时,难免会遇到各种各样的错误,如除零、非法内存访问、文件打开错误、内存不足、磁盘读写错误、外设操作失败

TriforceAFL对AFL的修正

TriforceAFL对AFL的修正不多,重要有下面几点:增添了默许内存限定。操纵体系在挪用fork server之前能够须要几分钟启动,所以增添了AFL守候fork server的时候。因为虚拟机运用退出代码显现panic和别的不愿望涌现的行动,所以将一切非零退出状况视为崩溃。一些规范的AFL实用顺序不支撑fork server特征。当测试顺序可以在几分之一秒内实行时,这平常是可以接收的。但是,测试用例只能在冗长的操纵体系启动历程以后启动,而测试用例自身只是全部实行历程的一部份。为了准确地运转测试用例须要实用顺序支撑fork server特征。

TriforceLinuxSyscallFuzzer

TriforceLinuxSyscallFuzzer的团体目次以下。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL

  • crash_reports:发明的一些crash
  • docs:文档
  • rootTemplate&makeRoot:makeRoot依据rootTemplate中的文件为根文件体系天生ramdisk镜像。把driver复制进去,并部署init来实行它
  • aflCall.c:提议hypercall,挪用startForkserver/getWork/startWork/doneWork
  • argfd.c:建立并返回体系挪用参数运用的文件描述符
  • driver.c:驱动顺序担任吸收来自AFL的输入,将它们剖析为很多体系挪用纪录,然后实行每一个体系挪用。驱动顺序起首fork出一个子历程,让子历程实行重要的事情,然后守候子历程殒命。
    内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
    接下来子历程启动AFL fork server,今后的一切操纵都在模仿器fork出的副本中举行。然后它挪用getWork从AFL取得一些输入数据。然后挪用startWork在剖析输入数据时最先跟踪驱动顺序。然后再次挪用startWork来住手跟踪驱动顺序并最先跟踪内核。末了,它在挪用doneWork之前实行已剖析的体系挪用,以关照AFL测试用例已完成。
    内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
    从AFL运转时,startForkserver和doneWork挪用之间的一切内容都将在虚拟机的fork副本中实行。这个历程将对每一个输入文件反复一次。假如驱动顺序在抵达doneWork挪用之前发作crash,则主历程将捕捉到它,并代表crash的子历程挪用doneWork
  • gen.py\gen2.py\gen2-shapes.txt:天生驱动顺序运用的花样的syscall输入文件
  • getSyms:运用runCmd实行cat /proc/kallsyms然后将输出提取到kallsyms文件
  • getvmlinux:从bzImage中提取vmlinux文件
  • heater.c:之前已提到了heater,它会挪用稍后测试的体系挪用
  • parse.c:一些剖析函数
  • runCmd:启动内核并运转敕令。假如没有参数它将实行一个shell,不然它将运转指定的
    敕令,敕令应当存在于rootTemplate\bin中
  • runFuzz:启动fuzz
  • runTest&testAfl.c:须要复现crash时运用
  • sysc.c:天生体系挪用参数并提议体系挪用

KAFL

我们再来看看KAFL。下图所示是KAFL的团体架构。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL
KAFL团体分为三个部份:fuzz逻辑,VM(对QEMU和KVM的patch)和用户态agent。fuzz逻辑在host上作为一个用户态历程运转,重要就是自创AFL的逻辑。VM由一个用户态组件(QEMU-PT)和一个内核态组件(KVM-QT)构成。guest经由历程hypercall与host通讯。host可以读写guest内存,并在处置惩罚要求后继承VM实行。
大体上和TriforceAFL照样有一些相似之处的,一个重要的差别之处在于KVM-PT和QEMU-PT还离别完成了Intel PT数据的网络和解码用于fuzz逻辑,论文中经由对照机能优于TriforceAFL。
内核破绽发掘手艺系列(6)——TriforceAFL和KAFL

总结

总的来说这两个东西有肯定立异,然则现实发明的破绽都不太多,而且后续也处于没有继承保护的状况。关于平常的内核破绽发掘现在应当照样syzkaller各方面更好一点。


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

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

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