c++如何使用SanitizerCoverage进行覆盖率引导的模糊测试_c++ Fuzzing进阶【安全】

admin 百科 11
SanitizerCoverage(SanCov)是 LLVM 提供的轻量级覆盖率反馈机制,通过 -fsanitize-coverage=trace-pc-guard 编译插桩,为 libFuzzer 提供基本块/边缘覆盖信息,需用 clang 编译、安全解析输入、关注 cov/ft 指标并可结合 llvm-cov 生成报告。

c++如何使用SanitizerCoverage进行覆盖率引导的模糊测试_c++ Fuzzing进阶【安全】-第1张图片-佛山资讯网

在 C++ 模糊测试中,SanitizerCoverage(即 SanCov)是 LLVM 提供的轻量级、低开销覆盖率反馈机制,它不依赖外部插桩工具(如 AFL 的 afl-clang-fast),而是通过编译器内置支持,为 libFuzzer 等基于覆盖率的模糊器提供基本块(Basic Block)、边缘(Edge)或函数级覆盖信息。它不是独立 fuzzing 工具,而是 libFuzzer 的“眼睛”——让模糊器知道“哪里还没跑过”,从而智能变异输入。

一、启用 SanitizerCoverage 编译目标代码

关键在于用 clang++(推荐 clang 12+)开启 -fsanitize-coverage=trace-pc-guard,这是 libFuzzer 推荐的模式,平衡精度与性能:

  • 必须使用 clang/LLVM 工具链,GCC 不支持该 coverage 模式;
  • 建议同时开启 -O2(优化不影响 coverage 插桩)和 -g(便于调试崩溃);
  • 禁用 -fno-omit-frame-pointer(某些 sanitizer 模式需要,libFuzzer 默认要求);
  • 若目标含 C++ STL 或第三方库,确保它们也用相同 sanitizer flags 编译(或链接静态版 libFuzzer)。

示例编译命令:

clang++ -O2 -g -fsanitize=address,undefined \
  -fsanitize-coverage=trace-pc-guard \
  -stdlib=libc++ \
  target.cpp \
  -o target_fuzz \
  /path/to/libFuzzer.a

登录后复制

二、编写符合 libFuzzer 要求的 fuzz target

入口函数必须严格为 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size),且不能调用 exit()printf()(除非重定向)等干扰 fuzz loop 的操作:

立即学习“C++免费学习笔记(深入)”;

标签: html edge 工具 c++ asic

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~