c++如何进行模糊测试(Fuzzing)_c++ libFuzzer与AFL入门【安全】

admin 百科 15
C++模糊测试主流选libFuzzer(轻量、函数级、需FuzzerTestOneInput入口)和AFL(插桩编译、进程隔离、适合二进制),均依赖覆盖率反馈;共性要求fuzz target精简、无副作用、限长防OOM,并推荐ASan/UBSan协同检测。

c++如何进行模糊测试(Fuzzing)_c++ libFuzzer与AFL入门【安全】-第1张图片-佛山资讯网

在 C++ 中做模糊测试(Fuzzing),主流选择是 libFuzzer(LLVM 自带、集成度高、适合单元级测试)和 AFL(历史悠久、覆盖率驱动、需插桩编译)。两者都依赖“覆盖率反馈”来智能变异输入,而非随机乱试。

libFuzzer:轻量、快速、适合函数级 fuzz

libFuzzer 是 LLVM 工具链的一部分,直接链接进你的测试目标,无需外部 fuzzer 进程。它要求你写一个 FuzzerTestOneInput 函数,接收 const uint8_t* data, size_t size,然后在里面调用被测函数(比如解析器、解码器、序列化逻辑等)。

  • 编译时加 -fsanitize=fuzzer,address,undefined(推荐同时开 ASan + UBSan,便于发现内存错误和未定义行为)
  • 确保被测代码无非确定性操作(如读系统时间、文件、网络),否则 libFuzzer 无法稳定复现崩溃
  • __attribute__((no_sanitize("fuzzer_no_link"))) void FuzzerTestOneInput(...) 显式声明入口函数
  • 运行后会自动生成语料(corpus)、自动最小化崩溃用例,并把 crash 保存在 crash-xxx 文件中

AFL:经典、稳定、适合二进制或黑盒场景

AFL 更适合对已编译程序(尤其是没有源码的)或需要完整进程隔离的场景。C++ 项目使用 AFL 通常走 afl-clang++ 插桩编译路径。

  • 安装 AFL++(推荐替代原版 AFL,支持更多插桩模式和 CPU 指令集优化)
  • afl-clang++ -O2 -g -fsanitize=address,undefined your_code.cpp -o target 编译
  • 准备初始语料(哪怕只有一个空文件或合法输入样本),放在 in/ 目录
  • 运行 afl-fuzz -i in/ -o out/ -- ./target @@@@ 表示输入文件位置;若程序从 stdin 读,则省略 @@
  • AFL 会不断生成新输入、监控执行路径,遇到新覆盖就保留,触发崩溃则存入 out/crashes/

关键共性:怎么写靠谱的 fuzz target?

无论 libFuzzer 还是 AFL,效果好坏极大取决于 fuzz target 的设计质量:

标签: 工具 c++ red

发布评论 0条评论)

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