
AFLplusplus v5.03c
AFL++ 是一款最先进的模糊测试工具,在基准测试中排名第一。它最初基于 AFL。如今它配备了 qemu 5.1、无冲突覆盖率、增强的 laf-intel 与 redqueen、AFLfast++ 功耗调度、MOpt 变异器、unicorn_mode 以及更多功能!
American Fuzzy Lop plus plus (AFL++)
发布版本:5.03c
GitHub 版本:5.04a
仓库: https://github.com/AFLplusplus/AFLplusplus
AFL++ 由以下人员维护:
- Marc "van Hauser" Heuse [email protected]
- Dominik Maier [email protected]
- Andrea Fioraldi [email protected]
- Heiko "hexcoder-" Eissfeldt [email protected]
- frida_mode 由 @Worksbutnottested 维护
最初由 Michal "lcamtuf" Zalewski 开发。
AFL++ 是 Google AFL 的卓越分支——速度更快,变异更多且更优, 插桩更多且更好,支持自定义模块,等等。
AFL++ 采用 AGPL-3.0-or-later 许可,同时也包含采用 Apache-2.0 许可的文件。
所有编译进模糊测试框架的内容现在及将来都保持 Apache 2.0 许可。
每个文件都在其 SPDX-License-Identifier 头中声明了自己的许可——这就是
你必须为该文件遵循的许可。
对于无法使用 AGPL 的组织,可选择获取商业许可(通过向公益事业捐款获得——本项目及其
维护者不收取任何费用)。
请参阅 LICENSING.md 了解通俗易懂的概述,以及
下方的许可章节了解详情。
快速入门
以下是一些帮助你入门的信息:
- 如需了解 AFL++ 文档概览以及一份非常实用的图形化指南, 请访问 docs/README.md。
- 如需通过教程入门,请前往 docs/tutorials.md。
- 关于发布版本,请参阅
Releases 标签页 和
分支。不过,最好使用的分支是
stable或dev——取决于你的风险偏好。另外也请查看 AFL++ 中的重要变更列表以及 功能特性列表。 - 如果你想将 AFL++ 用于学术工作,请查看网站上的 论文页面。
- 如需引用我们的工作,请参阅引用章节。
- 如需进行比较,请使用 fuzzbench 的
aflplusplus配置,或使用 带AFL_LLVM_CMPLOG=1的afl-clang-fast。你可以在 Google 的 fuzzbench 上找到aflplusplus的默认配置。
构建和安装 AFL++
为了能轻松获取已编译好全部内容的 AFL++,可直接从 Docker Hub 拉取镜像(同时提供 x86_64 和 arm64 版本):
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
当向 stable 分支推送时,此镜像会自动发布
(参见分支)。如果你使用上述命令,你将在容器的 /src 中找到
目标源代码。
注意:你也可以拉取 aflplusplus/aflplusplus:dev,这是 AFL++ 最新的
开发状态。
要自行构建 AFL++——我们推荐这样做——请继续阅读 docs/INSTALL.md。
快速开始:使用 AFL++ 进行模糊测试
注意:在开始之前,请阅读 模糊测试的常识性风险。
这是针对源代码可用的目标进行模糊测试的快速开始指南。要 详细了解该过程,请参阅 docs/fuzzing_in_depth.md。
要了解如何对其他类型的目标进行模糊测试,请参阅:
- 仅二进制目标: docs/fuzzing_binary-only_targets.md
- 网络服务: docs/best_practices.md#fuzzing-a-network-service
- GUI 程序: docs/best_practices.md#fuzzing-a-gui-program
分步快速开始:
-
使用
afl-cc编译要进行模糊测试的程序或库。一种常见的方式 是:CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared make clean all -
获取一个虽小但对程序有意义的有效输入文件。当对冗长语法(SQL、HTTP 等)进行模糊测试时,还要按照 dictionaries/README.md 中所述创建一个字典。
-
如果程序从 stdin 读取输入,则按如下方式运行
afl-fuzz:./afl-fuzz -i seeds_dir -o output_dir -- \ /path/to/tested/program [...program's cmdline...]要添加字典,请在 afl-fuzz 中添加
-x /path/to/dictionary.txt。如果程序从文件读取输入,你可以在程序的命令行中放入
@@;AFL++ 会为你自动生成一个文件名并填入其中。 -
如果 fuzzer UI 中出现任何红色显示的内容,请及时查阅 docs/afl-fuzz_approach.md#understanding-the-status-screen 进行调查。
-
你会在
-o output_dir目录下的crashes/和hangs/子目录中找到发现的崩溃和挂起。你可以通过将崩溃输入提供给目标程序来重放它们,例如,如果你的目标程序使用 stdin:cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]你可以生成 cores 或直接使用 gdb 来跟进崩溃。
-
对于模糊测试的覆盖率分析,我们推荐我们的合作伙伴工具 cov-analysis(基于源码的 模糊测试语料库覆盖率报告)和 fuzz-reachability(静态 分析测试框架可以到达哪些函数,以区分可操作的覆盖率 缺口与死代码,并生成插桩允许列表)
-
我们再怎么强调也不为过——如果你想有效地进行模糊测试,请阅读 docs/fuzzing_in_depth.md 文档!
联系方式
有问题?有疑虑?有缺陷报告?
- 可以通过以下方式联系贡献者(例如,创建 issue——但仅限 AFL++ 缺陷!): https://github.com/AFLplusplus/AFLplusplus。
- 请查看我们的 FAQ 和 最佳实践。
- 最佳方式:加入 Fuzzing Zulip 服务器!
分支
存在以下分支:
- release:最新 发布版本
- stable:AFL++ 的稳定 状态——当我们对其稳定性满意时,会不时从 dev 同步。这是默认分支。
- dev:AFL++ 的开发 状态——前沿版本,你可能会遇到无法编译或存在缺陷的检出。 我们只接受针对 'dev' 分支的 PR(拉取请求)!
- (任何其他):用于开发特定功能或测试新 功能或变更的实验性分支。
寻求帮助
查看我们的 带有 "help wanted" 标签的 issue 列表。 这可以成为你支持和贡献 AFL++ 的方式——扩展它来做 一些很酷的事情。如果你有其他想法——只需创建一个 issue 并提出!
对于所有想要贡献(并发送拉取请求)的人,请在提交前阅读我们的 贡献指南。
特别感谢
对原始 AFL 和 AFL++ 的许多改进,如果没有我们的贡献者的反馈、缺陷报告或补丁, 是不可能实现的。
谢谢! (对于发送拉取请求的人——请将自己添加到这个列表中 :-)