0

0

如何使用Fuzzing测试发现c++代码中的安全漏洞? (libFuzzer入门)

冰火之心

冰火之心

发布时间:2026-01-14 16:40:03

|

469人浏览过

|

来源于php中文网

原创

c++kquote>libFuzzer要求实现extern "C" int LLVMFuzzerTestOneInput(const uint8_t*, size_t)函数,需校验输入边界、禁用exit/abort、依赖ASan检测内存错误,编译须加-fsanitize=address,fuzzer,复现崩溃必须用crash-xxx文件。

如何使用fuzzing测试发现c++代码中的安全漏洞? (libfuzzer入门)

libFuzzer 要求你提供一个 FuzzTarget 函数

libFuzzer 不是黑盒扫描器,它需要你把待测逻辑封装成一个接受 const uint8_t*size_t 的 C++ 函数。这个函数就是模糊测试的入口,libFuzzer 会不断传入随机字节流来触发边界行为。

常见错误是直接把原始输入(比如 JSON 字符串)硬编码进函数,或者忘了处理空指针、零长度等边界情况——这会导致崩溃被误报为漏洞,或漏掉真实问题。

  • 函数签名必须是 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
  • 不要在函数内调用 exit()abort() 或抛未捕获异常(除非你明确想让 libFuzzer 捕获该崩溃)
  • 如果被测代码内部有内存分配/释放逻辑,确保 Data 内容不会越界读取(例如用 Size 做长度校验后再构造 std::string_viewstd::vector
  • 避免依赖全局状态或文件系统;每次调用应尽可能独立

编译时必须启用 -fsanitize=address,fuzzer 且禁用优化

libFuzzer 本身不检测内存错误,它依赖 ASan(AddressSanitizer)等 sanitizer 来发现堆溢出、UAF、溢出等问题。没有 sanitizer,多数 C++ 安全漏洞根本不会暴露为崩溃。

典型错误是只加了 -fsanitize=fuzzer 却漏掉 addressundefined,结果跑半天只看到 “timeout” 或 “done”,却没触发任何 crash。

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

UP简历
UP简历

基于AI技术的免费在线简历制作工具

下载
  • 推荐完整编译命令:clang++ -g -O1 -fsanitize=address,fuzzer -fno-omit-frame-pointer fuzz_target.cpp -o fuzz_target
  • -O1 是安全阈值;-O2 及以上可能让 sanitizer 失效或掩盖崩溃路径
  • 链接阶段不能漏掉 -fsanitize=fuzzer,否则会报错 undefined reference to __fuzzing_entry_point
  • 若被测代码含 C++ 异常,建议加 -fsanitize=undefined 捕获未定义行为(如 signed integer overflow

崩溃复现必须用原始 crash-xxx 文件,不能靠日志猜

libFuzzer 发现崩溃后会生成类似 crash-123abc... 的二进制文件。这些文件内容就是触发崩溃的最小输入字节序列。靠日志里 “heap-use-after-free on address 0x…” 这类信息去手动构造输入,99% 会失败。

原因在于:崩溃路径高度依赖输入中特定字节的位置、长度和数值组合,微小改动就绕过触发点。

  • 复现命令:./fuzz_target ./crash-123abc...
  • 调试命令:gdb --args ./fuzz_target ./crash-123abc...,然后 r 即可精准停在崩溃点
  • 如果 crash-xxx 文件在另一台机器上无法复现,大概率是编译环境不一致(ASan 版本、libc++ vs libstdc++、甚至 clang 版本差异)
  • 别删 corpus 目录——它存着 libFuzzer 积累的有效输入,重启 fuzz 时加 -runs=0 可快速验证已有用例是否仍触发崩溃

自定义字典和 -max_len 对发现 C++ 解析类漏洞很关键

纯随机字节对解析器(JSON/XML/自定义协议)效率极低。libFuzzer 支持通过 -dict 提供关键词字典,大幅提升覆盖关键字、结构标记、转义序列的概率。

-max_len 控制输入最大长度,设得太小(如默认 4096)可能错过长字段导致的堆膨胀或整数截断漏洞;设得太大(如 1MB)又会让单次执行过慢,拖垮整体 fuzz 效率。

  • 字典示例(json.dict):
    "{"
    "}"
    "["
    "]"
    ":"
    ","
    "null"
    "true"
    "false"
    "\""
  • 启动命令:./fuzz_target -dict=json.dict -max_len=65536 corpus_dir/
  • 对 C++ string/stringstream 解析逻辑,建议从 -max_len=1024 开始逐步加大,观察执行时间是否稳定在 100ms 内
  • 若目标函数内部有 memcpy(dst, src, n)n 来自输入,务必检查 n 是否受 Size 约束——这是整数溢出+越界写的高发区
实际跑起来你会发现,最难的不是写 LLVMFuzzerTestOneInput,而是让被测逻辑足够“干净”:没有全局锁、没有随机数依赖、没有外部网络调用。很多 C++ 项目卡在这一步,不是工具不会用,是代码本身没为可测试性设计。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1874

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2085

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

988

2024.11.28

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

34

2026.01.14

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

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

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