在《模糊测试-强制发掘安全漏洞的利器》一书中,将模糊测试定义为“通过向应用提供非预期的输入并监控输出中的异常来发现软件中的故障的方法”。
模糊测试方法
-
预生成测试用例:要求首先研究特定的规约,理解该规约支持的数据结构和可接受的值的范围;然后依据这些理解生成用于测试边界条件或是违反规约的测试用例;接下来使用这些测试用例来测试该规约实现的完备性。
-
随机生成输入:随机方法简单地向目标发送伪随机数据,希望得到最好或是最坏的结果。
-
手工协议变异测试:在加载了目标应用后,测试者仅仅通过输入不正确的数据,试图使服务器崩溃,或是诱发一些不正常的行为。
-
变异或强制性测试:模糊测试器从一个有效的协议样本或是数据格式样本开始,持续不断的打乱数据包或是文件中的每一个字节、字、双字或字符串。
-
自动协议生成测试:首先对被测应用进行研究,理解和解释协议规约或文件定义,创建一个描述协议规约如何工作的文法;采用这种方法,测试者可以识别出数据包或是文件中的静态部分和动态部分,动态部分就是可以被模糊化变量替代的部分;随后,模糊测试器动态分析包含了静态和动态部分的模板,生成模糊数据,将结果数据包或是文件发送给被测应用。
模糊测试器类型
-
本地模糊器:测试目标主要是运行在本地的应用。主要包括命令行测试器(clfuzz工具,iFUZZ工具),环境变量模糊测试器(ShareFuzz工具,iFUZZ工具),文件格式模糊测试器(FileFuzz工具,notSPIKEfile和SPIKEfile工具,PAIMElfilefuzz工具)
-
远程模糊测试器:测试目标是在网络上打开端口监听的应用,主要包括网络协议模糊测试器(SPIKE工具,Peach工具),Web应用模糊测试器(WebScarab工具,SPI Fuzzer工具,Codenomicon HTTP工具),Web浏览器模糊测试器(mangleme工具,DOM-Hanoi工具,Hamachi工具等)
-
内存模糊测试器:内存模糊测试的一种实现方法是对进程执行一次快照,在生成快照后迅速向该进程的输入处理子例程中注入故障数据。当执行完一个测试用例后,恢复上次的快照并注入新的数据,重复以上过程直到所有测试用例都执行完成。
开发模糊测试器所需要的基本思想
-
可重现性与文档:对模糊测试工具的一个显而易见的需求是它应该能够重现单个测试和一组测试的测试结果。
-
可重用性:如果打算建立一个文件格式模糊测试工具,那肯定不希望每次测试新的文件格式时重写整个工具。可以创建一些可重用的功能,这些功能能在测试不同的文件格式时节省时间。
-
过程状态和过程深度:我们将过程状态定义为目标进程在任意给定时刻所处的具体状态。如ssh服务器,在连接到服务器之前,客户端处于初始状态,在认证过程中,服务器处于认证状态,一旦服务器成功认证了用户,服务器就处于认证状态。过程深度是为了达到某特定状态所需要“前进“的步数的度量。如ssh服务器中,已认证状态比认证状态位于更”深”的位置,因为认证状态是达到已认证状态所需的一个子步骤。
-
跟踪、代码覆盖与度量:代码覆盖指的是模糊测试器能够让被测应用达到和执行的过程状态的数量。在进行模糊测试时,人们经常会问“我们怎么开始”,然而,另一个问题更重要:“我们该在什么时候结束?“
-
错误检测:产生和传输可能引发异常的数据只是打赢了模糊测试战役的一半,战役的另一半是精确的识别出一个已经出现的错误。下一代的错误检测技术是使用轻量级的调试客户端来检测异常条件中被测目标中的发生。