fuzzing 主要是用来干嘛
1. 探索代码路径(Code Coverage)
Fuzzing 的一个核心目标是最大化代码覆盖率。传统的测试可能只会测试程序的“阳光大道”,而 fuzzing 则会试图探索那些不寻常的、可能存在漏洞的角落
例如,一个覆盖率引导的 fuzzer(如 AFL 或 LibFuzzer)会记录下每个输入所执行的代码路径。如果一个新的输入能够触发一条未曾被执行过的代码路径,fuzzer 就会将这个输入保留下来,并对其进行变异,以期能更深入地探索该路径。这种方法使得 fuzzer 能够自动绕过复杂的逻辑检查,深入到程序的核心功能中去
2. 内存安全漏洞检测
许多安全漏洞都与内存操作有关,比如:
- 缓冲区溢出:向一个固定大小的缓冲区写入了超过其容量的数据,导致相邻的内存区域被覆盖
- 空指针解引用:程序试图访问一个空指针指向的内存
- 整数溢出:在进行算术运算时,结果超出了变量类型的最大值,导致意外的结果
Fuzzing 工具通过监控程序的内存访问行为来检测这些漏洞。例如,fuzzer 可以使用 Sanitizer 工具(如 AddressSanitizer、MemorySanitizer)来在运行时追踪内存读写,一旦发现非法访问,就会立即报告
3. 绕过输入验证
攻击者通常需要绕过程序的输入验证逻辑才能触发漏洞。从二进制角度来看,fuzzing 能够通过变异输入的字节来绕过这些验证
例如,一个网络协议解析器可能期望数据包的某个字段是一个特定的值。Fuzzer 会随机改变这个字段的字节,并观察解析器的行为。如果变异后的数据包导致程序进入一个异常状态,fuzzer 就找到了一个潜在的漏洞