动物园AFL移相器

图片

关于哈布雷(Habré)的文章已经有好几次提出了美国模糊吊舱(AFL)( 1,2 )的话题。 但是在本文中,我们不会讨论经典的AFL,而是会讨论它的辅助实用程序及其修改,我们认为这可以显着提高模糊测试的质量。 如果您有兴趣学习如何升级AFL并寻找更快,更多的漏洞,欢迎使用!

什么是AFL,为什么这么好


AFL-覆盖率指导的模糊器或基于反馈的模糊器。 您可以从诸如Fuzzing:Art,Science和Engineering的凉爽文章中了解有关这些概念的更多信息。 如果我们总结有关AFL的信息,那么我们可以这样说:
  • 工具可执行文件以收集覆盖率信息
  • 突变输入以最大化覆盖范围
  • 重复上一步以查找程序崩溃。
    • 在实践中,被证明是非常有效的
      • 很好用


在图形上,这可以表示如下:

图片

如果您不知道什么是AFL,那么我们建议您:

  1. 项目官方页面
  2. AFL培训 -短暂地学习AFL
  3. afl-demo-有关如何使用AFL模糊C ++程序的简单演示
  4. afl-cve-使用AFL发现的漏洞的集合(自2017年以来未更新)
  5. 在此可以找到AFL在程序组装过程中添加到程序中的事实
  6. 在这里模糊网络应用程序的一些有用技巧

在撰写本文时,AFL的最新版本为2.52b 。 Fazzer一直在积极开发,随着时间的推移,一些第三方开发已包含在AFL的主要分支中,而与它们本身无关。 当前可以识别几种有用的辅助工具-下一部分列出了它们。

比赛Rode0day
另外,值得一提的是每月一次的Rode0day竞赛,在移相器之间存在竞争,这些移相器将在预先准备好的可以访问源代码且没有源代码的情况下更快地发现漏洞。 总的来说,是各种修改和AFL分叉的对峙。

但是,一些AFL用户注意到移相器Michal Zalewski的作者进行了一场竞选活动,以支持他的想法,因为最新的更改是在2017年11月5日发布的。 据称这与他离开Goog​​le和新项目有关。 在这方面,人们开始独立收集并制作最新版本2.52b的补丁。

图片

AFL还提供不同的选项和派生工具,它们可以使Python,Go,Rust,OCaml,GCJ Java,内核syscall甚至整个VM变得模糊。

其他PL的AFL

-python-afl-适用于Python。
-afl.rs-用于在Rust中模糊程序
-afl-fuzz-js -JavaScript的afl-fuzz。
-Java- AFL - Java的AFL模糊测试
-kelinci -Java的另一个相位器,其中包含有关此主题的文章
-javan-warty-pig -JVM的类似于AFL的模糊器
-afl-swift-在Swift上模糊程序
-ocamlopt-afl-适用于OCaml。
-sharpfuzz-基于afl的.net 模糊工具

辅助工具


在本节中,我们选择了用于AFL的各种脚本和工具,并将它们分为几类:

加工果肉


代码覆盖率

  • afl-cov-提供人类可读的覆盖率数据。
  • 计数呼叫 -比率得分。 该脚本计算二进制中已检测块的数量。
  • afl-sancov-类似于afl-cov,但使用了clang消毒剂。
  • covnavi是Cisco Talos集团的代码覆盖和分析脚本。
  • LAF LLVM Passes是afl的一些补丁集合,这些补丁会修改代码以使模糊测试人员更容易通过分支

几个脚本以最小化测试用例

  • afl-pytmin -afl-tmin的包装器,它试图通过使用多个CPU内核来加快最小化测试用例的过程。
  • afl-ddmin- mod-基于ddmin算法的afl-tmin的变体。
  • halfempty是一种基于并行化的快速实用程序,可最大程度地减少Tavis Ormandy的测试用例。

分布式启动


另外,最近在该主题上发表了一篇非常不错的文章“将AFL扩展到256线程计算机” ,它描述了在256线程上启动AFL。

