AFLplusplus/LibAFL
GitHub: AFLplusplus/LibAFL
LibAFL 是一款用 Rust 编写的模块化模糊测试库,提供可复用的 Fuzzer 组件,支持多平台、多核心扩展,让用户能像搭积木一样构建定制化的模糊测试器。
Stars: 2523 | Forks: 463
# `LibAFL`,模糊测试库
高级 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.0 或 MIT license 之下。
除非您明确声明,否则根据 Apache-2.0 许可证的定义,您有意提交以包含在此 crate 中的任何贡献均应按上述方式双重许可,不附加任何额外条款或条件。
除非您明确声明,否则根据 Apache-2.0 许可证的定义,您有意提交以包含在此 crate 中的任何贡献均应按上述方式双重许可,不附加任何额外条款或条件。
标签:Android, ASN解析, AST模糊测试, Docker支持, DSL, Frida, Fuzzing, LibAFL, LLMP, no_std, Rust, SanitizerCoverage, TLS抓取, 二进制分析, 云安全运维, 代码插桩, 分布式计算, 可视化界面, 多核扩展, 安全测试, 嵌入式安全, 开源安全工具, 异常处理, 性能优化, 攻击性安全, 检测绕过, 模糊测试框架, 白盒测试, 编译器封装, 网络流量审计, 自定义Fuzzer, 身份验证强制, 软件安全, 逆向工程平台, 通知系统, 黑盒测试