阅读笔记
Fuzz的分类:
- generation based和mutation based
- white box,gray box,black box
- directed 和 coverage-based
- dumb 和 smart
Fuzz的几个挑战
- 如何选取mutate种子输入(mutation based)
- 低的代码覆盖率
- 通过验证
方法
- 程序instrumentation和污点分析
- RNN,LSTM
Coverage-based fuzzing
方法 : 使用覆盖率来近似衡量达到的程序状态数量
- 将基本块作为最佳粒度
- 简单统计执行了的基本块和统计基本快的transition(记录点和记录边)
问题:
- 简单的统计执行了的基本块会导致信息丢失。
所以AFL是第一个引入边度量的。AFL提供两种插桩,compile-in,external。
compile-in -> gcc/llvm。外部模式提供qemu模式。
AFL通过代码插桩和AFLbitmap,追踪代码覆盖率,安全追踪被许多sanitizers做。
目标应用在执行前被插桩。
初始种子->选择->变异->testcase->执行->跟踪
关键问题
- 初始化问题。 在mutatio-based测试用例中,严重依赖于初始化种子的质量。
- 好的initial seed inputs节约时间,满足复杂文件格式的需求,更大的路径,重用
- 如何生成测试用例。
- 如何从pool中选择种子
- 如何有效的测试应用
通过程序分析,控制流和数据流, 更有针对性。
测试用例生成:
符合要求且触发难以到达的路径
在基于生成的方法中,可以使用机器学习来获取输入数据格式等。
在基于变异的方法中,应该首先修改影响控制流的字节,污点分析用于定为key location。
程序执行
覆盖更多代码,发现更多bug
不同应用模糊化
- 文件格式fuzzing 例如web浏览器
- kernal fuzzing。随机调用api,随机参数
未来的趋势
- 新的技术的融合
- smart fuzz (reinforcement)
- 硬件特性