部署,管理,监控,报告

  • afl-other-arch-一组补丁和脚本,可轻松添加对AFL中各种(非x86)体系结构的支持。
  • afl-trivia-一些简化AFL管理的小脚本。
  • afl-monitor-用于监视AFL操作的脚本。
  • afl-manager-用于管理多afl的python网络服务器。
  • afl-tools-具有afl-latest,afl-dyninst和Triforce-afl的docker映像。
  • afl- remote-用于远程afl实例管理的Web服务器。

AFL修改


AFL极大地影响了漏洞搜索社区和模糊行业本身。 随着时间的流逝,最初的AFL启发了他的各种修改,这也就不足为奇了。 在本节中,我们将考虑它们。 与原始AFL版本相比,每种修改在不同情况下都有其优点和缺点。

只需说一下,如果安装存在问题或不想花费时间-几乎所有修改都可以在hub.docker.com找到

怎么了

  • 提高速度和/或代码覆盖率
    • 演算法
    • 环境
      • 操作系统


  • 在没有源代码的条件下工作
    • 代码仿真
    • 代码检测
      • 静态的
      • 动态的



内置AFL模式

在继续讨论各种AFL修改和派生之前,有必要讨论两个曾经也是修改的重要模式,并最终成为内置模式。 这是Syzygy模式和Qemu模式。

Syzygy模式-是仪器instrument.exe中的操作模式
instrument.exe --mode=afl --input-image=test.exe --output-image=test.instr.exe 
对于此模式,有必要:用AFL静态重写PE32二进制文件,需要使用符号,需要其他开发人员才能使WinAFL内核知道。

Qemu模式-在QEMU下如何工作可在此处“ AFL模糊器的内部-QEMU仪器”中找到 。 版本1.31b的上游AFL中提供了对使用QEMU处理二进制文件的支持。 Afl qemu模式可将二进制代码的检测功能添加到二进制翻译引擎qemu tcg(微型代码生成器)中。 为此,afl有一个qemu构建脚本,该脚本可下载特定(2.10.0)版本的qemu的源代码,在其上强加几个小补丁,并针对给定的体系结构进行编译。 此后,将返回afl-qemu-trace文件,它实际上是用户模式(仅ELF可执行文件的仿真)qemu仿真。 因此,您可以将模糊处理与有关elf二进制文件的反馈一起使用,并可以使用qemu支持的许多不同体系结构。 此外,您还可以获得所有很棒的afl工具,从一个方便的屏幕开始,显示有关当前会话的信息,然后以afl-analyze等高级功能结束。 但是请记住,您还会获得qemu限制。 同样,例如,如果文件是由使用SoC硬件功能的工具链编译的,则在其上启动了Binar并且qemu不支持该二进制功能,一旦遇到特定指令或例如使用特定的MMIO,模糊处理就会中断。

qemu模式也有一个有趣的分支,由于使用了TCG代码和缓存,速度提高了3到4倍。

前叉

AFL前叉的外观主要与经典AFL本身的操作算法的变化和改进相关。

  • afl-cygwin尝试使用Cygwin将经典AFL移植到Windows。 不幸的是,这种尝试非常繁琐,缓慢,可以说放弃了开发。
  • AFLFast (将AFL扩展为Power Schedules) -AFL的第一个分支之一,添加了各种启发式方法,这使它在短期内可以有更多发展。
  • FairFuzz是AFL的扩展程序,其目的是尝试将更多的时间花在稀有分支上。
  • AFLGo是AFL的扩展,它主要用于特定代码部分的目标实现,而不是程序代码的一般覆盖范围。 这可以用于测试补丁或新添加的代码部分。
  • PerfFuzz是AFL扩展,用于查找可能会减慢程序速度的测试用例。
  • Pythia是AFL的扩展,其目的是在发现新路径的难度方面,将预测元素添加到定相过程中。
  • 安哥拉(Angora)是最近发布的用铁锈书写的模糊器之一。 使用他的新策略进行突变并扩大覆盖范围。
  • Neuzz-使用神经网络进行模糊测试的尝试。
  • UnTracer-AFL-与UnTracer的afl集成,用于高效跟踪。
  • Qsym-专为混合模糊测试而设计的实用Concolic执行引擎。 实际上,它是一个符号执行引擎(主要组件实现为intel引脚插件),与afl结合使用可实现混合模糊测试。 这是基于反馈的模糊测试主题的进一步发展,值得单独讨论。 他的主要优点是,他可以非常快速地(相对于其余部分)执行concolic执行。 这是由于命令的本机执行而没有代码的中间表示,摆脱了快照机制和许多试探法。 它使用旧的Intel引脚(由于libz3和其他DBT之间存在许多支持问题),并且当前可以与elf x86和x86_64体系结构一起使用。

