rust-fuzz/libfuzzer

GitHub: rust-fuzz/libfuzzer

LLVM libFuzzer 的 Rust 语言绑定,用于对 Rust 代码进行覆盖引导的模糊测试以发现安全漏洞和程序缺陷。

Stars: 255 | Forks: 51

# `libfuzzer-sys` Crate LLVM 的 libFuzzer 运行时库的简易封装。 其中的 CPP 部分是通过 `git filter-branch` 从 compiler-rt git 仓库中提取出来的。 libFuzzer 依赖于 LLVM sanitizer 支持。Rust 编译器内置了对 LLVM sanitizer 的支持,目前仅限于 Linux。因此,`libfuzzer-sys` 只能在 Linux 上运行。 ## 用法 ### 使用 `cargo fuzz`! [推荐使用此 crate 的方式是通过 `cargo fuzz`!][cargo-fuzz]。 ### 手动使用 此 crate 也可以按如下方式手动使用: 首先创建一个新的 cargo 项目: ``` $ cargo new --bin fuzzed $ cd fuzzed ``` 然后添加对 `fuzzer-sys` crate 和你自己的 crate 的依赖: ``` [dependencies] libfuzzer-sys = "0.4.0" your_crate = { path = "../path/to/your/crate" } ``` 修改 `fuzzed/src/main.rs` 以对你的代码进行 fuzz 测试: ``` #![no_main] use libfuzzer_sys::fuzz_target; fuzz_target!(|data: &[u8]| { // code to fuzz goes here }); ``` 通过运行以下命令进行构建: ``` $ cargo rustc -- \ -C passes='sancov-module' \ -C llvm-args='-sanitizer-coverage-level=3' \ -C llvm-args='-sanitizer-coverage-inline-8bit-counters' \ -Z sanitizer=address ``` 最后,运行 fuzzer: ``` $ ./target/debug/fuzzed ``` ### 链接到本地 libfuzzer 使用 `libfuzzer-sys` 时,你可以通过两种方式提供自己的 `libfuzzer` 运行时。 如果你正在开发 fuzzer,可以将 `CUSTOM_LIBFUZZER_PATH` 环境变量设置为本地 `libfuzzer` 运行时的路径,这样在 `libfuzzer-sys` 的构建阶段将链接该运行时,而不是构建 libfuzzer。 例如,要链接到预构建的 LLVM 16 `libfuzzer`,你可以使用: ``` $ export CUSTOM_LIBFUZZER_PATH=/usr/lib64/clang/16/lib/libclang_rt.fuzzer-x86_64.a $ cargo fuzz run ... ``` 或者,你也可以禁用默认的 `link_libfuzzer` 功能: 在 `Cargo.toml` 中: ``` [dependencies] libfuzzer-sys = { path = "../../libfuzzer", default-features = false } ``` 然后在你的 `build.rs` 中链接到你自己的运行时。 ## 从上游更新 libfuzzer * 更新 `./update-libfuzzer.sh` 中的 `COMMIT=...` 变量,将其替换为来自 [llvm-mirror/llvm-project](github.com/llvm-mirror/llvm-project) 的、你正在引入的新提交哈希。 * 重新运行脚本: $ ./update-libfuzzer.sh ## 许可证 `libfuzzer` 目录中的所有文件均采用 NCSA 许可。 其他所有内容均采用 Apache 2.0 和 MIT 双重许可。
标签:AddressSanitizer, Compiler-RT, Fuzzing, libFuzzer, LLVM, Rust, Sanitizer, 二进制分析, 云安全运维, 内存安全, 可视化界面, 安全测试, 开发库, 攻击性安全, 测试框架, 网络流量审计, 覆盖率, 覆盖率引导