fuzzing-obstacles 是做什么的?
用于修补代码以克服模糊测试障碍的技术。当校验和、全局状态或其他屏障阻碍模糊器进度时使用。
概述
模糊测试是一种强大的自动化测试技术,但当目标代码包含校验和、全局状态依赖或复杂的条件检查时,模糊器可能无法有效探索代码路径。该技能提供了一系列经过验证的修补策略,帮助绕过这些障碍,使模糊器能够发现更深层次的漏洞。
支持的平台
该技能适用于任何基于覆盖率引导的模糊测试平台,包括但不限于:
- AFL/AFL++
- LibFuzzer
- Honggfuzz
- ClusterFuzz
常见障碍及修补技术
校验和(Checksums)
当代码对输入数据进行校验和验证时,模糊器生成的随机输入几乎不可能通过检查。常见的修补方法包括:
- 替换校验和检查:将校验和验证函数直接替换为返回成功值(如
0)的桩函数。 - 移除校验和:完全删除校验和检查逻辑。
- 硬编码跳过:在检测到特定标记时跳过校验和检查。
示例:
// 原始代码
if (checksum(data) != expected) {
return ERROR;
}
// 修补后代码
if (0) { // 始终跳过
return ERROR;
}
全局状态(Global State)
全局状态(如计数器、标志变量)可能导致模糊器在不同测试间无法保持一致性。修补方法包括:
- 重置状态:在每次模糊测试输入前重置相关全局变量。
- 移除状态依赖:将全局状态转换为局部变量或完全移除。
- 使用原子操作:确保状态更新是线程安全的。
示例:
// 修补后代码
void reset_global_state() {
global_counter = 0;
initialized = true;
}
复杂条件检查
当存在深度嵌套的条件或基于魔数(magic numbers)的检查时,模糊器可能难以满足所有条件。修补方法包括:
- 简化条件:将多个条件合并或移除不必要的检查。
- 使用模糊器友好变量:将魔数替换为可配置的宏或变量。
- 引入暴力搜索:对于少量魔数,使用暴力搜索辅助模糊器。
实用建议
- 始终保留原始代码的备份。
- 使用预处理器宏(
#ifdef FUZZING)来有条件地启用修补代码,便于维护。 - 在修补后运行现有测试套件,确保未引入功能性回归。
- 对于复杂障碍,考虑使用
ASAN(AddressSanitizer)等工具辅助调试。
结论
通过应用这些修补技术,您可以显著提高模糊测试的效果和覆盖范围,帮助发现那些隐藏在不同障碍背后的漏洞。记住,关键在于识别瓶颈并选择合适的绕过策略。
该技能基于实际模糊测试经验编写,持续更新中。