使用 libFuzzer 进行模糊测试
使用 libFuzzer 对代码进行模糊测试,发现边界情况导致的崩溃
使用 libFuzzer 进行模糊测试 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
为什么要进行模糊测试?
模糊测试会生成随机输入,以查找崩溃、卡死和安全漏洞。现代模糊测试器会使用覆盖率反馈来逐步改进输入,探索新的代码路径。
libFuzzer
libFuzzer 是 LLVM 的一部分,并且可以与运行时检测器集成。编写一个对单个入口点进行模糊测试的函数,其余输入生成工作由框架驱动。
编写模糊测试目标
函数签名是固定的:接收一个字节数组,并返回 0。
#include <cstdint>
#include <cstddef>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
parse_input(reinterpret_cast<const char*>(data), size);
return 0;
}为 libFuzzer 编译
将 Clang 与 -fsanitize=fuzzer,address 组合使用。直接进行链接——不需要 main。
clang++ -g -O1 -fsanitize=fuzzer,address fuzz.cpp parser.cpp -o fuzz_target
./fuzz_target覆盖率引导的变异
libFuzzer 会跟踪每个输入执行了哪些代码路径。它会对有潜力的输入进行变异,以探索更深层的路径,这比盲目随机生成高效得多。
输入语料库
使用包含已知有趣输入的目录为模糊测试器提供种子。模糊测试器会通过对这些输入进行变异来生成新输入。
./fuzz_target corpus/字典文件
提供包含常见标记的字典,以加快对符合语法的输入(HTML、JSON、协议消息)的探索。
与运行时检测器结合
在 AddressSanitizer 下运行,可以将原本无声的内存损坏转化为模糊测试器能够检测的即时崩溃。
性能
在小型目标上,单个核心每秒可以执行数万次。运行数小时或数天,并让它在 CI 后台持续运行。
重现崩溃
当 libFuzzer 发现崩溃时,会将输入保存到磁盘。之后可以重放该输入进行调试。
./fuzz_target crash-abc123OSS-Fuzz
Google 的 OSS-Fuzz 会持续对开源项目运行模糊测试器并报告错误。许多知名库都已与它集成。
AFL 和 Honggfuzz
还有其他模糊测试器:
- AFL/AFL++——基于进程,并通过派生服务器提升速度
- Honggfuzz——支持网络协议
libFuzzer 是最容易集成到 C++ 中的模糊测试器。
何时进行模糊测试
对任何处理不可信输入的代码进行模糊测试:
- 解析器(JSON、XML、protobuf)
- 解码器(图像、音频、视频)
- 网络协议处理器
- 任何读取外部数据的代码
快速检查
为什么覆盖率引导的模糊测试比纯随机模糊测试更有效?
回顾
libFuzzer 是一个与 Clang 集成的覆盖率引导模糊测试器。编写一个小型 LLVMFuzzerTestOneInput 入口,使用 -fsanitize=fuzzer,address 构建,然后让它搜索崩溃。结合运行时检测器和输入语料库使用;对任何接触不可信输入的代码进行模糊测试。
常见问题解答
「使用 libFuzzer 进行模糊测试」课时是免费的吗?
是的 — 「使用 libFuzzer 进行模糊测试」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「使用 libFuzzer 进行模糊测试」这节课中我会学到什么?
使用 libFuzzer 对代码进行模糊测试,发现边界情况导致的崩溃 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 libFuzzer 进行模糊测试」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 静态分析工具:clang-tidy、cppcheck
- Sanitizer:Address、Thread、UB Sanitizer
- 使用 libFuzzer 进行模糊测试
- C++ 项目的持续集成