我有一个 libFuzzer 使用的简单示例。
// Test_fuzzer.cc
#include <stdint.h>
#include <stddef.h>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
if (size > 0 && data[0] == 'H')
if (size > 1 && data[1] == 'I')
if (size > 2 && data[2] == '!')
__builtin_trap();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以用 clang 编译它并运行。
clang -g -O1 -fsanitize=fuzzer test_fuzzer.cc //OK
Run Code Online (Sandbox Code Playgroud)
现在我想将 cmake 添加到这个示例中。
// CMakeLists.txt file:
cmake_minimum_required (VERSION 3.11)
project (Tutorial)
set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -O1 -fsanitize=fuzzer")
add_executable(Tutorial test_fuzzer.cc)
Run Code Online (Sandbox Code Playgroud)
cmake . //OK
make
Run Code Online (Sandbox Code Playgroud)
但我收到错误。如何修复它?
/usr/bin/ld: …Run Code Online (Sandbox Code Playgroud) 我正在使用libFuzzer来模糊 API。
该 API 反序列化位数组(由 libFuzzer 提供)
并将它们转换为 C++ 类实例化。
由于序列化格式,libFuzer 能够构造一个序列化对象,告诉反序列化器保留大量数据(这是无法满足的)。
这是通过调用 来完成的std::vector::resize()。向量抛出std::bad_alloc,尽管问题已被捕获并安全缓解,但它会导致模糊器极度滞后(如以下有关OOM 问题的文档中所述)。
为了降低模糊器运行时使用的内存量,我希望设置ulimit -v和调整进程的可用虚拟内存。然而这样做会导致
==27609==ERROR: AddressSanitizer failed to allocate 0xdfff0001000 (15392894357504) bytes at address 2008fff7000 (errno: 12)
==27609==ReserveShadowMemoryRange failed while trying to map 0xdfff0001000 bytes. Perhaps you're using ulimit -v
Run Code Online (Sandbox Code Playgroud)
为什么地址清理程序不能在 ulmit -v 下工作?
我希望可以,这样我就可以更有效地进行模糊测试。
其他信息:
我的构建标志是:
copts = [
"-fsanitize=address,fuzzer",
"-fsanitize-trap=undefined,integer",
"-fsanitize-coverage=trace-pc,trace-cmp,trace-pc-guard",
"-g",
"-O0",
"-fno-omit-frame-pointer",
"-fno-sanitize=vptr",
],
linkopts = [
"-fsanitize=address,fuzzer",
"-fsanitize-trap=undefined,integer",
"-fno-sanitize=vptr",
"-fsanitize-link-c++-runtime",
],
Run Code Online (Sandbox Code Playgroud)
我尝试关闭标志,以便我可以设置 …
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)
Run Code Online (Sandbox Code Playgroud)
这些API应该如何使用?模糊器需要具有确定性。如何使用自定义变异器确保这一点?