0

0

c++如何使用Fuzz Testing发现安全漏洞_c++ libFuzzer与AFL实战

尼克

尼克

发布时间:2025-12-06 17:03:48

|

760人浏览过

|

来源于php中文网

原创

答案:本文介绍如何使用libFuzzer和AFL++进行C++模糊测试以发现安全漏洞。首先解释Fuzz Testing原理,接着详细演示libFuzzer的集成步骤:编写LLVMFuzzerTestOneInput函数、编译链接、运行并添加初始语料库;然后说明AFL++的安装、插桩编译、输入样本准备及测试启动流程;强调结合AddressSanitizer、UndefinedBehaviorSanitizer等工具提升检测能力,并提供优化建议如轻量target设计、无效输入快速返回、结构化输入处理及CI集成,最终指出持续将fuzzing融入开发流程是提升C++安全性关键。

c++如何使用fuzz testing发现安全漏洞_c++ libfuzzer与afl实战

在现代C++开发中,安全漏洞如缓冲区溢出、空指针解引用、内存泄漏等常常隐藏在输入处理逻辑中。传统的测试方法难以覆盖所有边界情况,而模糊测试(Fuzz Testing)通过自动生成大量随机或半随机输入,能有效暴露这些潜在问题。libFuzzer 和 AFL(American Fuzzy Lop)是目前最主流的两款模糊测试工具,支持C/C++项目,本文将结合实战说明如何使用它们发现安全漏洞。

什么是Fuzz Testing?

Fuzz Testing 是一种自动化测试技术,通过向程序输入大量非预期或畸形数据,观察其是否崩溃、死循环或产生未定义行为。它特别适合检测由外部输入触发的安全漏洞,比如解析器、网络协议、文件格式处理模块等。

与传统单元测试不同,Fuzz 测试不依赖预设的测试用例,而是利用反馈机制(feedback-driven)持续优化输入,提高代码覆盖率,从而更可能触达深层缺陷。

libFuzzer 实战:集成到C++项目

libFuzzer 是 LLVM 项目的一部分,以内联方式运行,速度快、集成简单,适合配合 AddressSanitizer(ASan)、UndefinedBehaviorSanitizer(UBSan)等工具使用。

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

1. 编写Fuzz Target函数

每个 libFuzzer 测试都需要一个入口函数:LLVMFuzzerTestOneInput,它接收数据指针和长度:

#include 
#include

extern "C" int LLVMFuzzerTestOneInput(const uint8_t data, size_t size) { // 示例:测试一个假想的字符串解析函数 if (size > 0) { char buffer = new char[size + 1]; memcpy(buffer, data, size); buffer[size] = '\0';

    // 假设 parse_input 是你项目中的易错函数
    parse_input(buffer);  // 可能存在越界、空指针等问题

    delete[] buffer;
}
return 0;

}

2. 编译与链接

使用 clang 编译,并启用 sanitizer 和 libFuzzer:

clang++ -g -fsanitize=address,fuzzer \
  -fsanitize=undefined \
  fuzz_target.cpp your_parser.cpp \
  -o fuzz_target

3. 运行Fuzzer

./fuzz_target

libFuzzer 会持续运行,打印覆盖率信息。如果程序崩溃,它会保存导致崩溃的输入样本(corpus)到磁盘,便于复现。

4. 添加初始语料库(Corpus)

提供一些合法输入样本可加速测试进程:

mkdir corpus && echo "test input" > corpus/seed.txt
./fuzz_target corpus

AFL++ 实战:强大的遗传算法Fuzzer

AFL++ 是 AFL 的增强版,支持更多架构和检测模式,尤其擅长黑盒和灰盒测试。

蚂蚁PPT
蚂蚁PPT

AI在线智能生成PPT

下载

1. 安装AFL++

大多数 Linux 发行版可通过包管理安装,或从 GitHub 构建:

git clone https://github.com/AFLplusplus/AFLplusplus.git
cd AFLplusplus
make && sudo make install

2. 使用 afl-clang-fast 编译目标程序

需要插桩(instrumentation)编译:

afl-clang-fast++ -g -fsanitize=address \
  fuzz_target.cpp your_parser.cpp \
  -o fuzz_target

3. 准备输入样本目录

mkdir inputs
echo "hello" > inputs/hello.txt
echo "12345" > inputs/number.txt

4. 启动AFL测试

afl-fuzz -i inputs -o findings ./fuzz_target @@

AFL 会显示实时统计:路径数、崩溃数、执行速度等。发现崩溃后可在 findings/crashes 中找到具体输入文件。

结合 Sanitizer 提升漏洞检出能力

单独运行 Fuzzer 效果有限,必须搭配运行时检测工具:

  • AddressSanitizer (ASan):捕获缓冲区溢出、use-after-free
  • UndefinedBehaviorSanitizer (UBSan):发现整数溢出、移位越界等未定义行为
  • MemorySanitizer (MSan):检测使用未初始化内存

例如,在 libFuzzer 中同时启用 ASan 和 UBSan:

clang++ -g -fsanitize=address,undefined,fuzzer \
  fuzz_target.cpp your_code.cpp -o fuzz_target

当输入触发异常时,会输出详细堆和错误类型,极大简化调试过程。

实战技巧与注意事项

为了提升 fuzzing 效率和漏洞发现概率,注意以下几点:

  • 确保 fuzz target 尽量轻量,避免网络、线程、复杂初始化
  • 尽早返回无效输入,例如长度不足时直接 return 0
  • 对结构化输入(如JSON、XML),可使用 libprotobuf-mutator 配合 proto 定义提升有效性
  • 定期保存并去重语料库,使用 afl-cminlibFuzzer -merge=1 优化输入集
  • 在 CI 中集成 fuzz regression 测试,防止旧漏洞复发

基本上就这些。libFuzzer 上手快、集成方便,适合开发者日常使用;AFL++ 功能强大、变异策略丰富,适合深入挖掘复杂项目。两者结合 sanitizer 工具链,能显著提升 C++ 程序的安全性。关键在于坚持将 fuzzing 作为开发流程的一部分,而不是事后补救手段。

相关专题

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

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

417

2023.08.07

json是什么
json是什么

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

533

2023.08.23

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

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

311

2023.10.13

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

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

76

2025.09.10

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

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

1897

2024.04.01

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

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

2088

2024.08.01

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

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

1040

2024.11.28

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

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

精品课程

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

共48课时 | 7.7万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

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

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