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, 二进制分析, 云安全运维, 内存安全, 可视化界面, 安全测试, 开发库, 攻击性安全, 测试框架, 网络流量审计, 覆盖率, 覆盖率引导