0

0

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

冰火之心

冰火之心

发布时间:2025-12-24 09:37:02

|

500人浏览过

|

来源于php中文网

原创

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

c++如何进行模糊测试(fuzzing)_c++ libfuzzer与afl入门【安全】

在 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 的设计质量:

Remover
Remover

几秒钟去除图中不需要的元素

下载

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

  • 只 fuzz 你想验证的模块,别把初始化、日志、网络连接等无关逻辑包进来
  • 避免全局状态残留(比如单例未重置),否则多次调用会互相干扰 —— libFuzzer 默认反复调用同一进程内的函数
  • 对输入长度设合理上限(例如 if (size > 1024) return;),防 OOM 或无限循环
  • 可主动调用 abort()__builtin_trap() 标记逻辑错误(如协议校验失败但没崩溃),配合 -fsanitize=fuzzer 让 fuzz 引擎感知到“新路径”

小技巧与避坑提醒

实际跑起来常卡在几个地方:

  • ASan 报告 malloc/free mismatch?检查是否混用了 new/delete 和 malloc/free,或跨 shared library 释放内存
  • libFuzzer 卡住不动?可能是死循环、阻塞 IO 或信号处理干扰 —— 加 -timeout=5 参数限制单次执行时间
  • AFL 提示 “No instrumentation detected”?确认用了 afl-clang++ 编译,且没被 CMake 的 set(CMAKE_CXX_FLAGS ...) 覆盖掉插桩标志
  • 想 fuzz C++ STL 容器或算法?可以,但注意迭代器失效、越界访问等 UB 很容易被 UBSan 捕获,正是 fuzz 想找的点

基本上就这些。libFuzzer 上手快,适合开发阶段嵌入 CI;AFL 更鲁棒,适合回归测试或交付前深度挖掘。两者不冲突,可以并行用 —— 同一个 parser,既写个 libFuzzer target 做单元 fuzz,也编个 AFL binary 做端到端 fuzz。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

747

2023.08.22

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

524

2023.09.20

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

175

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

97

2025.11.27

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2023.12.29

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

4875

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

2973

2024.08.14

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.8万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号