
在本文中,我们将不谈论经典的AFL本身,而是谈论为其设计的实用程序及其修改,我们认为这可以显着提高模糊测试的质量。 如果您想知道如何提高AFL以及如何更快地找到更多漏洞,请继续阅读!
什么是AFL,这有什么好处?
AFL是覆盖率导向或基于反馈的模糊器。 有关这些概念的更多信息,请参见
“ Fuzzing:艺术,科学和工程”一文 。 让我们总结一下有关AFL的一般信息:
- 它修改可执行文件以了解它如何影响覆盖范围。
- 突变输入数据以最大化覆盖范围。
- 重复上一步,查找程序崩溃的位置。
这是一个图形表示:

如果您不知道什么是AFL,以下是一些有用的资源供您入门:
- 该项目的官方页面 。
- AFL培训-AFL的简短介绍。
- afl-demo -AFL模糊C ++程序的简单演示。
- afl-cve -AFL发现的漏洞的集合(自2017年以来未更新)。
- 在这里,您可以了解AFL在其构建过程中添加到程序中的内容。
- 有关使网络应用程序模糊化的一些有用技巧。
在撰写本文时,AFL的最新版本是
2.52b 。 模糊测试器正在积极开发中,随着时间的推移,一些侧向开发已被并入AFL的主要分支中,并且变得无关紧要。 今天,我们可以命名几个有用的附件工具,这些工具将在下一章中列出。
Rode0day比赛还值得一提的是每月
举行的Rode0day竞赛-这是一个事件,在这种情况下,无论是否有源代码访问,模糊测试者都试图在预制语料库中以比对手少的时间找到最多数量的bug。 从本质上讲,Rode0day是AFL的不同修改与分支之间的一场战斗。
一些AFL用户
指出 ,自从上次修改日期至2017年11月5日以来,其作者Michal Zalewski显然已放弃了该项目。这可能与他离开Google并从事一些新项目有关。 因此,用户开始为最新的当前版本2.52b制作新的
补丁程序 。

