我正在使用libFuzzer来模糊API。
API正在反序列化一个位数组(由libFuzzer提供)
并将其转换为c ++类实例化。
由于序列化格式,libFuzer能够构造一个序列化对象,该对象告诉解串器保留大量数据(无法满足)。
这是通过调用std::vector::resize()
完成的。向量引发了std::bad_alloc
,尽管问题已被发现并得到了安全缓解,但它却导致模糊器的极端滞后(如关于OOM问题的following documentation中所述)。
为了减少运行模糊器时使用的内存量,我希望设置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
为什么地址清洗器不能在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",
],
我尝试关闭标志,以便可以设置ulimit
并运行模糊器:
copts = [
"-fsanitize=fuzzer",
"-g",
"-O0",
"-fno-omit-frame-pointer",
],
linkopts = [
"-fsanitize=fuzzer",
],
但这会导致立即的段错误。
答案 0 :(得分:0)
Asan在启动时为影子存储器保留进程地址空间的1/8,以保存用户数据的状态(已分配,已释放等)。这是设计使然,无可奈何。
请注意,您通常不关心虚拟内存,而是物理内存(这也会导致new
失败)。