值得一提的是,有大量与实施新方法,模糊技术有关的学术著作,这些都是采用和修改AFL的方法。 除了白皮书之外,没有其他可用的内容,因此我们甚至没有提及此类实现。 如果您有兴趣,那么他们很容易谷歌。 例如,后者是CollAFL:路径敏感模糊EnFuzzSmart Greybox Fuzzing ,afl的ML

基于Qemu的修改

  • TriforceAFL -AFL / QEMU具有完整的系统仿真功能。 来自nccgroup的叉子。 允许在qemu模式下模糊整个操作系统。 通过特殊指令(aflCall(0f 24))实现,该指令已添加到QEMU x64 CPU中。 不幸的是,它不再受支持,其中afl的最新版本是2.06b。
  • TriforceLinuxSyscallFuzzer-模糊化Linux系统调用。
  • afl-qai是QEMU Augmented Instrumentation(qai)的一个小型演示项目。


基于KLEE的修改

kleefl-用于通过符号执行生成测试用例(在大型程序上非常慢)。

基于独角兽的修改

afl-unicorn-允许您模糊代码段,并在Unicorn Engine上进行仿真。 我们还在实践中成功地使用了这种AFL变体,即在一个RTOS的代码部分中使用了该代码,该代码是在SOC上执行的,不可能使用QEMU模式。 建议在没有源(无法组装独立的二进制文件进行解析器分析)并且程序不直接接受输入数据(例如,它们被加密或像一个CGC二进制文件中表示信号样本)时使用此修改。反向查找拟议的places-functions,在该函数中以便于fuzzer使用的格式处理此数据,并且可以对其进行fuzzing。 这是最常见的AFL修改。 从某种意义上说,它使您可以模糊所有内容。 也就是说,它不依赖于体系结构,源代码的可用性,输入数据的格式以及二进制本身的格式(最引人注目的示例只是裸机-只是控制器内存中的部分代码)。 研究人员初步检查了这个二进制信息,并编写了一个模糊器,用于模拟解析器程序输入时的状态。 可以看出,与AFL不同,您需要对Binar进行某种研究。 对于Wi-Fi或基带之类的裸机固件,您仅需记住许多缺点:

  1. 有必要以某种方式本地化校验和检查。
  2. 必须记住,模糊器的状态是存储在内存转储中的内存的状态,这会阻止实现模糊器的某些路径。
  3. 不能动态访问动态内存,但是可以手动实现(也需要花费很多精力),并且它取决于RTOS(还需要事先进行调查)。
  4. 不模拟RTOS任务间的交互-您还可以防止模糊器找到某些路径。

使用此修改的示例是“ afl-unicorn:模糊任意二进制代码”
“ Afl独角兽:第2部分-模糊化'不可模糊'”

在继续进行基于动态二进制工具(DBI)框架的修改之前,我们立即回想起这些框架中最快的是DynamoRIO,然后是DynInst,最后是PIN。

PIN修改

  • aflpin-带有英特尔PIN仪器的AFL。
  • afl_pin_mode-通过Intel PIN实现的另一个AFL工具。
  • afl- pin-带有PINtool的AFL。
  • NaFl -AFL 模糊器的 (基本核心)克隆。
  • PinAFL-该工具的作者试图将AFL传输到Windows,以模糊已编译的二进制文件。 显然,在一晚上对风扇进行了更多操作,然后该项目无法开发。 该存储库不包含源,仅包含收集的二进制文件和启动说明。 未指定此工具所基于的AFL版本,仅支持32位应用程序。

如您所见,有许多不同的修改,但实际上在现实生活中它们没有太多用处。

基于Dyninst的修改

