#property-testing #fuzzing #security-testing #fuzzer #security #properties

bin+lib honggfuzz

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

59 个版本

0.5.56 2024 年 5 月 21 日
0.5.55 2022 年 8 月 16 日
0.5.54 2021 年 3 月 3 日
0.5.51 2020 年 9 月 12 日
0.5.12 2018 年 3 月 27 日

#21 in 测试

Download history 32863/week @ 2024-05-02 31857/week @ 2024-05-09 32063/week @ 2024-05-16 41413/week @ 2024-05-23 39964/week @ 2024-05-30 32882/week @ 2024-06-06 35613/week @ 2024-06-13 37048/week @ 2024-06-20 34216/week @ 2024-06-27 33582/week @ 2024-07-04 39673/week @ 2024-07-11 43045/week @ 2024-07-18 41274/week @ 2024-07-25 35384/week @ 2024-08-01 48755/week @ 2024-08-08 42468/week @ 2024-08-15

176,156 每月下载量
用于 44 个 Crates (15 个直接使用)

MIT/Apache-2.0/Unlicense/WTFPL

30MB
1M SLoC

Bitbake 1M SLoC // 0.0% comments C 91K SLoC // 0.1% comments C# 19K SLoC Python 14K SLoC // 0.0% comments Java 11K SLoC // 0.0% comments OCaml 10K SLoC // 0.0% comments Visual Studio Project 3.5K SLoC VB6 3K SLoC // 0.2% comments GNU Style Assembly 2K SLoC // 0.3% comments Automake 1K SLoC // 0.1% comments Shell 524 SLoC // 0.2% comments PowerShell 520 SLoC // 0.3% comments Rust 513 SLoC // 0.1% comments C++ 466 SLoC // 0.2% comments Visual Studio Solution 315 SLoC Cython 277 SLoC // 0.1% comments Batch 274 SLoC // 0.0% comments RPM Specfile 122 SLoC // 0.0% 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,(神秘的 autoconf 代码, 16KB) configure.ac

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

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

文档

asciicast

关于 Honggfuzz

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

兼容性

  • Rust:稳定版、beta 版、nightly 版
  • 操作系统:GNU/Linux、macOS、FreeBSD、NetBSD、Android、WSL (Windows Subsystem for Linux)
  • 架构: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 hfuzz and honggfuzz subcommands in cargo
cargo install honggfuzz

将其添加到您的依赖项中

[dependencies]
honggfuzz = "0.5"

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

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

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

# builds with fuzzing instrumentation and then fuzz the "example" target
cargo hfuzz run example

一旦发生崩溃,您可以在调试环境中轻松回放它

# builds the target in debug mode and replays automatically the crash in rust-lldb
cargo hfuzz run-debug 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 hfuzz clean

版本

cargo hfuzz version

环境变量

RUSTFLAGS

您可以使用 RUSTFLAGSrustc 发送额外的参数。

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

RUSTFLAGS="-Z sanitizer=address" cargo hfuzz run example

HFUZZ_BUILD_ARGS

您可以使用 HFUZZ_BUILD_ARGScargo build 发送额外的参数。

HFUZZ_RUN_ARGS

您可以使用 HFUZZ_RUN_ARGShonggfuzz 发送额外的参数。有关这些参数的列表,请参阅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
  • 禁用日志和其他不必要的功能。
  • 尽可能避免在可能的情况下修改全局状态。
  • 不要在运行时使用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();

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

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

有关honggfuzz的相关文档

关于Rust模糊测试

github.com/rust-fuzz上还有其他提供Rust模糊测试支持的项目。

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

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

依赖项