模糊测试基本流程:预处理、输入数据构造、输入选择、评估、结果分析。

根据模糊测试对程序内部信息分析的程度,现代的模糊测试方法可以划分为3类:黑盒模糊测试、灰盒模糊测试和白盒模糊测试。

AFL是覆盖率为导向的模糊测试工具,通过插桩的方法,采集输入数据对应的边覆盖率,作为模糊测试种子选取的衡量指标.通过使用进化算法以及精心构造的突变策略。

通过对源码进行重新编译时进行插桩(简称编译时插桩)的方式利用自动产生测试用例来探索二进制程序内部新的执行路径。AFL也支持直接对没有源码的二进制程序进行测试,但需要QEMU的支持。它可以:

  • 其可以高效地对二进制程序进行fuzzing,挖掘可能存在的内存安全漏洞,如栈溢出、堆溢出、UAF、double free等。
  • 由于需要在相关代码处插桩,因此AFL主要用于对开源软件进行测试。
  • 配合QEMU等工具,也可对闭源二进制代码进行fuzzing,但执行效率会受到影响。

1.预处理

工作:搜集目标相关信息并制定模糊测试的策略, 为监控目标在测试中的运行状态做必要的准备.通常依赖于插桩、符号执行以及污点分析这类程序分析技术

搜集目标相关信息,比如目标的输入数据格式、目标的内部结构,并为监控测试中目标的状态变化做必要的准备.

该环节面临的挑战是:使用什么程序分析技术,以及模糊测试究竟需要对目标内部信息有多详细的了解。

1.1插桩

插桩技术通向目标代码中合适的位置添加预设好的代码。获得程序的静态或动态执行信息,比如程序的抽象语法树,覆盖率以及函数内变量取值等。

动态插桩

是指在运行过程中对代码插桩。比如利用QEMU等模拟技术,可以获得程序运行时的信息,缺点是资源开销大。

静态插桩

通过gcc编译器在汇编语言上插桩,LLVM在生成中间语言LLVMIR(low level virtual machine intermediate representation)上插桩。优点是节省时间、速度快,缺点是依赖于程序源码。

1.2符号执行

将程序行为归结为逻辑领域的推理,通过构建一个表示程序执行的逻辑公式,可以同时推断一个程序在不同输入上的行为。该方法可以使模糊测试获得较好的覆盖率,并可以深入到程序深处。

静态程序执行

容易陷入路径爆炸中,用得不多。

动态符号执行

动态符号执行通过对程序进行实际执行与符号化执行,维护程序的实际执行和符号化状态,通过将难以求解的约束替换为实际值,缓解了符号执行的问题,并按照深度优先的搜索策略对目标程序进行了探索。(有点抽象)

存在的问题:

  • 路径爆炸问题依然存在,解决办法可以通过启发式算法,选择比较重要的路径探索。
  • 虽然动态符号执行使用实际值替换的方法,解决了一部分静态符号执行无法绕过的约束,但是也丢失了一部分路径,造成探索结果是不完整的。
  • 所有符号执行技术都受限于约束求解方法的能力。

1.3污点分析

观察程序中,哪些数据收到了预先准备好的污染源的污染,目的是跟踪污染源和汇聚点之间的信息流。

静态污点分析

通过对程序静态分析,获得程序控制流图、抽象语法树等信息, 依据数据流以及依赖关系进行污点分析。

动态污点分析

动态污点分析检测的可信度更高,但是检测结果是否全面, 取决于动态污点分析对程序的覆盖情况,而且动态污点分析会消耗更多的资源; 静态污点分析又会和符号执行一样,可能会陷入到路径爆炸中,而简化后的静态污点分析又存在着严重的过度污染问题。

2.输入构造

种子获取、种子筛选、种子突变

具体的挑战是如何在尽量满足语法语义检查的情况下,短时间内生成大量的输入,用以对目标做全面而深入的分析。

首先得到一个数据S,然后S按照一定的策略进行一定次数的变异,获得大量新数据I,最后将I输入到被测试对象中进行测试,其中数据S被称为种子seed,I是测试实际使用的输入数据。

3.评估

现阶段的研究聚焦于模糊测试器在2个指标上的表现:覆盖率暴露漏洞平均时间

覆盖率

软件测试中的一个衡量指标,指的是在测试过程中,对象被覆盖到的数目占总数的比例. 通常而言,高覆盖率更可能发现更多的隐藏漏洞,众多研究因此集中在覆盖率提升上。

  • AFL 使用上下文无关的边覆盖率作为评估指标。

  • Angora 使用上下文敏感的分支覆盖率。

  • VUzzer 使用了块覆盖率替代边覆盖率作为覆盖率评估的对象。

暴露漏洞平均时间

在 与 基 准 模 糊 工 具AFL的对比实验中,AFLGo复现单个漏洞的时间远比AFL少,这证明了该评估指标的有效性。此后Hawakeye同样使用了这一指标来证明其性能。Parmesan 在通过sanitizer来发现潜在漏洞的研究工作中,也是用暴露漏洞平均时间作为评估指 标同Angora等定向灰盒模糊工具进行比较。

4.结果分析

发生在模糊测试之后,主要目的是对于模糊测试的输出信息进行分析和处理。