afl-dyninst-美国模糊圈+ Dyninst == AFL黑盒模糊测试。 此版本的功能是使用DynInst对最初研究的程序(不带源代码)进行静态检测(静态二进制检测,静态二进制重写),然后由经典AFL混淆,后者认为该程序是使用afl-gcc / afl构建的-g ++ / afl-as;)最后,它使我们有机会无需源代码就可以工作,并且具有非常好的性能-与本地编译相比,它的速度为0.25倍。 与QEMU相比,它具有显着的优势,即能够检测动态链接的库。 虽然QEMU仅能够检测静态链接到库的主要可执行文件。 不幸的是,现在这仅与Linux操作系统有关。 为了支持Windows,DynInst本身需要进行更改,并且该工作正在进行中

您还可以注意这样的分支 ,它在各种功能(对AARCH64和PPC架构的支持)和速度方面都很好地发挥作用;)

基于DynamoRIO的修改

  • drAFL -AFL + DynamoRIO =在Linux上没有源即可进行模糊测试。
  • afl-dr-基于DynamoRIO的另一种实现,该实现已在Habr的开放空间上进行了详尽的绘制
  • afl-dynamorio -vanhauser-thc的改良版(风扇,用于泵送和稳定AFL)。 他对这个版本说:“当普通的afl-dyninst崩溃了二进制文件并且qemu模式-Q不能运行时,用DynamoRIO运行AFL。” 令人高兴的是,此处添加了对ARM和AARCH64的支持。 关于性能:DynamoRIO比Qemu慢约10倍,比dyninst慢25倍-但是,比Pintool快10倍。
  • WinAFL是Windows的afl最著名的分支。 (DynamoRIO,也有syzygy模式)。 这种修改的出现只是时间问题,因为希望在Windows下在没有源代码的应用程序上尝试AFL的愿望很多。 目前,该工具正在积极开发中,尽管使用了稍微落后的AFL代码库(在撰写本文时为2.43b),但已经发现了几个漏洞(CVE-2016-7212,CVE-2017-0073,CVE-2017- 0190,CVE-2017-11816)。 应该注意的是,主要开发人员是Google零项目团队和MSRC漏洞与缓解团队的专家,这给希望进一步积极开发该项目提供了理由。 为了实现该模糊器,开发人员已经从编译时间检测转变为使用动态检测(基于DynamoRIO),这有望减慢正在研究的软件的执行速度,但是所产生的开销(两倍)与二进制模式下的经典AFL相当。 开发人员还解决了流程启动时间长的问题,将其称为持久性模糊模式,他们选择需要模糊化的函数(通过文件中的偏移量或如果导出表中存在该函数则通过名称进行命名)并以可在循环中调用的方式对其进行检测,从而启动几个输入数据样本,而无需重新启动该过程。 最近出现了一篇有趣的文章 ,研究人员展示了如何使用winafl在约50天的时间内发现约50个漏洞。 此外,几乎在WinAFL上的文章发表之前,还添加了Intel PT模式(稍后会对此进行详细介绍)-详细信息在这里

高级/老练的读者可能会注意到,除了Frida以外,所有流行的检测框架都进行了修改-确实如此。 仅在Chizpurfle:针对供应商服务定制的灰色盒子Android Fuzzer中找到了将Frida与AFL一起使用的唯一提及。 带有Frida的AFL版本非常有用,因为Frida很好地支持许多RISC体系结构。

Capstone,Unicorne,Keystone的创建者还期待着许多研究人员发布Scorpio DBI框架。 基于此框架,作者本人已经制作了模糊器(Darko),并据此成功地将其用于模糊嵌入式设备。 有关更多信息,请参见深入研究:使用代码覆盖率引导的模糊测试在嵌入式系统中查找0days

基于处理器硬件功能的修改

当涉及支持处理器硬件功能的AFL修改时,这主要表明可以对内核代码进行模糊处理,其次,可以对没有源代码的应用程序提高模糊处理速度。

而且,当然,首先,我们谈论的是处理器的硬件功能,例如Intel PT (处理器跟踪)。 从第六代处理器开始可用(大约从2015年开始)。 自然,为了使用以下模糊器,您将需要具有适当的Intel PT支持的硬件。


结论


您可能已经注意到,该主题正在积极发展中。 同时,创造力有很大的空间来创建AFL的新的,有趣的和有用的修改。

感谢您的关注和成功的测试!

合著者: Nikita Knizhov

PS感谢研究中心的整个团队在没有经验和帮助的情况下准备这种材料,因此不可能准备这种东西。

Source: https://habr.com/ru/post/zh-CN435644/


All Articles