rust-fuzz/afl.rs

GitHub: rust-fuzz/afl.rs

基于 AFLplusplus 的 Rust 模糊测试库,帮助开发者通过伪随机输入发现 Rust 代码中的安全漏洞和稳定性问题。

Stars: 1820 | Forks: 115

afl.rs logo
afl.rs

使用 AFLplusplusRust 代码进行模糊测试

## 它是什么? [Fuzz testing][] 是一种软件测试技术,通过向软件提供伪随机数据作为输入来发现安全性和稳定性问题。[AFLplusplus][] 是一款流行、高效且现代的模糊测试工具,基于 [AFL][american-fuzzy-lop] 开发。这个库(afl.rs)允许你在使用 [Rust 编程语言][rust] 编写的代码上运行 AFLplusplus。 ## 文档 文档可在 [Rust 模糊测试指南](https://rust-fuzz.github.io/book/afl.html) 中找到。 ## 它看起来是什么样子的? Screen recording of afl 在 Rust 代码上运行 AFL 的屏幕录制。 ## 提示 在开始模糊测试之前,你应该重新配置系统以获得最佳性能和更好的崩溃检测。可以通过 `cargo afl system-config` 来完成此操作。 但这个子命令需要 root 权限,因此它会在内部使用 sudo。所以,你可能需要输入你的密码。 默认情况下,AFL++ 的 [CMPLOG](https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.cmplog.md) 功能会被激活,这有助于实现良好的代码覆盖率。 然而,在超过两个实例上激活 CMPLOG 并没有好处。因此,如果在你的模糊测试目标上运行多个 AFL++ 实例,你可以通过指定命令行参数 '-c -' 来禁用 CMPLOG。 要完全在构建的目标中省略 CMPLOG 插桩,请在构建时将环境变量 `AFLRS_NO_CMPLOG` 设置为 `1`。 这篇[文档](https://github.com/AFLplusplus/AFLplusplus/blob/stable/docs/fuzzing_in_depth.md) 将帮助你熟悉 AFL++ 的功能,从而协助你运行一次成功的模糊测试活动。 默认情况下,使用 `cargo-afl` 进行构建时会设置 `fuzzing` 配置。如果你想阻止这种行为,只需在构建时将环境变量 `AFL_NO_CFG_FUZZING` 设置为 `1`。 ## 可重置状态 (`fuzz_with_reset!`) AFL++ 的持久模式会在循环中运行模糊测试目标。静态初始化(例如 `OnceLock`、`lazy_static`、`once_cell::Lazy`)只会在第一次迭代时执行——随后的迭代会跳过这些代码路径,从而导致 AFL 的稳定性指标下降。 使用 `fuzz_with_reset!` 来提供一个重置闭包,在每次迭代后清除静态状态。 注意:该示例使用了 `Mutex>` 而不是 `OnceLock`/`OnceCell`,因为这些类型开箱即不支持重置。 ``` use std::sync::Mutex; static CACHE: Mutex>> = Mutex::new(None); fn main() { afl::fuzz_with_reset!(|data: &[u8]| { let mut cache = CACHE.lock().unwrap(); if cache.is_none() { *cache = Some(data.to_vec()); } drop(cache); // ... fuzz logic ... }, || { // Reset closure: called after each successful iteration *CACHE.lock().unwrap() = None; }); } ``` 还提供了一个 `fuzz_with_reset_nohook!` 变体(与 `fuzz_nohook!` 类似,它不会覆盖 panic hook)。 有关完整示例,请参见 [`afl/examples/reset_demo.rs`](afl/examples/reset_demo.rs)。 ## IJON 如果你想使用 [IJON](https://github.com/AFLplusplus/AFLplusplus/blob/stable/docs/IJON.md)——通过代码注解来辅助模糊测试器提升覆盖率——那么可以看看这个[迷宫示例](afl/examples/maze.rs)。 请注意,IJON 宏已被 rust 化风格转换为小写——因此 Rust 中的 `IJON_MAX(x)` 对应的是 `ijon_max(x)`。 除了你使用的任何宏(例如 `afl::ijon_max`)之外,你还需要从 `afl` 中导入以下内容: ``` use afl::ijon_hashint; use afl::ijon_hashstr; ```
标签:AFLplusplus, American Fuzzy Lop, CMPLOG, Fuzzing, pocsuite3, Rust, 代码安全, 代码覆盖率, 可视化界面, 崩溃检测, 性能优化, 检测绕过, 模糊引擎, 模糊测试工具, 测试框架, 漏洞枚举, 编程语言, 网络流量审计, 软件测试, 通知系统