AFLplusplus/LibAFL

GitHub: AFLplusplus/LibAFL

LibAFL 是一款用 Rust 编写的模块化模糊测试库,提供可复用的 Fuzzer 组件,支持多平台、多核心扩展,让用户能像搭积木一样构建定制化的模糊测试器。

Stars: 2523 | Forks: 463

# `LibAFL`,模糊测试库 LibAFL logo 高级 Fuzzing 库 - 使用 Rust 拼接您自己的 Fuzzer 并扩展其功能。 `LibAFL` 是一组用 Rust 编写的可重用 Fuzzer 组件,它为您提供了现成 Fuzzer 的诸多优势,同时保持完全可定制。 目前的一些主要功能包括: - `快速`:我们在编译时尽可能处理所有事情,将运行时开销降至最低。用户在手机上的 frida-mode 下达到 120k execs/sec(使用所有核心)。 - `可扩展`:`Low Level Message Passing`,简称 `LLMP`,允许 `LibAFL` 在核心间几乎线性扩展,并通过 TCP 扩展到多台机器。 - `可适应`:您可以替换 `LibAFL` 的每个部分。例如,`BytesInput` 只是输入的一种潜在形式: 请随意添加基于 AST 的输入以进行结构化 Fuzzing 等等。 - `多平台`:`LibAFL` 运行在 *Windows*、*macOS*、*iOS*、*Linux* 和 *Android* 等平台上。`LibAFL` 可以在 `no_std` 模式下构建,以便将 `LibAFL` 注入到嵌入式设备和 Hypervisor 等特殊目标中。 - `自带目标`:我们支持二进制模式,如 Frida-Mode,以及用于基于源码插桩的多次编译遍历。当然,添加自定义插桩后端也很容易。 ## 核心概念 `LibAFL` 快速、跨平台、兼容 `no_std`,并可在核心和机器间扩展。它提供了一个主 crate,为自定义 Fuzzer 提供构建块 [libafl](./crates/libafl),一个包含用于目标插桩的通用代码的库 [libafl_targets](./crates/libafl_targets),以及一个提供封装编译器工具的库 [libafl_cc](./crates/libafl_cc)。它提供了与流行插桩框架的集成。目前支持的后端有: - `SanitizerCoverage`,位于 [libafl_targets](./crates/libafl_targets) - `Frida`,位于 [libafl_frida](./crates/libafl_frida) - `QEMU` 用户模式和系统模式,包括用于模拟的钩子,位于 [libafl_qemu](./crates/libafl_qemu) - `TinyInst`,位于 [libafl_tinyinst](./crates/libafl_tinyinst),由 [elbiazo](https://github.com/elbiazo) 开发 ## 构建和安装 #### 安装依赖项 - **Rust 开发语言** - 我们强烈建议*不要*使用例如您的 Linux 发行版包,因为它很可能已经过时。因此建议直接安装 Rust,说明可以在[这里](https://www.rust-lang.org/tools/install)找到。 - 定义了最低支持的 Rust 版本。您随时可以在 LibAFL 的 [Cargo.toml](https://github.com/AFLplusplus/LibAFL/blob/main/crates/libafl/Cargo.toml) 中查看当前要求的版本: 如果您安装的 Rust 版本早于 Cargo.toml 中列出的版本,请更新到最新的稳定工具链: rustup update stable - **LLVM 工具** - 需要 LLVM 工具(包括 clang, clang++)(版本需高于 LLVM 15.0.0 且最高至 LLVM 18.1.3)。如果您使用的是 Debian/Ubuntu,同样,我们强烈建议您从[这里](https://apt.llvm.org/)安装该包。 - (在 `libafl_concolic` 中,我们只支持高于 18 的 LLVM 版本) - Just: - 我们使用 [just](https://github.com/casey/just) 来构建 `fuzzers/` 目录中的 Fuzzer。您可以在 [Just 程序员手册](https://just.systems/man/en/packages.html)中找到在您的环境中安装它的说明。 #### 使用以下命令克隆 `LibAFL` 仓库 ``` git clone https://github.com/AFLplusplus/LibAFL ``` #### 使用以下命令构建库 ``` cargo build --release ``` #### 使用以下命令构建 API 文档 ``` cargo doc ``` #### 使用以下命令浏览 `LibAFL` 书籍(编写中!)(需要 [mdbook](https://rust-lang.github.io/mdBook/index.html)) ``` cd docs && mdbook serve ``` ## 入门指南 我们将所有示例 Fuzzer 收集在 [`./fuzzers`](./fuzzers/) 中。 请务必阅读它们的文档(和源码),这是*入门的自然方式!* ``` just run ``` 只要 Fuzzer 目录中包含 `Justfile` 文件,您就可以使用以下命令运行每个示例 Fuzzer。测试最完善的 Fuzzer 是 [`./fuzzers/inprocess/libfuzzer_libpng`](./fuzzers/inprocess/libfuzzer_libpng),这是一个使用 `LibAFL` 针对 libpng Harness 的类 libfuzzer 多核 Fuzzer。 ### 资源 - [安装指南](./docs/src/getting_started/setup.md) - [在线 API 文档](https://docs.rs/libafl/) - `LibAFL` 书籍(编写中),[在线版](https://aflplus.plus/libafl-book)或[仓库版](./docs/src/) - 我们的研究[论文](https://www.s3.eurecom.fr/docs/ccs22_fioraldi.pdf) - 我们在 RC3 的[演讲](http://www.youtube.com/watch?v=3RWkT1Q5IV0 "Fuzzers Like LEGO"),解释了核心概念 - 我们在 Fuzzcon Europe 的[演讲](https://www.youtube.com/watch?v=PWB8GIhFAaI "LibAFL: The Advanced Fuzzing Library"),包含关于如何构建一些示例 Fuzzer 的(有点过时但不太严重的)分步讨论 - [epi](https://github.com/epi052) 的 Fuzzing101 [解决方案](https://github.com/epi052/fuzzing-101-solutions) & [博客文章](https://epi052.gitlab.io/notes-to-self/blog/2021-11-01-fuzzing-101-with-libafl/)系列 - 关于二进制 Fuzzing 库 `libaf_qemu` 的博文,[Hacking TMNF - Fuzzing the game server](https://blog.bricked.tech/posts/tmnf/part1/),作者 [RickdeJager](https://github.com/RickdeJager)。 - [LibAFL 入门工作坊](https://www.atredis.com/blog/2023/12/4/a-libafl-introductory-workshop),作者 [Jordan Whitehead](https://github.com/jordan9001) ## 贡献者 `LibAFL` 由以下人员编写和维护 - [Andrea Fioraldi](https://twitter.com/andreafioraldi) - [Dominik Maier](https://bsky.app/profile/dmnk.bsky.social) - [s1341](https://twitter.com/srubenst1341) - [Dongjia Zhang](https://github.com/tokatoka) - [Addison Crump](https://github.com/addisoncrump) - [Romain Malmain](https://github.com/rmalmain) ## 调试 您的 Fuzzer 未按预期工作?尝试阅读 [DEBUGGING.md](./docs/src/DEBUGGING.md) 以了解如何调试您的问题。 ## 引用 如果您在学术工作中使用 `LibAFL`,请引用以下论文: ``` @inproceedings{libafl, author = {Andrea Fioraldi and Dominik Maier and Dongjia Zhang and Davide Balzarotti}, title = {{LibAFL: A Framework to Build Modular and Reusable Fuzzers}}, booktitle = {Proceedings of the 29th ACM conference on Computer and communications security (CCS)}, series = {CCS '22}, year = {2022}, month = {November}, location = {Los Angeles, U.S.A.}, publisher = {ACM}, } ``` ## 许可证 根据您的选择,许可于 Apache License, Version 2.0MIT license 之下。
除非您明确声明,否则根据 Apache-2.0 许可证的定义,您有意提交以包含在此 crate 中的任何贡献均应按上述方式双重许可,不附加任何额外条款或条件。
标签:Android, ASN解析, AST模糊测试, Docker支持, DSL, Frida, Fuzzing, LibAFL, LLMP, no_std, Rust, SanitizerCoverage, TLS抓取, 二进制分析, 云安全运维, 代码插桩, 分布式计算, 可视化界面, 多核扩展, 安全测试, 嵌入式安全, 开源安全工具, 异常处理, 性能优化, 攻击性安全, 检测绕过, 模糊测试框架, 白盒测试, 编译器封装, 网络流量审计, 自定义Fuzzer, 身份验证强制, 软件安全, 逆向工程平台, 通知系统, 黑盒测试