WindRanger&BeaconFuzz
WindRanger 是一个基于 BeaconFuzz 算法的定向模糊测试工具,发表于 ICSE 2022,旨在高效引导模糊测试到达目标代码(如漏洞触发点)。其核心创新是 BeaconFuzz 策略,通过动态识别关键代码块(Beacon)来优化路径探索。
1. WindRanger 概述
1.1 是什么?
- WindRanger 是一个灰盒(Greybox)定向模糊测试工具,基于 AFL++ 改进,专门用于快速触发特定代码位置(如已知漏洞点)。
- 主要用途:
- 漏洞复现(如 CVE 测试)
- 补丁验证(检查修复是否有效)
- 关键代码覆盖测试
1.2 核心优势
| 对比对象 | 传统定向模糊测试(如 AFLGo) | WindRanger |
|---|---|---|
| 引导方式 | 静态控制流距离(固定优先级) | 动态 Beacon 识别(自适应优化) |
| 路径探索 | 容易陷入局部最优(长路径依赖) | 通过 Beacon 发现“捷径” |
| 效率 | 较慢(需大量变异) | 更快收敛到目标 |
2. BeaconFuzz:WindRanger 的核心算法
2.1 BeaconFuzz 的核心思想
BeaconFuzz 的核心是 Deviation Basic Blocks(偏离基本块,即 Beacon),它通过以下方式优化模糊测试:
- 静态分析阶段:
- 识别程序中能显著缩短到目标代码距离的分支(即 Beacon 块)。
- 例如:
if (x > 100)的分支比else分支更接近目标,则x > 100被标记为 Beacon。
- 动态执行阶段:
- 优先变异那些能触发 Beacon 块的输入,快速逼近目标。
2.2 BeaconFuzz 的工作流程
(1)静态分析(由 cbi 工具完成)
- 输入:
- 目标程序的 LLVM 字节码(
.bc文件) - 用户指定的目标代码行(如
decompile.c:398)
- 目标程序的 LLVM 字节码(
- 步骤:
- 构建控制流图(CFG):分析程序的基本块(Basic Block)和跳转关系。
- 计算静态距离:对每个基本块,计算其到目标代码的最短路径步数。
- 识别 Beacon 块:标记能显著缩短距离的关键分支(如
if-else中的某个分支)。
(2)动态模糊测试(由改进的 afl-fuzz 执行)
- 种子调度:
- 对输入队列中的种子,根据其是否触发 Beacon 动态调整优先级。
- 奖励机制:触发 Beacon 的种子会被更频繁地变异。
- 变异策略:
- 结合 AFL 的变异方式(如位翻转、算术变异),但偏向生成能覆盖 Beacon 的输入。
3. WindRanger 和 BeaconFuzz 的关系
3.1 WindRanger = BeaconFuzz + 工具链实现
| 组件 | 功能 | BeaconFuzz 的作用 |
|---|---|---|
cbi |
静态分析,插桩 | 识别 Beacon 块,计算距离 |
afl-fuzz |
动态模糊测试 | 基于 Beacon 动态调整种子优先级 |
beacon.txt |
记录 Beacon 触发情况 | 用于调试和优化引导策略 |
- BeaconFuzz 是windranger的核心导航算法,负责找到最优路径。
- 其他组件(如插桩、崩溃检测)是剩余fuzz流程的补全。