根据官方定义:libFuzzer
is in-process, coverage-guided, evolutionary fuzzing engine.
其本身是llvm
项目的一部分,和clang
是亲兄弟,二者项目源码分别可见于https://github.com/llvm/llvm-project/tree/master/compiler-rt/lib/fuzzer和https://github.com/llvm/llvm-project/tree/master/clang,就在同一个仓库里面。
现在稍微新的版本的clang都已经内置libFuzzer了,所以Linux下直接apt install clang
就安装完事了。
1. Fuzz Target
libFuzzer要求实现一个fuzz target
作为被测对象的接口。
官方文档中的代码示例如下:
// fuzz_target.cc |
给的是个C++的源码,但实际上却通过extern "C"
指定采用C风格的编译约定。所以实际上fuzz target的C语言原型如下:
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); |
名称参数返回值类型都不能动,并且注意参数中传来的字节数组Data是通过底层const修饰了的,也就是不允许修改其中数据。
fuzzer target(即LLVMFuzzerTestOneInput
函数)目的是作为被测对象与libFuzzer库之间的一个中转接口,其作用在于接受libFuzzer提供的输入数据Data
字节串,(可能还需要进行数据格式转换,)然后传递给实际的被测函数(如上述示例中的DoSomethingInterestingWithMyAPI
)。