如何使用 libfuzzers 自定义修改器 API?

How to use libfuzzers custom mutators API?

Libfuzzer 提供了两个 API 来开发自定义修改器。

size_t LLVMFuzzerCustomMutator(uint8_t *Data, size_t Size, size_t MaxSize, unsigned int Seed)
size_t LLVMFuzzerCustomCrossOver(const uint8_t *Data1, size_t Size1, const uint8_t *Data2, size_t Size2, uint8_t *Out, size_t MaxOutSize, unsigned int Seed)

应该如何使用这些 API? 模糊器必须是确定性的。我如何使用自定义修改器确保这一点?

您只需要在 LLVMFuzzerTestOneInput 的旁边实现这些功能。

google/fuzzing repository has a tutorial on how to implement structure-aware fuzzing.

另外,您可以从 CustomMutatorTest.cpp, and CustomCrossOverTest.cpp 的 LLVM 存储库中获得灵感。

The fuzzer is required to be deterministic.

是的,但是在这里您将编写不同的变异函数;突变会在你的 LLVMFuzzerTestOneInput 被调用之前发生。

但是,他们有类似的要求。 如 source code 中所述,分别与 LLVMFuzzerCustomMutatorLLVMFuzzerCustomCrossOver 一起:

Optional user-provided custom mutator. Mutates raw data in [Data, Data+Size) inplace. Returns the new size, which is not greater than MaxSize. Given the same Seed produces the same mutation.

Optional user-provided custom cross-over function. Combines pieces of Data1 & Data2 together into Out. Returns the new size, which is not greater than MaxOutSize. Should produce the same mutation given the same Seed.

两次调用具有相同Dataseed的变异函数应该产生相同的结果。

最后一件事:您不需要同时实现这两个功能; LLVMFuzzerCustomMutator 在大多数情况下应该足够了。