返回更新列表
新发布Sep 4, 2026

AFLplusplus v5.03c

模糊测试器 afl++ 是带有社区补丁的 afl、qemu 5.1 升级、无冲突覆盖率、增强的 laf-intel 和 redqueen、AFLfast++ 的能量调度、MOpt 变异器、unicorn_mode 以及更多功能!

分享

American Fuzzy Lop plus plus (AFL++)

AFL++ logo

发布版本:5.03c

GitHub 版本:5.03c

仓库: https://github.com/AFLplusplus/AFLplusplus

AFL++ 由以下人员维护:

最初由 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 标签页分支。然而,最佳使用的分支是 stabledev——取决于你的风险承受能力。同时请查看 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

要了解对其他类型目标进行模糊测试,请参阅:

分步快速入门:

  1. 使用 afl-cc 编译要模糊测试的程序或库。常见做法是:

    CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared
    make clean all
    
  2. 获取一个对程序有意义的小型但有效的输入文件。当 模糊测试冗长语法(SQL、HTTP 等)时,也请按照 dictionaries/README.md 中的描述创建字典。

  3. 如果程序从 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++ 将自动在该位置填入生成的文件名。

  4. 及时查阅 docs/afl-fuzz_approach.md#understanding-the-status-screen 来调查模糊测试器界面中以红色显示的任何内容。

  5. 你将在 -o output_dir 目录下的 crashes/hangs/ 子目录中找到发现的崩溃和挂起。你可以通过将崩溃输入反馈给目标来重放它们, 例如,如果你的目标使用 stdin:

    cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]
    

    你可以生成核心转储或直接使用 gdb 来跟进崩溃。

  6. 对于模糊测试的覆盖率分析,我们推荐我们的合作伙伴工具 cov-analysis(基于源码的模糊测试语料库覆盖率报告)和 fuzz-reachability(静态分析 harness 可以到达哪些函数, 以区分可操作的覆盖率差距与死代码,并生成插桩白名单)。

  7. 我们怎么强调都不为过——如果你想有效地进行模糊测试,请阅读 docs/fuzzing_in_depth.md 文档!

联系方式

有问题?有疑虑?有 Bug 报告?

分支

存在以下分支:

  • release:最新发布版本
  • stable:AFL++ 的稳定状态——当我们对其稳定性满意时,会不时从 dev 同步。这是默认分支。
  • dev:AFL++ 的开发状态——前沿版本,你可能会遇到无法编译或存在 Bug 的检出版本。我们只接受针对 'dev' 分支的 PR(拉取请求)!
  • (其他):用于开发特定功能或测试新功能或变更的实验性分支。

寻求帮助

请查看我们的带有 "help wanted" 标签的 issue 列表。 这可以成为你支持和贡献 AFL++ 的方式——扩展它以实现一些酷炫的功能。如果你有其他想法——只需创建一个 issue 并提出建议!

对于所有想要贡献(并发送拉取请求)的人,请在提交前阅读我们的 贡献指南

特别感谢

如果没有我们贡献者的反馈、Bug 报告或补丁,对原始 AFL 和 AFL++ 的许多改进是不可能实现的。

谢谢!(对于发送拉取请求的人——请将你自己添加到这个列表中 :-)

