name: 模糊测试生成器 description: “创建模糊测试工具,用于生成随机输入以发现bug和安全漏洞。” version: “1.0.0” tags: [模糊测试, 安全, 测试, 发现bug, 随机生成] difficulty: 中级 languages: [python, rust, c, go] dependencies: [基于属性的测试器, 污点分析]
模糊测试生成器
创建模糊测试工具,自动生成随机输入以发现程序中的bug、崩溃和安全漏洞。
何时使用此技能
- 发现崩溃和内存安全问题
- 发现输入验证bug
- 安全漏洞发现
- 编译器bug发现
此技能的功能
- 输入生成: 创建目标程序的随机有效输入
- 覆盖跟踪: 监控代码覆盖以引导模糊测试
- 变异策略: 实现变异和基于生成的模糊测试
- 崩溃分析: 分类和最小化崩溃输入
关键概念
| 概念 | 描述 |
|---|---|
| 覆盖引导的模糊测试 | 使用覆盖来优先化输入 |
| 语料库 | 一组有趣的输入 |
| 变异 | 对现有输入的小改动 |
| 崩溃最小化 | 将输入简化为最小形式 |
提示
- 使用AddressSanitizer构建以发现内存安全bug
- 对于C/C++使用libFuzzer,对于Python使用Atheris
- 维护有趣输入的语料库
- 最小化崩溃以找到根本原因
相关技能
property-based-tester- 结构化属性测试taint-analysis- 跟踪不受信任的输入sandbox-builder- 安全的模糊测试环境
参考文献
| 参考 | 为何重要 |
|---|---|
| libFuzzer: 进程内覆盖引导的模糊测试 | LLVM模糊测试引擎 |
| AFL: American Fuzzy Lop | 流行的灰盒模糊测试器 |
| Finding Bugs in JavaScript Engines | 模糊测试案例研究 |
权衡和局限性
| 方法 | 优点 | 缺点 |
|---|---|---|
| 覆盖引导 | 高效,发现深度bug | 需要工具化 |
| 黑盒 | 不需要源代码 | 效果较差 |
| 基于语法 | 生成有效输入 | 需要语法 |
评估标准
| 标准 | 关注点 |
|---|---|
| 覆盖 | 高效的代码覆盖 |
| Bug发现 | 发现真实bug |
| 性能 | 高测试数/秒 |
质量指标
✅ 好: 覆盖好,发现bug,高吞吐量 ⚠️ 警告: 覆盖有限,慢 ❌ 坏: 没有发现bug,崩溃
研究工具和工件
模糊测试工具和框架:
| 工具 | 语言 | 学习内容 |
|---|---|---|
| libFuzzer | C/C++ | 进程内覆盖引导 |
| AFL++ | C | 灰盒模糊测试 |
| Honggfuzz | C | 反馈驱动 |
| Fuzzilli | JavaScript | JavaScript引擎模糊测试 |
| Oathbreaker | Python | 基于语法 |
模糊测试基础设施
- OSS-Fuzz - 持续模糊测试服务
- Fuzzbench - 模糊测试评估框架
研究前沿
1. 使用LLM进行模糊测试
- 方法: 使用语言模型进行输入生成
- 论文: “Fuzzing with LLMs” (2023+)
- 工具: ChatGPT辅助的模糊测试
2. 混合模糊测试
- 方法: 结合符号执行与模糊测试
- 论文: “Driller” (Shoshitaishvili)
- 工具: QSYM, Angora
实现陷阱
| 陷阱 | 实际后果 | 解决方案 |
|---|---|---|
| 覆盖平台 | 停止发现新路径 | 添加语料库,变异 |
| 崩溃重复 | 太多类似崩溃 | 最小化输入 |