
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.03c
仓库: 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 许可证下的文件。
编译进模糊测试工具(fuzzing harness)的所有内容均采用 Apache 2.0 许可证,且将始终保持不变。
每个文件在其 SPDX-License-Identifier 头中声明了自己的许可证——这是你在使用该文件时必须遵循的许可证。
对于无法使用 AGPL 的组织,可选用商业许可证(通过向公益事业捐赠获得——项目及其维护者不收取任何费用)。
有关通俗易懂的概述,请参阅 LICENSING.md,详细信息请参阅下方的许可证部分。
快速入门
以下是一些帮助你入门的信息:
- 有关 AFL++ 文档的概述以及非常有用的图形化指南, 请访问 docs/README.md。
- 要开始学习教程,请前往 docs/tutorials.md。
- 有关发布版本,请参阅
Releases 标签页 和
分支。然而,最佳使用的分支是
stable或dev——取决于你的风险承受能力。同时请查看 AFL++ 重要变更列表 和 功能列表。 - 如果你想在学术工作中使用 AFL++,请查看网站上的 论文页面。
- 如需引用我们的工作,请查看引用部分。
- 如需进行比较,请使用 fuzzbench 的
aflplusplus配置,或使用afl-clang-fast并配合AFL_LLVM_CMPLOG=1。你可以在 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++ 将自动在该位置填入生成的文件名。 -
及时查阅 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...]你可以生成核心转储或直接使用 gdb 来跟进崩溃。
-
对于模糊测试的覆盖率分析,我们推荐我们的合作伙伴工具 cov-analysis(基于源码的模糊测试语料库覆盖率报告)和 fuzz-reachability(静态分析 harness 可以到达哪些函数, 以区分可操作的覆盖率差距与死代码,并生成插桩白名单)。
-
我们怎么强调都不为过——如果你想有效地进行模糊测试,请阅读 docs/fuzzing_in_depth.md 文档!
联系方式
有问题?有疑虑?有 Bug 报告?
- 可以通过以下方式联系贡献者(例如,通过创建 issue——但仅限于 AFL++ 缺陷!): https://github.com/AFLplusplus/AFLplusplus。
- 请查看我们的 FAQ 和最佳实践。
- 最佳方式:加入 Fuzzing Zulip 服务器!
分支
存在以下分支:
- release:最新发布版本
- stable:AFL++ 的稳定状态——当我们对其稳定性满意时,会不时从 dev 同步。这是默认分支。
- dev:AFL++ 的开发状态——前沿版本,你可能会遇到无法编译或存在 Bug 的检出版本。我们只接受针对 'dev' 分支的 PR(拉取请求)!
- (其他):用于开发特定功能或测试新功能或变更的实验性分支。
寻求帮助
请查看我们的带有 "help wanted" 标签的 issue 列表。 这可以成为你支持和贡献 AFL++ 的方式——扩展它以实现一些酷炫的功能。如果你有其他想法——只需创建一个 issue 并提出建议!
对于所有想要贡献(并发送拉取请求)的人,请在提交前阅读我们的 贡献指南。
特别感谢
如果没有我们贡献者的反馈、Bug 报告或补丁,对原始 AFL 和 AFL++ 的许多改进是不可能实现的。
谢谢!(对于发送拉取请求的人——请将你自己添加到这个列表中 :-)