贡献者列表
  Jann Horn                             Hanno Boeck
  Felix Groebert                        Jakub Wilk
  Richard W. M. Jones                   Alexander Cherepanov
  Tom Ritter                            Hovik Manucharyan
  Sebastian Roschke                     Eberhard Mattes
  Padraig Brady                         Ben Laurie
  @dronesec                             Luca Barbato
  Tobias Ospelt                         Thomas Jarosch
  Martin Carpenter                      Mudge Zatko
  Joe Zbiciak                           Ryan Govostes
  Michael Rash                          William Robinet
  Jonathan Gray                         Filipe Cabecinhas
  Nico Weber                            Jodie Cunningham
  Andrew Griffiths                      Parker Thompson
  Jonathan Neuschaefer                  Tyler Nighswander
  Ben Nagy                              Samir Aguiar
  Aidan Thornton                        Aleksandar Nikolich
  Sam Hakim                             Laszlo Szekeres
  David A. Wheeler                      Turo Lamminen
  Andreas Stieger                       Richard Godbee
  Louis Dassy                           teor2345
  Alex Moneger                          Dmitry Vyukov
  Keegan McAllister                     Kostya Serebryany
  Richo Healey                          Martijn Bogaard
  rc0r                                  Jonathan Foote
  Christian Holler                      Dominique Pelle
  Jacek Wielemborek                     Leo Barnes
  Jeremy Barnes                         Jeff Trull
  Guillaume Endignoux                   ilovezfs
  Daniel Godas-Lopez                    Franjo Ivancic
  Austin Seipp                          Daniel Komaromy
  Daniel Binderman                      Jonathan Metzman
  Vegard Nossum                         Jan Kneschke
  Kurt Roeckx                           Marcel Boehme
  Van-Thuan Pham                        Abhik Roychoudhury
  Joshua J. Drake                       Toby Hutton
  Rene Freingruber                      Sergey Davidoff
  Sami Liedes                           Craig Young
  Andrzej Jackowski                     Daniel Hodson
  Nathan Voss                           Dominik Maier
  Andrea Biondo                         Vincent Le Garrec
  Khaled Yakdan                         Kuang-che Wu
  Josephine Calliotte                   Konrad Welc
  Thomas Rooijakkers                    David Carlier
  Ruben ten Hove                        Joey Jiao
  fuzzah                                @intrigus-lgtm
  Yaakov Saxon                          Sergej Schumilo
  Ziqiao Kong                           Ryan Berger
  Sangjun Park                          Scott Guest
  Fabian Keil                           @Jay-1409
  Gergely Nagy

引用

如果你在科学研究中使用 AFL++,请考虑引用 我们在 WOOT'20 上发表的 论文

Andrea Fioraldi, Dominik Maier, Heiko Eißfeldt, and Marc Heuse. “AFL++: Combining incremental steps of fuzzing research”. In 14th USENIX Workshop on Offensive Technologies (WOOT 20). USENIX Association, Aug. 2020.
BibTeX
@inproceedings {AFLplusplus-Woot20,
author = {Andrea Fioraldi and Dominik Maier and Heiko Ei{\ss}feldt and Marc Heuse},
title = {{AFL++}: Combining Incremental Steps of Fuzzing Research},
booktitle = {14th {USENIX} Workshop on Offensive Technologies ({WOOT} 20)},
year = {2020},
publisher = {{USENIX} Association},
month = aug,
}

zread Ask DeepWiki

许可证

AFL++ 采用 GNU AGPL-3.0-or-later 许可证。简而言之,你可以通过三种方式使用 AFL++:

  1. 免费,基于 AGPL-3.0-or-later:默认方式。使用、修改和分享 AFL++;如果你将修改版本作为网络服务运行,AGPL 要求你向用户提供相应的源代码。全文:LICENSE

  2. 按文件,遵循其文件头中的许可证:项目包含采用 SPDX-License-Identifier: AGPL-3.0-or-laterSPDX-License-Identifier: Apache-2.0 的文件。请始终检查你所使用文件的文件头并遵守其中声明的许可证; 标记为 Apache-2.0 的文件可在 Apache-2.0 License 下单独重用。(少数 捆绑的第三方文件带有其他许可证,例如 GCC 插件采用 GPL-3.0-or-later,LLVM SanitizerCoverage passes 采用 Apache-2.0-WITH-LLVM-exception——每个文件都通过其自身的 SPDX 标识符标记。)请注意, 组合后的 afl-fuzz 二进制文件包含 AGPL 文件,因此整个程序属于 AGPL。

  3. 商业许可证可选,适用于无法或不想遵守 AGPL 的组织。 项目不收取任何费用。 相反,你需要向 EFFCCC 捐赠 20,000 欧元(€20,000),并将证明发送至 [email protected]; 你的许可证自捐赠之日起一年内有效(可通过再次捐赠续期)。 完整条款:LICENSE.COMMERCIAL

捆绑的第三方组件(例如 xxHash、t1ha、libFuzzer、子模块)保留其自身的许可证。 有关完整的通俗易懂的概述,请参阅 LICENSING.md

分类