american fuzzy lop

american fuzzy lop (AFL) 是一个自由的模糊测试工具,采用遗传算法以有效地提高测试用例代码覆盖率。目前为止,它帮助检测了数十个主要自由软件项目中的重大程序错误,包括X.Org Server[2]PHP[3]OpenSSL[4][5] pngcrushbash[6]Firefox[7]BIND[8][9] Qt[10]SQLite[11]

american fuzzy lop
使用american fuzzy lop进行模糊测试
使用american fuzzy lop进行模糊测试
开发者Michał Zalewski
首次发布2013年11月12日,​11年前​(2013-11-12
当前版本
  • 2.57b(2020年6月30日)[1]
编辑维基数据链接
源代码库 编辑维基数据链接
编程语言C汇编语言
操作系统跨平台
类型模糊测试器
许可协议Apache License 2.0
网站lcamtuf.coredump.cx/afl/

american fuzzy lop的源代码发布在GitHub上。american fuzzy lop得名于美国垂耳兔英语American Fuzzy Lop

典型用法

编辑

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

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

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

特性

编辑

模糊引擎

编辑
 
AFL的logo通过模糊测试输入拼接为一个动画产生。[12]

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

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

性能

编辑

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

用户界面

编辑

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

实用程序

编辑

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

AFL++
首次发布2.52c / 2019年6月5日,​5年前​(2019-06-05
当前版本
  • 4.21c(2024年6月9日;稳定版本)[18]
 
源代码库https://github.com/AFLplusplus/AFLplusplus/
许可协议  
网站lcamtuf.coredump.cx/afl/  

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

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

参考资料

编辑
  1. ^ Release 2.57b. 2020年6月30日 [2020年7月1日]. 
  2. ^ Advisory-2015-03-17. x.org. [2022-01-11]. (原始内容存档于2021-12-06). 
  3. ^ NVD - Detail. nist.gov. [2022-01-11]. (原始内容存档于2016-04-16). 
  4. ^ NVD - Detail. nist.gov. [2022-01-11]. (原始内容存档于2016-03-04). 
  5. ^ NVD - Detail. nist.gov. [2022-01-11]. (原始内容存档于2016-03-04). 
  6. ^ CVE - CVE-2014-6278. mitre.org. [2022-01-11]. (原始内容存档于2015-05-23). 
  7. ^ CVE - CVE-2014-8637. mitre.org. [2022-01-11]. (原始内容存档于2022-01-11). 
  8. ^ How to fuzz a server with American Fuzzy Lop. Fastly. [2022-01-11]. (原始内容存档于2016-01-11). 
  9. ^ CVE - CVE-2015-5477. mitre.org. [2022-01-11]. (原始内容存档于2022-04-23). 
  10. ^ [Announce] Qt Project Security Advisory - Multiple Vulnerabilities in Qt Image Format Handling. qt-project.org. [2022-01-11]. (原始内容存档于2021-12-06). 
  11. ^ How SQLite Is Tested # 4.1.1. SQL Fuzz Using The American Fuzzy Lop Fuzzer. sqlite.org. [2022-01-11]. (原始内容存档于2022-04-16). 
  12. ^ Zalewski, Michał. Logo for afl-fuzz. afl-users | Google Groups. 2015-02-27 [2019-07-25]. 
  13. ^ Binary fuzzing strategies: what works, what doesn't. lcamtuf.blogspot.com. 
  14. ^ Finding bugs in SQLite, the easy way. lcamtuf.blogspot.com. 
  15. ^ Technion. Fuzzing nginx - Hunting vulnerabilities with afl-fuzz. lolware.net. [2022-01-11]. (原始内容存档于2020-11-08). 
  16. ^ Fuzzing random programs without execve(). lcamtuf.blogspot.com. 
  17. ^ New in AFL: persistent mode. lcamtuf's blog. 11 June 2015. 
  18. ^ Release 4.21c. 2024年6月9日 [2024年6月20日]. 
  19. ^ Fioraldi, Andrea; Maier, Dominik; Eißfeldt, Heiko; Heuse, Marc. AFL++: Combining incremental steps of fuzzing research. 14th USENIX Workshop on Offensive Technologies (WOOT 20). August 2020 [2022-01-11]. (原始内容存档于2022-03-21). 
  20. ^ The AFL++ fuzzing framework. AFLplusplus. [2022-01-11]. (原始内容存档于2022-03-14) (英语). 
  21. ^ metzman, jonathan. [afl++] Use AFL++ instead of AFL for fuzzing. by jonathanmetzman · Pull Request #5046 · google/oss-fuzz. GitHub. [2022-01-11]. (原始内容存档于2022-01-12) (英语). 

拓展阅读

编辑