模糊测试

模糊测试是一种通过向目标程序提供大量随机数据用以测试其是否崩溃的程序动态测试技术。模糊测试的概念首先由威斯康辛大学的 Barton Miller 于 1990 年左右提出,随后,模糊测试被广泛应用于软件的漏洞挖掘,其效果十分显著。模糊测试效果的好坏取决于测试数据的有效性,如何产生尽可能多的有效测试数据是关键。根据测试数据的产生方式,可以把模糊测试分为四类:纯随机模糊测试,基于变异的模糊测试,基于规则的模糊测试和导向性模糊测试。纯随机模糊测试是最简单的模糊测试技术,模糊器直接把纯随机产生的数据作为待测程序的输入,以观察待测程序的反应。随机产生的输入数据可以是命令行参数、事件信息、网络数据包或者是包含随机数据的文件等等。基于变异的模糊测试则根据一定的变异算法,对提供的有效初始输入数据进行变异,把变异后的数据作为待测程序的输入数据,变异算法的好坏决定了模糊测试的效率。

基于规则的模糊测试根据待测程序对输入数据的约定来产生测试数据,这样能够避免将用于输入合法性验证的输入数据随机化,从而确保每次产生的测试数据对于待测程序来说都是有效数据。基于规则的模糊测试能够提高待测程序的代码覆盖率,尤其是针对那些处理高度结构化的数据和具有校验和的待测程序,但它需要预先分析每种待测程序的输入规则,并依此进行输入数据规则的编写,这项工作相当耗时。2012 年,Rosario Valotta 在《Taking Browsers Fuzzing To The Next (DOM) Level》提出了一种新的专门针对浏览器设计的高效模糊测试工具 nduja fuzzer。

导向性模糊测试是指利用一定的导向规则来指导模糊测试,一般的导向性模糊测试是指基于代码覆盖率导向的模糊测试,也称作测试用例生成导向的模糊测试。微软的 SAGE 是一种导向性模糊测试工具,在模糊测试过程中 SAGE 首先构造一个有效的输入 Input0 发送给待测程序 P,然后利用符号执行引擎收集 P 在输入为 Input0 时对应的执行路径上的路径约束,并对收集到的某一路径约束条件取反后进行约束求解,计算出新的输入数据 Input1,Input1 产生的执行路径与 Input0 产生的执行路径不同,之后把 Input1 发送给 P 继续进行同样的处理。 SAGE 利用了程序的控制流信息,确保每次执行都会执行一条新的执行路径,从而提高了代码的覆盖率,SAGE 在微软待发布的软件中找出了大量的漏洞。李根等开发的 Hunter 也属于导向性模糊测试工具。

目前,针对大型软件的漏洞挖掘主要依赖于模糊测试,但是由于待测软件的输入空间非常大,导致模糊测试的效率不高。模糊测试的工具主要有 Sulley、SPIKE、Peach、Bestorm、Spider Pig 等等。

最后更新于