rust-fuzz/honggfuzz-rs
GitHub: rust-fuzz/honggfuzz-rs
这是 Rust 编程语言的 Honggfuzz 模糊测试绑定库,用于通过覆盖率引导的模糊测试发现代码中的潜在缺陷与崩溃。
Stars: 499 | Forks: 47
# honggfuzz-rs [][build] [][crates] [][docs]
使用 Google 开发的 Honggfuzz 为你的 Rust 代码进行 fuzz!
## [文档](https://docs.rs/honggfuzz)
[](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, 可视化界面, 开发工具, 网络流量审计, 通知系统