#lib-fuzzer #llvm #run-time #fuzz-testing #wrapper #linux

sys libfuzzer-sys

LLVM的libFuzzer运行时的包装器

17个版本

0.4.7 2023年8月10日
0.4.6 2023年1月26日
0.4.5 2022年10月18日
0.4.3 2022年3月3日
0.1.1 2019年9月10日

#24 in 开发工具

Download history 83802/week @ 2024-04-08 81755/week @ 2024-04-15 82093/week @ 2024-04-22 80784/week @ 2024-04-29 80920/week @ 2024-05-06 89979/week @ 2024-05-13 84062/week @ 2024-05-20 88058/week @ 2024-05-27 82978/week @ 2024-06-03 82880/week @ 2024-06-10 90494/week @ 2024-06-17 90243/week @ 2024-06-24 81331/week @ 2024-07-01 95755/week @ 2024-07-08 97731/week @ 2024-07-15 98072/week @ 2024-07-22

每月378,025次下载
43 个crate中使用了(11 个直接使用)

MIT/Apache-2.0/NCSA

380KB
8K SLoC

C++ 8K SLoC // 0.1% comments Rust 195 SLoC // 0.2% comments Python 63 SLoC // 0.2% comments Shell 43 SLoC // 0.2% comments C 25 SLoC // 0.4% comments

libfuzzer-sys Crate

对LLVM的libFuzzer运行时库的简单包装。

CPP部分是从compiler-rt git仓库通过git filter-branch提取的。

libFuzzer依赖于LLVM sanitizer支持。目前,Rust编译器内置了对LLVM sanitizer的支持,但仅限于Linux。因此,libfuzzer-sys只适用于Linux。

用法

使用cargo fuzz

推荐使用此crate与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' \
    -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运行时。

如果您正在开发一个模糊测试工具,可以将环境变量 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 <github.com/llvm-mirror/llvm-project SHA1>

许可证

libfuzzer 目录中的所有文件都许可为 NCSA。

其他所有内容都双重许可 Apache 2.0 和 MIT。

依赖关系

~115–445KB