4个版本

0.5.61 2023年9月1日
0.5.59 2023年9月1日
0.5.58 2023年9月1日
0.5.54 2021年7月16日

#6 in #fuzzer

MIT OR Apache-2.0 OR Unlicense OR WTFPL

620KB
13K SLoC

C 12K SLoC // 0.1% comments Shell 306 SLoC // 0.2% comments Python 291 SLoC // 0.1% comments Rust 164 SLoC // 0.1% comments

包含 (Mach-o可执行文件, 335KB) CrashReport_Yosemite.o, (Mach-o可执行文件, 320KB) CrashReport_Mavericks.o, (Mach-o可执行文件, 310KB) CrashReport_Mountain_Lion.o, (Mach-o可执行文件, 335KB) CrashReport_Sierra.o

honggfuzz-rs 构建状态 Crates.io 文档

使用由Google开发的Honggfuzz模糊测试您的Rust代码!

文档

asciicast

关于Hongg

Honggfuzz是一个以安全为中心的模糊测试工具,具有强大的分析选项。支持基于代码覆盖率(软件和硬件)的进化和反馈驱动的模糊测试。

兼容性

  • Rust: 稳定版、测试版、夜间版
  • 操作系统: GNU/Linux、macOS、FreeBSD、NetBSD、Android、WSL(Linux子系统Windows)
  • 架构: x86_64、x86、arm64-v8a、armeabi-v7a、armebi
  • Sanitizer: 无、地址、线程、泄露

依赖关系

Linux

  • C编译器: cc
  • GNU Make: make
  • GNU Binutils开发文件(用于BFD库): libbfd.h
  • libunwind开发文件: libunwind.h
  • Blocks运行时库(当使用clang编译时)
  • liblzma开发文件

例如在Debian及其衍生版本上

sudo apt install build-essential binutils-dev libunwind-dev libblocksruntime-dev liblzma-dev

如何使用这个crate

安装honggfuzz命令,以构建带有仪器和模糊测试的功能

# installs hongg and honggfuzz subcommands in cargo
cargo install cargo-hongg

将其添加到您的依赖项中

[dependencies]
hongg = "0.5.54"

创建一个用于模糊测试的目标

use hongg::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")
        });
    }
}

为了乐趣和利润而模糊测试!

# builds with fuzzing instrumentation and then fuzz the "example" target
cargo hongg fuzz --bin example

一旦您获得了崩溃,就可以轻松地在调试环境中回放它

# builds the target in debug mode and replays automatically the crash in rust-lldb
cargo hongg debug --bin example hfuzz_workspace/*/*.fuzz

您还可以构建和运行您的项目,而无需编译时的软件仪器(LLVM的SanCov传递)

这允许您尝试仅使用硬件反馈驱动的模糊测试

# builds without fuzzing instrumentation and then fuzz the "example" target using hardware-based feedback
HFUZZ_RUN_ARGS="--linux_perf_ipt_block --linux_perf_instr --linux_perf_branch" cargo hfuzz run-no-instr example

清洁

# a wrapper on "cargo clean" which cleans the fuzzing_target directory
cargo hongg clean

版本

cargo hongg --version

环境变量

RUSTFLAGS

您可以使用 RUSTFLAGS 将附加参数发送到 rustc

例如,您可以使用LLVM的 sanitizers。如果您想测试您的 unsafe rust代码,这是一个推荐选项,但它将对性能产生影响。

RUSTFLAGS="-Z sanitizer=address" cargo hongg fuzz -b example

HFUZZ_BUILD_ARGS

您可以使用 HFUZZ_BUILD_ARGS 将附加参数发送到 cargo build

HFUZZ_RUN_ARGS

您可以使用 HFUZZ_RUN_ARGS 将附加参数发送到 hongg fuzz。有关参数列表,请参阅USAGE

例如

# 1 second of timeout
# use 12 fuzzing thread
# be verbose
# stop after 1000000 fuzzing iteration
# exit upon crash
HFUZZ_RUN_ARGS="-t 1 -n 12 -v -N 1000000 --exit_upon_crash" cargo hfuzz run example

HFUZZ_DEBUGGER

默认情况下,我们使用 rust-lldb,但您也可以将其更改为 rust-gdbgdb/usr/bin/lldb-7 ...

CARGO_TARGET_DIR

目标编译目录,默认为 hfuzz_target,以避免与 cargo build 的默认 target 目录冲突。

HFUZZ_WORKSPACE

Honggfuzz工作目录,默认为 hfuzz_workspace

HFUZZ_INPUT

Honggfuzz输入文件(也称为“语料库”),默认为 $HFUZZ_WORKSPACE/{TARGET}/input

条件编译

有时,为了提高模糊测试效率,需要对您的代码进行一些特定的适配。

例如

  • 尽量在模糊测试输入上使软件行为尽可能确定
    • PRNG 必须使用常数或模糊测试输入进行种子化
    • 行为不应该基于计算机的时钟而改变。
    • 避免来自竞争线程的潜在不确定行为。
    • ...
  • 永远不要调用 std::process::exit()
  • 禁用日志和其他不必要的功能。
  • 尽量在可能的情况下避免修改全局状态。
  • 在运行时不要设置自己的panic钩子,如果使用 cfg(fuzzing)

当使用 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();

此外,在调试模式下构建时,除了 fuzzing 之外,还会添加 fuzzing_debug 参数。

有关条件编译的更多信息,请参阅参考文档

关于honggfuzz的相关文档

关于Rust模糊测试

其他提供Rust模糊测试支持的项目可以在github.com/rust-fuzz找到。

您将找到对AFL和LLVM的LibFuzzer的支持,还有一个奖杯案例 ;-)。

这个crate受到了那些项目的启发!

依赖关系