**american fuzzy lop** (**AFL**) 是一个自由的模糊测试工具，采用遗传算法以有效地提高测试用例的代码覆盖率。目前为止，它帮助检测了数十个主要自由软件项目中的重大程序错误，包括X.Org Server、PHP、OpenSSL、 pngcrush、bash、Firefox、BIND、 Qt 和SQLite。

american fuzzy lop的源代码发布在GitHub上。american fuzzy lop得名于美国垂耳兔（英语：）。

典型用法
----

AFL要求用户提供一个运行测试应用程序的示例命令和至少一个示例输入文件。例如，在对音频播放器进行测试时，可以指示AFL用它打开一个简短的声音文件。然后，模糊测试器尝试实际执行指定的命令，如果成功，它会尝试将输入文件减少到触发相同行为的最小文件。

在初始阶段之后，AFL通过对输入文件进行各种修改来开始实际的模糊测试过程。当被测程序崩溃或假死机时，表明发现了一个新错误，可能是一个安全漏洞。此时修改后的输入文件被保存以供用户进一步检查。

为了最大限度地提高模糊测试性能，建议使用american fuzzy lop进行灰盒测试，即在一个实用程序的帮助下编译被测程序源代码，该实用程序在编译被测程序时插入跟踪控制流的辅助函数（即"插桩"）来instrument（英语：）代码。这允许模糊测试器检测目标的行为何时响应输入而改变。在灰盒测试不可能的情况下，也支持黑盒测试。

特性
--

### 模糊引擎

AFL的logo通过模糊测试输入拼接为一个动画产生。
american fuzzy lop的模糊测试引擎使用几个算法尽可能触发被测程序的异常行为，如位翻转或将输入的整数数据修改为可能引发异常的边界值。 除此之外，AFL可以根据示例关键字生成测试用例，这有助于对使用基于文本语法的程序进行模糊测试，例如 SQLite。 生成的测试用例执行程序代码的不同部分，AFL记录会引起异常的输入数据，之后可以将这些数据输入到更专业的诊断程序进行进一步分析。进行模糊测试时，假死机可以通过设定的定时器超时来检测，而崩溃通过结束程序时的信号处理程序检测。

使用AFL进行模糊测试时，输入的测试用例可以通过标准输入或作为进程命令行中指定的输入文件提供给测试程序。目前不支持对通过网络接受输入数据的网络应用程序进行模糊测试，但在某些情况下有可行的解决方案。

### 性能

american fuzzy lop面临的一大挑战是每秒对几百个进程的spawn（英语：）。除了从头开始spawn每个进程的原始引擎，american fuzzy lop提供高度依赖`fork`系统调用的默认引擎。 可以通过利用LLVM延迟分叉服务器模式或类似的持久模式进一步加快速度，但这是以必须修改测试程序为代价的。 另外，american fuzzy lop支持通过网络对同一个程序进行模糊测试。

### 用户界面

american fuzzy lop拥有彩色的命令行界面，实时显示模糊测试过程和统计信息，可以通过命令行界面或者环境变量修改配置，也可以从机器可读文件格式中读取运行时统计信息。

### 实用程序

除了提供`afl-fuzz`用于模糊测试，american Fuzzy lop还包含用于监控模糊测试过程的实用程序。除此之外，`afl-cmin`和`afl-tmin`可以用于最小化测试用例和语料库，当其他模糊测试器也需要使用`afl-fuzz`生成的测试用例时尤其实用。

AFL++
-----

由于Google2017年9月以后对AFL的上游开发相对停滞，故诞生了一个社区维护的AFL分叉**AFL++** (**AFLplusplus**) 。它包含了一些新特性和性能提升。

Google推出的为开源软件提供免费模糊测试服务的OSS-Fuzz计划,也于2021年1月将AFL选项替换为了AFL++。

参考资料
----

1. ↑ . 2020年6月30日  [2020年7月1日].
2. ↑ . x.org.  [2022-01-11]. （原始内容存档于2021-12-06）.
3. ↑ . nist.gov.  [2022-01-11]. （原始内容存档于2016-04-16）.
4. ↑ . nist.gov.  [2022-01-11]. （原始内容存档于2016-03-04）.
5. ↑ . nist.gov.  [2022-01-11]. （原始内容存档于2016-03-04）.
6. ↑ . mitre.org.  [2022-01-11]. （原始内容存档于2015-05-23）.
7. ↑ . mitre.org.  [2022-01-11]. （原始内容存档于2022-01-11）.
8. ↑ . Fastly.  [2022-01-11]. （原始内容存档于2016-01-11）.
9. ↑ . mitre.org.  [2022-01-11]. （原始内容存档于2022-04-23）.
10. ↑ . qt-project.org.  [2022-01-11]. （原始内容存档于2021-12-06）.
11. ↑ . sqlite.org.  [2022-01-11]. （原始内容存档于2022-04-16）.
12. ↑  Zalewski, Michał.. afl-users | Google Groups. 2015-02-27  [2019-07-25].
13. ↑ . lcamtuf.blogspot.com.
14. ↑ . lcamtuf.blogspot.com.
15. ↑  Technion.. lolware.net.  [2022-01-11]. （原始内容存档于2020-11-08）.
16. ↑ . lcamtuf.blogspot.com.
17. ↑ . lcamtuf's blog. 11 June 2015.
18. ↑ . 2023年6月12日  [2023年6月26日].
19. ↑  Fioraldi, Andrea; Maier, Dominik; Eißfeldt, Heiko; Heuse, Marc.. 14th USENIX Workshop on Offensive Technologies (WOOT 20). August 2020  [2022-01-11]. （原始内容存档于2022-03-21）.
20. ↑ . AFLplusplus.  [2022-01-11]. （原始内容存档于2022-03-14） （英语）.
21. ↑  metzman, jonathan.. GitHub.  [2022-01-11]. （原始内容存档于2022-01-12） （英语）.

拓展阅读
----

* S. K. Cha, M. Woo, D. Brumley, "Program-Adaptive Mutational Fuzzing," （页面存档备份，存于） in Proceedings of the 36th IEEE Symposium on Security and Privacy, 2015. (to appear)
* Multi-System and Internet Security Cookbook, Hors-Serie No. 11 "Outils de sécurité", p. 36, "American Fuzzy Lop", Kevin Denis, June 2015.  （页面存档备份，存于）
* "Fuzz and strings (lwn.net)"  （页面存档备份，存于）
* "Fuzzing (on) FreeBSD - (Mostly) automated bug discovery with security/afl"  （页面存档备份，存于） - a presentation at FOSDEM
* "Testing with two failure seeking missiles: fuzzing and property based testing"  （页面存档备份，存于） - a presentation at EuroPython 2015.
* "Stagefright: Scary Code in the Heart of Android"  （页面存档备份，存于） a presentation at Black Hat Briefings
* "The Fuzzing Project" （页面存档备份，存于）
* "Grammatical Inference and Language Frameworks for LANGSEC" （页面存档备份，存于）
* "Fuzzing Code with AFL", Peter Gutmann, ;login, Vol. 41, No. 2, Summer 2016,  （页面存档备份，存于）
* "AFL++" （页面存档备份，存于）, an advanced fork of AFL