模糊测试

概念
模糊测试(fuzz testing, fuzzing)是一种软件测试技术。其核心思想是将自动或半自动生成的随机数据输入到一个程序中,并监视程序异常,如崩溃、断言(assertion)失败,以发现可能的程序错误,比如内存泄漏。模糊测试常常用于检测软件或计算机系统的安全漏洞。
模糊测试包括几个基本的测试步骤:确定被测系统->确定输入->生成模糊数据->使用模糊数据执行测试->监控分析系统的行为->输出日志
Fuzzing通常由盲Fuzzing(Blind Fuzzing)和导向性Fuzzing(Guided Fuzzing)两种。
Blind Fuzzing生成测试数据的时候不考虑数据的质量,通过大量测试数据来概率性地触发漏洞。
Guided Fuzzing则关注测试数据的质量,期望生成更有效的测试数据来触发漏洞的概率,比如,通过测试覆盖率来衡量测试输入的质量,希望生成有更高测试覆盖率的数据,从而提升触发漏洞的概率。

基本方案
构造大量测试用例(初始seed)
筛选可行测试用例(seed选择)
种子变异(对seed代码进行简单修改)
程序执行测试用例
若出bug则保存该用例,否则继续执行第二步
AFL模糊测试工具
指令插桩和边覆盖。首先AFL是基于插桩的,能够辅助程序分析;其次AFL是基于边覆盖的,是对Charlie Miller等人基于块覆盖用样本筛选的一个改进和提升。
AFL工作流程大致如下:
从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage);
选择一些输入文件,作为初始测试集加入输入队列(queue);
将队列中的文件按一定的策略进行“突变”;
如果经过变异文件更新了覆盖范围,则将其保留添加到队列中;
上述过程会一直循环进行,期间触发了crash的文件会被记录下来。
