0

0

c++如何进行模糊测试 c++ libFuzzer入门【安全】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-30 15:10:37

|

379人浏览过

|

来源于php中文网

原创

libFuzzer是C++中最常用、集成度最高且适合库函数级测试的模糊测试方案,需用clang≥v9配合ASan/UBSan编译,通过定义LLVMFuzzerTestOneInput函数实现目标测试,并依赖语料、字典和覆盖引导提升效果。

c++如何进行模糊测试 c++ libfuzzer入门【安全】

用 C++ 做模糊测试,libFuzzer 是最常用、集成度最高、也最适合库函数级测试的方案。它不是独立运行的黑盒工具,而是以 静态链接方式嵌入目标代码,配合 LLVM 编译器(clang)使用,能高效发现内存越界、空指针解引用、断言失败等安全问题。

一、环境准备:编译器与基础依赖

libFuzzer 是 LLVM 的一部分,需使用 clang(≥v9)并启用 sanitizer 支持:

  • 安装 LLVM 工具链(推荐通过官方预编译包或系统包管理器,如 Ubuntu 上 sudo apt install llvm-dev libclang-dev
  • 确保 clang++ 可用,且支持 -fsanitize=fuzzer,address,undefined
  • 无需额外安装 libFuzzer 库——它已随 clang 分发,头文件在 (可选),核心是链接 -fsanitize=fuzzer

二、编写一个最简 Fuzzer Target

关键:定义一个名为 LLVMFuzzerTestOneInput 的 C 风格函数,接收 const uint8_t* datasize_t size,返回 int(固定为 0):

// fuzz_target.cpp
#include 
#include 

// 假设你要测的函数(示例:一个有漏洞的字符串解析) bool parse_version(const char* s);

extern "C" int LLVMFuzzerTestOneInput(const uint8_t data, size_t size) { // 将输入转为以 '\0' 结尾的字符串(注意:原始数据可能含 \0,谨慎截断) if (size == 0) return 0; // 简单复制 + 添加终止符(实际中建议用 FuzzedDataProvider 或手动安全处理) char buf = new char[size + 1]; memcpy(buf, data, size); buf[size] = '\0';

parse_version(buf); // 被测函数

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

delete[] buf; return 0; }

⚠️ 注意:不要在 fuzzer 中做不可控的 I/O、sleep、随机数(除非可控种子)、全局状态修改;避免无限循环(可加简单计数保护)。

Proface Avatarize
Proface Avatarize

一个利用AI技术提供高质量专业头像和头像的工具

下载

三、编译与运行

用 clang++ 一次性编译+链接,开启 AddressSanitizer(ASan)和 UndefinedBehaviorSanitizer(UBSan)能显著提升 crash 捕获能力:

clang++ -g -O2 -fsanitize=fuzzer,address,undefined \
  -I/path/to/your/include \
  fuzz_target.cpp your_lib.cpp -o fuzzer

运行:

./fuzzer                    # 从内存生成随机输入,自动变异
./fuzzer corpus/            # 从已有语料目录启动(推荐,加速覆盖)
./fuzzer corpus/ -max_len=1024 -timeout=30

常见参数:-max_total_time(总运行秒数)、-jobs(多进程)、-workers(工作线程)。

四、提升效果的关键技巧

让模糊测试更准、更快、更深入:

  • 提供初始语料(corpus):放几个典型输入(如合法/非法 JSON、HTTP 头、协议片段)到文件夹,libFuzzer 会基于它们变异
  • 使用 FuzzedDataProvider:方便地从原始字节数组提取 int/float/string/vector,避免手写解析逻辑出错
  • 定制字典(-dict=):比如协议关键字、magic bytes,告诉 fuzzer 哪些 token 更可能触发深层逻辑
  • 覆盖引导(默认开启):libFuzzer 自动追踪代码块/边缘覆盖,优先变异能扩大覆盖的输入
  • 避免误报:若被测函数内部调用 exit()abort(),需重写为返回错误码,否则 fuzzer 会误判为 crash

不复杂但容易忽略:真正有效的 fuzzing 不靠暴力,而靠精准的目标函数封装 + 合理的输入建模 + 持续的语料维护。从一个干净的 LLVMFuzzerTestOneInput 开始,比套框架更重要。

相关专题

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

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

402

2023.08.07

json是什么
json是什么

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

528

2023.08.23

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

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

306

2023.10.13

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

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

74

2025.09.10

string转int
string转int

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

312

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

552

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

94

2025.10.23

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6035

2023.09.14

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

3

2025.12.30

热门下载

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

精品课程

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

共101课时 | 8.1万人学习

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

共39课时 | 3.1万人学习

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

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