rust-fuzz/honggfuzz-rs

GitHub: rust-fuzz/honggfuzz-rs

这是 Rust 编程语言的 Honggfuzz 模糊测试绑定库,用于通过覆盖率引导的模糊测试发现代码中的潜在缺陷与崩溃。

Stars: 499 | Forks: 47

# honggfuzz-rs [![Build Status](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/734655b928192244.svg)][build] [![Crates.io](https://img.shields.io/crates/v/honggfuzz.svg)][crates] [![Documentation](https://docs.rs/honggfuzz/badge.svg)][docs] 使用 Google 开发的 Honggfuzz 为你的 Rust 代码进行 fuzz! ## [文档](https://docs.rs/honggfuzz) [![asciicast](https://asciinema.org/a/43MLo5Xl8ukHxgwDLArKqS9xc.png)](https://asciinema.org/a/43MLo5Xl8ukHxgwDLArKqS9xc) ## 关于 Honggfuzz Honggfuzz 是一个面向安全的 fuzzer,具备强大的分析选项。支持基于代码覆盖率(软件和硬件支持)的进化式、反馈驱动的 fuzzing。 * 项目主页 [honggfuzz.com](http://honggfuzz.com/) * 项目仓库 [github.com/google/honggfuzz](https://github.com/google/honggfuzz) * 该上游项目由 Google 维护,但是 ... * 这不是一个官方的 Google 产品 ## 兼容性 * __Rust__: stable, beta, nightly * __操作系统__: GNU/Linux, macOS, FreeBSD, NetBSD, Android, WSL (Windows Subsystem for Linux) * __架构__: x86_64, x86, arm64-v8a, armeabi-v7a, armeabi * __Sanitizer__: none, address, thread, leak ## 依赖 ### Linux * C 编译器:`cc` * GNU Make:`make` * 用于 BFD 库的 GNU Binutils 开发文件:`libbfd.h` * libunwind 开发文件:`libunwind.h` * Blocks runtime library(使用 clang 编译时) * liblzma 开发文件 例如,在 Debian 及其衍生发行版上: ``` sudo apt install build-essential binutils-dev libunwind-dev libblocksruntime-dev liblzma-dev ``` ## 如何使用此 crate 安装 honggfuzz 命令以进行带插桩的构建和 fuzz ``` # 在 cargo 中安装 hfuzz 和 honggfuzz 子命令 cargo install honggfuzz ``` 添加到你的依赖中 ``` [dependencies] honggfuzz = "0.5" ``` 创建一个用于 fuzz 的 target ``` use honggfuzz::fuzz; fn main() { // Here you can parse `std::env::args and // setup / initialize your project // You have full control over the loop but // you're supposed to call `fuzz` ad vitam aeternam loop { // The fuzz macro gives an arbitrary object (see `arbitrary crate`) // to a closure-like block of code. // For performance reasons, it is recommended that you use the native type // `&[u8]` when possible. // Here, this slice will contain a "random" quantity of "random" data. fuzz!(|data: &[u8]| { if data.len() != 3 {return} if data[0] != b'h' {return} if data[1] != b'e' {return} if data[2] != b'y' {return} panic!("BOOM") }); } } ``` 开始 fuzz,享受乐趣与收益! ``` # 使用 fuzzing instrumentation 构建,然后对 "example" 目标进行 fuzz cargo hfuzz run example ``` 一旦发现崩溃,可以在 debug 环境中轻松重放 ``` # 以 debug 模式构建目标,并在 rust-lldb 中自动重放 crash cargo hfuzz run-debug example hfuzz_workspace/*/*.fuzz ``` 你也可以在编译时不使用软件插桩(LLVM 的 SanCov pass)来构建和运行你的项目 这使你可以例如尝试仅基于硬件反馈的 fuzzing: ``` # 不使用 fuzzing instrumentation 构建,然后使用基于硬件的反馈对 "example" 目标进行 fuzz HFUZZ_RUN_ARGS="--linux_perf_ipt_block --linux_perf_instr --linux_perf_branch" cargo hfuzz run-no-instr example ``` 清理 ``` # "cargo clean" 的包装器,用于清理 fuzzing_target 目录 cargo hfuzz clean ``` 版本 ``` cargo hfuzz version ``` ### 环境变量 #### `RUSTFLAGS` 你可以使用 `RUSTFLAGS` 向 `rustc` 发送额外的参数。 例如,你可以启用 LLVM 的 [sanitizers](https://github.com/japaric/rust-san)。 如果你想测试你的 `unsafe` rust 代码,这是一个推荐的选项,但它会对性能产生影响。 ``` RUSTFLAGS="-Z sanitizer=address" cargo hfuzz run example ``` #### `HFUZZ_BUILD_ARGS` 你可以使用 `HFUZZ_BUILD_ARGS` 向 `cargo build` 发送额外的参数。 #### `HFUZZ_RUN_ARGS` 你可以使用 `HFUZZ_RUN_ARGS` 向 `honggfuzz` 发送额外的参数。 有关这些参数的列表,请参见[用法](https://github.com/google/honggfuzz/blob/master/docs/USAGE.md)。 例如: ``` # 1 秒的超时时间 # 使用 12 个 fuzzing 线程 # 输出详细信息的 verbose 模式 # 在 1000000 次 fuzzing 迭代后停止 # 遇到 crash 时退出 HFUZZ_RUN_ARGS="-t 1 -n 12 -v -N 1000000 --exit_upon_crash" cargo hfuzz run example ``` #### `HFUZZ_DEBUGGER` 默认情况下我们使用 `rust-lldb`,但你可以将其更改为 `rust-gdb`、`gdb`、`/usr/bin/lldb-7` ... #### `CARGO_TARGET_DIR` Target 编译目录,默认为 `hfuzz_target`,以避免与 `cargo build` 默认的 `target` 目录发生冲突。 #### `HFUZZ_WORKSPACE` Honggfuzz 工作目录,默认为 `hfuzz_workspace`。 #### `HFUZZ_INPUT` Honggfuzz 输入文件(也称为 "corpus"),默认为 `$HFUZZ_WORKSPACE/{TARGET}/input`。 ## 条件编译 有时,有必要对代码进行一些特定的调整,以获得更好的 fuzz 效率。 例如: * 使软件的行为在 fuzz 输入方面尽可能做到确定性 * [PRNG](https://en.wikipedia.org/wiki/Pseudorandom_number_generator) 必须使用常量或 fuzzer 输入作为种子进行播种 * 行为不应根据计算机时钟而改变。 * 避免竞争线程可能产生的潜在不确定性行为。 * ... * 永远不要调用 `std::process::exit()`。 * 禁用日志和其他不必要的功能。 * 尽可能避免修改全局状态。 * 在使用 `cfg(fuzzing)` 运行时,不要设置你自己的 panic hook 使用 `cargo hfuzz` 构建时,参数 `--cfg fuzzing` 会传递给 `rustc`,允许你借助 `cfg` 宏来设置这些调整的条件编译,如下所示: ``` #[cfg(fuzzing)] let mut rng = rand_chacha::ChaCha8Rng::from_seed(&[0]); #[cfg(not(fuzzing))] let mut rng = rand::thread_rng(); ``` 此外,在 debug 模式下构建时,除了 `fuzzing` 之外,还会添加 `fuzzing_debug` 参数。 有关条件编译的更多信息,请参见[参考手册](https://doc.rust-lang.org/reference/attributes.html#conditional-compilation)。 ## 关于 honggfuzz 的相关文档 * [用法](https://github.com/google/honggfuzz/blob/master/docs/USAGE.md) * [反馈驱动 Fuzzing](https://github.com/google/honggfuzz/blob/master/docs/FeedbackDrivenFuzzing.md) * [持久化 Fuzzing](https://github.com/google/honggfuzz/blob/master/docs/PersistentFuzzing.md) ## 关于 Rust fuzzing 在 [github.com/rust-fuzz](https://github.com/rust-fuzz) 还有其他提供 Rust fuzzing 支持的项目。 你会在那里找到对 [AFL](https://github.com/rust-fuzz/afl.rs) 和 LLVM 的 [LibFuzzer](https://github.com/rust-fuzz/cargo-fuzz) 的支持,此外还有一个[荣誉榜单](https://github.com/rust-fuzz/trophy-case) ;-) 。 这个 crate 正是受到了这些项目的启发!
标签:Rust, SOC Prime, 可视化界面, 开发工具, 网络流量审计, 通知系统