1、Abstract
本文主要是对错误处理代码进行模糊测试,现在的模糊测试技术主要是基于生成和变异的方法来生成种子,尽可能的覆盖代码执行路径,从而发现错误。但是在测试错误处理代码方面非常有限,因为一些错误处理代码只能由偶发错误(例如内存不足和网络连接故障)触发,而不能由特定的输入触发。
所以在本文中作者提出了一个名为FIFUZZ的模糊测试框架,有效的测试错误处理代码。FIFUZZ的核心是上下文相关的软件故障注入(software fault injection,SFI),该方法可以有效地覆盖错误处理代码,并且可以查找隐藏在具有复杂上下文关系的错误处理代码中的深层错误。
最后FIFUZZ与上下文无关的SFI和现有的模糊测试工具(AFL,AFLFast,AFLSmart和FairFuzz)进行了比较, FIFUZZ发现了这些工具遗漏的许多bug。
2、Background & Introduction
2.1 错误处理代码
错误处理代码是指由于特殊的执行条件,例如用户的无效输入,内存不足和网络连接故障,程序在运行时遇到的特殊情况。我们将这些异常情况称为错误,用于处理错误的代码称为错误处理代码。(例如try / catch中的catch内容)
另外错误可以分为两类:分别是与输入有关的错误和偶发性的错误。与输入相关的错误是由无效输入引起的,例如异常的命令和错误的数据,这类错误可以通过提供特定的输入来触发,目前的模糊测试技术主要也是触发此类错误。
偶发性的错误是由偶尔发生的异常事件引起的错误,例如内存不足或网络连接失败,此类错误与执行环境和系统资源(例如内存和网络连接)的状态有关,但与输入无关,因此现有的模糊测试技术很难触发该错误。
2.2 错误处理代码的特点
- 错误处理代码很重要,但它本身很容易出错
- 错误处理代码很难正确实现,因为它通常涉及特殊和复杂的语义
- 错误处理代码也难以测试,因为此类代码很少执行
- 错误处理代码引起的关注也比较少
由于这些特点,错误处理代码中可能会存在许多bug,并且这些bug可能会有比较大的危害。另外通过作者的调研发现,许多CVE漏洞都是由错误处理代码引起的(例如CVE-2019-7846,CVE-2019-2240,CVE-2019-1750和CVE-2019-1785)。