AFL也有不同的变体和派生版本,它允许模糊化Python,Go,Rust,OCaml,GCJ Java,内核syscall甚至整个VM。
辅助工具
在本章中,我们收集了用于AFL的各种脚本和工具,并将它们分为几类:
崩溃处理处理代码覆盖率一些用于最小化测试用例的脚本分布式执行最近,发表了一篇很好的文章,标题为
“将AFL扩展到256线程计算机” 。
部署,管理,监控,报告AFL修改
AFL对脆弱性研究人员的社区及其模糊性产生了非常强烈的影响。 一段时间之后,人们开始根据原始AFL进行修改,这一点也就不足为奇了。 让我们看看它们。 在不同情况下,与原始AFL相比,这些修改中的每一种都有其优点和缺点。
几乎所有mod都可以在
hub.docker.com上找到
干嘛
AFL操作的默认模式在继续研究AFL的不同修改和分支之前,我们必须谈论两种重要的模式,它们在过去也曾是修改,但最终被合并。 他们是Syzygy和Qemu。
Syzygy模式-是在instrument.exe中工作的模式
instrument.exe --mode=afl --input-image=test.exe --output-image=test.instr.exe
Syzygy允许使用AFL静态重写PE32二进制文件,但需要符号和其他开发才能使WinAFL内核能够识别。
Qemu模式-它在QEMU下的工作方式可以在
“ AFL模糊器的内部-QEMU Instrumentation”中看到。 在版本1.31b中向上游AFL添加了使用QEMU处理二进制文件的支持。 AFL QEMU模式与qemu tcg(微型代码生成器)二进制翻译引擎中添加的二进制检测功能一起使用。 为此,AFL具有一个构建脚本qemu,该脚本可提取某个版本的qemu(2.10.0)的源,将它们放到几个小的补丁中,并为定义的体系结构构建。 然后,创建了一个名为afl-qemu-trace的文件,该文件实际上是qemu-的用户模式仿真文件(仅仿真可执行ELF文件)。 因此,对于qemu支持的许多不同体系结构,可以将模糊与对elf二进制文件的反馈一起使用。 另外,您还可以获得所有很棒的AFL工具,从带有有关当前会话的信息的监视器到诸如afl-analyze之类的高级内容。 但是您也得到qemu的限制。 同样,如果使用硬件SoC功能通过工具链构建文件,该文件会启动二进制文件,而qemu不支持该文件,则一旦有特定指令或使用特定MMIO,模糊处理就会被中断。
这是qemu模式的
另一个有趣的分支 ,其中通过TCG代码检测和兑现将速度提高了3-4倍。
前叉AFL的前叉的出现首先与经典AFL的算法的更改和改进有关。
- pe-afl-一种用于模糊处理Windows OS中没有源代码的PE文件的修改。 为了进行操作,模糊器使用IDA Pro分析目标程序,并为以下静态仪器生成信息。 然后使用AFL对已检测版本进行模糊处理。
- afl-cygwin-试图通过Cygwin将经典的AFL移植到Windows。 不幸的是,它有很多错误,非常慢,并且已经放弃了它的开发。
- AFLFast (用功率计划表扩展AFL)-最早的AFL分支之一。 它增加了启发式方法,使它可以在短时间内通过更多路径。
- FairFuzz -AFL的扩展,针对稀有分支。
- AFLGo-是AFL的扩展,旨在获取代码的某些部分而不是完整的程序覆盖范围。 它可以用于测试补丁或新添加的代码片段。
- PerfFuzz -AFL的扩展,用于查找可能会严重降低程序速度的测试用例。
- Pythia-是AFL的扩展,旨在预测发现新路径的难度。
- 安哥拉猫 -是最新的模糊测试工具之一,写在生锈。 它使用新策略进行突变并增加覆盖范围。
- Neuzz-用神经网络模糊。
- UnTracer-AFL-将AFl与UnTracer集成以进行有效跟踪。
- Qsym-专为混合模糊测试而设计的实用Concolic执行引擎。 本质上,它是一个符号执行引擎(基本组件实现为intel引脚的插件),与AFL一起执行混合模糊测试。 这是基于反馈的模糊测试发展的一个阶段,需要进行单独的讨论。 它的主要优点是可以相对较快地执行Condicate执行。 这是由于命令的本机执行而没有代码,快照和某些启发式的中间表示。 它使用旧的Intel引脚(由于支持libz3和其他DBT之间的问题),目前可以与elf x86和x86_64体系结构一起使用。
- Superion -Greybox模糊测试器的一个明显优势是,它与仪器化程序一起,也可以使用ANTLR语法获取输入数据的规范,然后在此语法的帮助下执行变异。
- AFLSmart-另一个Graybox模糊测试器。 作为输入,它以桃子模糊器使用的格式获取输入数据的规范。
有许多研究论文致力于对AFL进行修改的新方法和模糊技术的实施。 只有白皮书可用,因此我们甚至都没有提到这些白皮书。 您可以根据需要搜索它们。 例如,最新的一些是
CollAFL:Path Sensitive Fuzzing ,
EnFuzz ,
“用于模糊解释器的有效方法” ,AFL
ML 。
基于Qemu的修改- TriforceAFL -AFL / QEMU模糊化,具有完整的系统仿真功能。 nccgroup的一个fork。 允许在qemu模式下模糊整个操作系统。 它是通过在QEMU x64 CPU中添加的特殊指令(aflCall(0f 24))实现的。 不幸的是,它不再受支持。 AFL的最新版本是2.06b。
- TriforceLinuxSyscallFuzzer -Linux系统调用的模糊处理。
- afl-qai -QEMU增强仪器(qai)的小型演示项目。
基于KLEE的修改kleefl-用于通过符号执行生成测试用例(在大型程序上非常慢)。
基于独角兽的修改afl-unicorn-通过在
Unicorn Engine上进行仿真来模糊代码片段。 我们在实践中成功地在某个RTOS的代码区域中使用了AFL的这种变体,该区域在SOC上执行,因此我们不能使用QEMU模式。 如果我们没有源(我们无法构建用于分析器的独立二进制文件)并且程序没有直接获取输入数据(例如,数据),则使用此修改是合理的加密或像CGC二进制文件中那样是信号样本),然后我们可以反转并找到假定的places-functions,其中以对fuzzer方便的格式处理数据。 这是AFL的最通用/通用的修改形式,即,它允许对任何内容进行模糊测试。 它独立于体系结构,源,输入数据格式和二进制格式(最显着的裸机示例-只是控制器内存中的代码片段)。 研究人员首先检查此二进制文件,然后编写一个模糊器,以模拟解析器过程输入时的状态。 显然,与AFL不同,这需要对二进制文件进行一定的检查。 对于Wi-FI或基带之类的裸机固件,需要牢记某些缺点:
- 我们必须本地化控制和的检查。
- 请记住,模糊器的状态是保存在内存转储中的内存状态,这可能会阻止模糊器到达某些路径。
- 没有动态调用动态内存,但是可以手动实现,这取决于RTOS(有待研究)。
- 不模拟任务间RTOS交互,这也可能阻止找到某些路径。
使用此修改的示例
“ afl-unicorn:模糊任意二进制代码”和
“ afl-unicorn:第2部分-模糊'Unfuzzable'” 。
在继续进行基于动态二进制工具(DBI)框架的修改之前,请不要忘记DynamoRIO,Dynlnst和PIN最终显示了这些框架的最高速度。
基于PIN的修改- aflpin-具有Intel PIN工具的AFL。
- afl_pin_mode-通过Intel PIN实现的另一个AFL仪器。
- afl- pin-带有PINtool的AFL。
- NaFl -AFL 模糊器的 (基本核心)克隆。
- PinAFL-该工具的作者试图将AFL移植到Windows,以模糊已编译的二进制文件。 好像是为了娱乐而过夜。 该项目再也没有做过。 该存储库没有源,只有编译的二进制文件和启动指令。 我们不知道它基于哪个版本的AFL,它仅支持32位应用程序。
如您所见,有许多不同的修改,但是它们在现实生活中不是很有用。
基于Dyninst的修改afl-dyninst-美国模糊Lop + Dyninst == AFL balckbox模糊测试。 这个版本的特点是,首先使用Duninst对研究的程序(不带源代码)进行静态检测(静态二进制检测,静态二进制重写),然后对经典的AFL感到困惑,认为该程序是使用afl-构建的结果是,它允许在没有源代码的情况下以非常好的生产率工作-与本地编译相比,以前的速度是0.25倍。 与QEMU相比,它具有显着的优势:它允许检测动态链接库,而QEMU仅可以检测与库静态链接的基本可执行文件。 不幸的是,现在它仅与Linux有关。 为了获得Windows支持,需要对Dyninst本身进行更改,此操作
已完成 。
还有另一个改进了速度和某些功能(支持AARCH64和PPC体系结构)的分支。
基于DynamoRIO的修改- drAFL -AFl + DynamoRIO-在Linux上无来源时进行模糊测试。
- afl- dr-基于DynamoRIO的另一种实现,在Habr上有很好的描述。
- afl-dynamorio -vanhauser-thc的修改形式。 他是这样说的:“当普通的afl-dyninst使二进制文件崩溃且qemu模式-Q不可行时,请使用DynamoRIO运行AFL。” 它支持ARM和AARCH64。 关于生产率:DynamoRIO比Qemu慢10倍,比dyninst慢25倍,但比Pintool快10倍。
- WinAFL-最著名的AFL前叉Windows。 (DynamoRIO,也是syzygy模式)。 这个mod的出现只是时间问题,因为许多人想在Windows上尝试AFL并将其应用于没有资源的应用中。 目前,该工具正在积极改进,无论AFL的代码库相对过时(撰写本文时为2.43b),它都有助于发现一些漏洞(CVE-2016-7212,CVE-2017-0073,CVE- 2017年1月90日,CVE-2017-11816)。 Google零项目团队和MSRC漏洞与缓解小组的专家正在从事此项目,因此我们可以希望进一步发展。 开发人员没有使用编译时工具,而是使用了动态工具(基于DynamoRIO),这大大减慢了所分析软件的执行速度,但是所产生的开销(增加了一倍)与二进制模式下的经典AFL相当。 他们还称其为持续模糊模式,从而解决了进程快速启动的问题。 他们选择要模糊化的函数(通过文件中的偏移量或导出表中存在的函数的名称)并进行检测,以便可以在循环中调用它,从而在不重新启动过程的情况下启动了多个输入数据样本。 最近发表了一篇文章 ,描述了作者如何使用WinAFL在大约50天内发现了大约50个漏洞。 而且在发布之前不久,Intel PT模式已被添加到WinAFL中。 详细资料可以在这里找到。
高级读者可能会注意到,除了
Frida之外,所有流行的检测框架都进行了修改。 在
“ Chizpurfle:用于供应商服务定制的灰色盒子Android Fuzzer中
”找到了将Frida与AFL一起使用的唯一提及。 带有Frida的AFL版本非常有用,因为Frida支持多种RISC体系结构。
许多研究人员还期待Capstone,Unicorn和Keystone的创建者发布DBI Scopio框架。 基于此框架,作者已经创建了一个模糊器(Darko),并据此成功地将其用于模糊嵌入式设备。 有关更多信息,请参见
“深入挖掘:使用代码覆盖率引导的模糊测试在嵌入式系统中查找0days”。根据处理器硬件功能进行修改在支持处理器硬件功能的情况下进行AFL修改时,首先,它可以对内核代码进行模糊处理,其次,它可以在没有源代码的情况下对应用进行快速模糊处理。
当然,谈到处理器的硬件功能,我们最感兴趣的是
英特尔PT (处理器跟踪)。 从第六代处理器开始可用(大约从2015年开始)。 因此,为了能够使用下面列出的模糊器,您需要支持Intel PT的处理器。
结论
如您所见,AFL修改领域正在积极发展。 尽管如此,仍有实验和创新解决方案的空间。 您可以创建一个有用且有趣的新修改。
感谢您阅读我们,祝您万事如意!
合著者: Nikita Knyzhov
preslerPS感谢研究中心团队,没有他们,本文将是不可能的。