logo资料库

论文研究-模糊测试理论及应用综述 .pdf

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
5 10 15 20 25 30 35 40 中国科技论文在线 http://www.paper.edu.cn 模糊测试理论及应用综述 裴霄潇,梁洪亮** (北京邮电大学计算机学院,北京 100876) 摘要:模糊测试技术的产生已将近三十年,该技术在发现软件漏洞、保证软件质量方面有着 十分重要的作用。模糊测试背后的关键思想是生成大量的测试用例并输入给被测程序,以触 发被测程序中存在的问题。模糊测试从最初的黑盒测试发展成灰盒、白盒测试,在这一过程 中逐步融合了诸如符号执行、污点分析、机器学习等的其他技术。本文对模糊测试的一般过 程、分类、应用、存在问题做出了详细的归纳阐述,并对其未来发展方向做出了预测。 关键词:计算机软件与理论;模糊测试;漏洞检测;测试用例生成;模糊测试工具 中图分类号:TP311 Summary of the Theory and Application of Fuzzing Pei Xiaoxiao, Liang Hongliang ( Computer School, Beijing University of Posts and Telecommunications, Beijing 100876) Abstract: Fuzzing has been proposed for about thirty years. This technique plays a crucial role in detecting software venerability and ensuring software quality. The key idea behind fuzzing is to generate plenty of test cases and feed them to the target program in order to trigger bug-inducing code fragments. Originating from black-box testing, fuzzing gradually developed into gray-box and white-box testing. During this process, it mixed lots of other techniques, including symbolic execution, taint analysis, machine learning, etc. In this paper, we summarize the general process, classification, application and existing problems of fuzzing in detail. Besides, we also make prediction for the future research directions of fuzzing. Key words: Computer Software and Theory; Fuzzing; Bug Detection; Test Case Generation; Fuzzer 0 引言 模糊测试—“一种自动软件测试技术,通过向被测软件输入大量的测试用例(文件、网 络协议数据包等能够被所测试的软件处理的输入数据)来覆盖大量的边界情况,以发现软件 中可以被利用的漏洞[1]”。模糊测试的概念最初由 Barton Miller 等人于 1989 年提出[2],自此 之后逐渐发展成为一种高效、迅速且实用的发现软件错误的技术。该技术背后的核心思想是 生成大量的测试用例输入给被测程序,意图触发被测程序中存在问题的代码片段。模糊测试 技术中最需要创造力的地方在于设计产生测试用例的方法。根据被测软件的不同,模糊测试 产生测试用例的方法可分为两大类:基于生成和基于变异。当被测软件对输入数据的格式有 较高的要求时(如被测软件是 C 编译器,那么只有当测试用例符合 C 语言的语法时才可被 编译器正常处理),模糊测试工具常常设计成基于生成的,即预设输入数据的语法规则,根 据该规则生成被测程序可处理的输入数据。而当被测软件对输入数据的格式没有较高的要求 时,模糊测试工具常常被设计成基于变异的,此时需要测试者给定初始格式良好的种子测试 用例,之后模糊测试工具会根据预设的变异规则(如比特反转、代码段删除/增添等)来对 种子用例进行变异以生成大量测试用例。 作者简介:裴霄潇(1993-),女,主要研究方向:模糊测试和符号执行 通信联系人:梁洪亮(1972-),男,副教授,硕导,主要研究方向:可信软件与智能系统. E-mail: hliang@bupt.edu.cn - 1 -
45 50 55 60 65 70 中国科技论文在线 http://www.paper.edu.cn 模糊测试通过不断地向被测软件输入半有效的数据模拟了攻击者的行为,也正是因为这 些不规则的输入数据,人们常常可以利用模糊测试工具发现隐藏在软件中的未被发现的漏 洞,这也是模糊测试能够在软件测试领域中占据重要一席之地的原因。虽然模糊测试如此实 用,但一直以来它在产生测试用例过程中存在的盲目性也是阻碍其发展的一个主要问题,因 此现代模糊测试常结合路径覆盖导向策略、基因算法、符号执行、污点分析等技术来改善这 一问题。如今,模糊测试技术已经被广泛应用于测试不同的软件,包括编译器、网络协议、 操作系统内核等等。 1 模糊测试的分类 根据运行时从被测程序中获取信息的多少,模糊测试技术可以分为黑盒、白盒和灰盒三 类[3]。获取的信息可以是路径覆盖信息、程序内存使用情况、CPU 利用率或其他对指导测试 用例生成有帮助的信息。 1.1 黑盒模糊测试 传统的黑盒模糊测试也称为“黑盒随机测试”,它最初采用基于变异的方法生成测试用 例,不需要从被测软件中获取任何运行时信息,只根据预设的变异策略对给定的种子测试用 例进行变异来产生新的测试用例。随着技术的发展,黑盒模糊测试也逐渐开始使用基于生成 的策略,如利用预设的语法规则[4]或输入格式相关的知识[5]来产生半有效的输入数据。 黑盒模糊测试简单、有效,因此它在工业界的应用十分广泛[6]。然而黑盒模糊测试的缺 点也显而易见,如图 1 所示,如果输入是随机的,那么在最后一个分支体内的 abort()只有 1/2^32 的概率能被触发。这个例子直观地说明了为什么对于黑盒模糊测试而言覆盖大部分程 序路径是很难做到的。因为这种内在的盲目性,黑盒模糊测试在实际使用中的代码覆盖率往 往不高。这也是近年来模糊测试的研究者越来越多地引入代码插桩[7]、污点分析[8] [9] [10]和其 他技术来使得模糊测试更加“智能”的原因,也是白盒模糊测试和灰盒模糊测试出现的原因。 图 1 黑盒模糊测试缺点示例代码 1.2 白盒模糊测试 白盒模糊测试基于对被测软件内部代码逻辑的掌握[11],理论上白盒模糊测试生成的测 试用例可以覆盖绝大多数程序路径。该技术由 Godefroid 等人于 2008 年首次提出[12],为了 克服黑盒模糊测试内在的盲目性,Godefroid 等人决定探索一种替换方法,并称其为白盒模 糊测试,他们利用动态符号执行[13]和启发式搜索算法使得白盒模糊测试能够全面地覆盖被 测软件的程序路径。 与黑盒模糊测试不同,白盒模糊测试会从被测软件中获取反馈信息并利用这些信息来指 导测试用例的生成。具体来说,白盒模糊测试生成测试用例生成方法是:给定具体输入并运 - 2 -
75 80 85 90 95 100 105 110 中国科技论文在线 http://www.paper.edu.cn 行被测程序,与此同时符号化输入数据,接着在程序运行的路径上收集有关符号化输入变量 的约束表达式,即收集程序在条件分支处有关输入变量的方程式,最后得到能够代表在该程 序路径的约束表达式集合,称为路径约束,最后再逐个对该路径约束中的单独约束表达式进 行求反求解得到能够使程序执行其他路径的具体输入。 理论上,白盒模糊测试产生的测试用例可以覆盖绝大多数程序路径,但实际上,由于软 件路径数量过多、约束求解器求解能力有限等问题,采用白盒模糊测试并不能达到对程序路 径百分百的覆盖,并且其运行速度也较为缓慢。目前最著名的白盒模糊测试工具是由微软开 发的 SAGE[6],该工具针对 Windows 上的大型应用程序,采用了许多优化策略来应对程序路 径数目众多造成的麻烦,能够自动发现安全相关的程序问题并已取得了显著成果。 1.3 灰盒模糊测试 灰盒模糊测试介于黑盒和白盒模糊测试之间,它借助从被测软件中获取的少量信息来指 导测试用例生成,以高效地发现程序中存在的错误。灰盒模糊测试常使用代码插桩技术,即 向被测程序插入一些不会影响其逻辑的代码以在运行时获取有关程序路径等的信息,之后再 利用这些信息指导测试用例的生成。如目前十分流行的灰盒模糊测试工具 AFL 就采用了这 样的策略,AFL 会利用代码插桩技术获取程序运行时的路径信息,如果产生的测试用例能 够触发新的程序路径,则将该测试用例标记为“优质的”,并在下一轮变异中基于这些测试用 例来变异产生新的测试用例,而余下不能发现新路径的测试用例就会被淘汰。另外,还有根 据获取的程序路径信息采用基因算法来调整变异策略的研究工作[3]。代码插桩除了用于获取 程序路径信息外还可以用于进行污点分析,污点分析即将外界输入标记为污点数据,在程序 执行时追踪这些污点数据的流向。该技术在模糊测试领域内的一个应用场景是:如果有污点 数据到达程序内部敏感 API,就重点对这些外界数据进行变异,来检查在大量不同外界输入 下,被测程序在调用这些敏感 API 时是否会发生异常行为。 灰盒和白盒模糊测试很相似,它们都会在运行时获取被测软件的相关信息来指导测试用 例的生成,它们的不同之处在于:灰盒模糊测试只获取部分的被测程序信息(如所覆盖的程 序路径、污点数据流向等),并且通过这些获取到的信息来指导测试用例的生成也只是起到 辅助的作用,即不能保证所产生的测试用例一定能够覆盖到新的程序路径。与之相比,白盒 模糊测试会对被测软件进行系统地路径探索,并且通过约束收集和约束求解保证生成的测试 用例一定能够引导被测软件走向新的程序路径。总而言之,白盒和灰盒模糊测试都利用了被 测软件的结构信息来指导测试用例的产生,但它们所利用信息量不同,白盒模糊测试在更大 程度上消除了黑盒模糊测试中存在的盲目性。 1.4 黑盒、白盒和灰盒的对比 根据被触发或被发现的难易程度,软件错误可以被分为两种类型:“浅层”和“深层”。能 够导致软件在运行初期就发生问题的软件错误可被视为处于“浅层”,而埋藏在软件代码逻辑 深处的很难被触发的错误可被视为处于“深层”。一般而言,传统的黑盒模糊测试的代码覆盖 率不高,且触发的软件错误往往处于“浅层”,但这种技术具有轻量级、快速、易用的特性。 与之相比,白盒和灰盒模糊测试能够达到相对较高的代码覆盖率,并且可以发现“深层”的有 关程序安全性和正确性的错误,但其代价是较为复杂和耗时。 总体而言,“笨拙”和“智能”的模糊测试技术各自有不同的优缺点及适用场景。如果测试 需求中高速比高质量更重要,那么传统的黑盒模糊测试就是更好的选择。例如,一个软件从 - 3 -
115 120 125 130 135 140 中国科技论文在线 http://www.paper.edu.cn 没有进行过总体测试,且测试者希望尽快发现并消除常见的处于软件“浅层”的错误,那么使 用传统的黑盒模糊测试就是一个很好的开始。但若测试者对时间没有过多限制,更加看重测 试结果的质量(如发现软件错误的种类、可利用性和数量等),灰盒和白盒模糊测试就是更 优的选择。在灰盒和白盒模糊测试中,白盒模糊测试更有效,但也更耗时,且面临着诸多现 实困难(如路径爆炸、内存建模、约束求解不精确等)。故当测试时间充裕、被测程序不是 非常复杂的情况下,可以考虑使用白盒模糊测试。目前在工业界白盒模糊测试使用的还较少, 该技术更多地仍是在学术领域内进行研究,究其原因就是以上提到的一些在符号执行过程中 面临的问题,但其仍不失为一个很有发展潜力的方向。 2 模糊测试的一般过程 模糊测试是一种能够自动地、持续地生成测试用例,运行被测软件并监视被测软件异常 行的技术。模糊测试的一般过程如图 2 所示(其中加粗实线方框代表模糊测试工具中可能存 在的功能模块,细实线方框代表输入输出数据和模块之间传递的数据,而虚线代表数据流 向)。 图 2 模糊测试的一般过程示意图 下面就图 2 中每一功能模块的作用做细致讲解: 控制器:该功能模块通常会在白盒和灰盒模糊测试工具中出现,其作用是利用一些辅助 技术,如代码插桩、污点分析等,来获得如覆盖的程序路径、污点数据流等有利用价值的程 序运行时信息,以帮助指导测试用例的生成。当采用基于变异的测试用例生成方法时,需要 由测试者提供初始的种子测试用例,通常格式良好的(即被测软件可以正常接收、处理的文 件格式)种子测试用例会对产生高质量的测试用例有所帮助。当采用基于生成的测试用例生 成方法时则不需要种子测试用例。通常现实中的软件很难获取到源代码,故许多模糊测试工 具都设计成能够处理二进制程序,当然也有针对源代码的。 测试用例生成器:如前文所述,测试用例的生成方法分为基于变异的和基于生成的。第 一种方法对测试者提供的种子用例按照预设的变异策略进行变异,变异策略可以设计成能够 依据程序运行时情况自动调整的。第二种方法不需要种子用例,但需要模糊测试工具的设计 者预设测试用例的生成规则,这就需要利用输入数据的格式信息(如语法规则)。值得注意 的是,无论是基于变异还是生成,模糊测试产生的测试用例“半有效”状态最佳,即有效程度 - 4 -
中国科技论文在线 http://www.paper.edu.cn 使其能够通过被测程序初期的格式检查,但也有一定的随机性使其可能触发到一些边界情 况。 Bug 探测器:为了帮助测试者发现潜藏在软件中的 bug(软件错误),有些模糊测试工 具会设计一个 bug 探测器。当被测软件发生崩溃或报告了其他错误,bug 探测器就会收集、 分析这些信息(如堆栈信息跟踪[14])来帮助确认软件中是否存在错误。有的模糊测试工具不 包括这一模块,这是就要通过人工分析[15]的方式实现对软件错误的确认。 Bug 过滤器:安全相关的软件错误通常是测试者关注的重点,因此从所有软件错误中筛 选得到可利用的那些(即漏洞)也是一项很重要的工作。然而这项工作在大多数情况下还是 通过人工的方法来实现的,故而繁琐且耗时。目前已经有一些针对这一问题的研究工作,如 Yang Chen 等人提出了一种模糊测试结果(能够触发软件错误的测试用例)的排序方法[16], 该方法能够将能够触发软件中测试者感兴趣类型的软件错误的测试用例挑选出来,这样就能 节省大量人工筛选的工作量。 3 常用模糊测试工具 模糊测试是一项实用的软件安全性测试技术,它在工业界有着广泛的应用。目前有许多 针对不用类型的软件设计开发的模糊测试工具,本节将根据目标软件的不同介绍各类别当中 流行的模糊测试工具。表 1 总结了常用的模糊测试工具,并提供了其目标软件类型、采用的 关键技术、运行的平台等信息。 145 150 155 名称 Peach Trinity beSTORM jsfunfuzz SAGE Sulley IOCTL fuzzer Csmith LangFuzz AFL YMIR vUSBf Syzkaller TLS-Attacker kAFL 表 1 常用模糊测试工具 开发年份 目标软件类型 关键技术 是否开源 2004 2004 2005 2007 2008 2009 2009 2011 2012 2013 2013 2014 2016 2016 2017 通用 内核 通用 灰盒,基于变异/生成 黑盒,基于生成 黑盒,基于生成 JavaScript 引擎 黑盒,基于生成 Windows 应用 白盒,基于符号执行 黑盒,基于生成 黑盒,基于生成 黑盒,基于生成 黑盒,基于生成/变异 灰盒,基于变异 ActiveX 控件 白盒,基于符号执行 黑盒,基于生成 灰盒,基于生成/变异 黑盒,基于生成 灰盒,基于变异 网络协议 内核驱动 C 编译器 解释器 应用程序 USB 驱动 内核 网络协议 内核 开源 开源 商用 开源 不开源 开源 开源 开源 不开源 开源 不开源 开源 开源 开源 开源 160 3.1 编译器和解释器 Csmith 由 Xuejun Yang 等人[17]于 2011 年提出。它是一个针对 C 程序编译器的模糊测试工 具,可以根据预设的语法规则来生成随机的 C 语言程序作为测试用例。另外,它还使用了一种 叫做随机微分测试[18]的技术来帮助发现被测程序中存在的由 C 语言未定义行为等具有 C 语言特 定的正确性错误。经过多年的使用,Csmith 在商用和开源软件(如 GCC,LLVM 等)中发现了 成百个未知漏洞。虽然 Csmith 是一个很实用的模糊测试工具,但跟其他许多模糊测试工具一样, 165 - 5 -
170 175 180 185 190 195 200 中国科技论文在线 http://www.paper.edu.cn 它并不会根据触发的软件错误的重要性来对区分相应的测试用例,故而需要测试者花费许多人力 来筛选测试结果。 jsfunfuzz[19] 是 一 个 基 于 语 法 的 黑 盒 模 糊 测 试 工 具 , 它 的 测 试 对 象 是 Mozilla 的 Spidermonkey JavaScript 引擎,它是第一个公开可使用的 JavaScript 模糊测试工具。自 2007 年开发以来,jsfunfuzz 已经在 SpiderMonkey 中发现了超过 2000 个程序错误。它结合了微分 测试和有关目标软件的详细知识,因此能够高效地找到正确性错误和能够导致程序崩溃的错 误。但若想测试语言中的新特性,则需要对 jsfunfuzz 做相关的调整才可以。 3.2 应用软件 SAGE 是一个由微软开发的著名白盒模糊测试工具[6],它的测试对象是 Windows 系统上 的文件读取类的应用软件(如文件解析器,视频播放器,图片处理器等),该工具结合了动 态符号执行和启发式搜索算法来最大限度地提高代码覆盖率。自从 2008 年以来,SAGE 不 间断地在 100 多台机器上运行,并且自动测试了微软开发的几百个应用程序,它是第一个实 现了白盒模糊测试并应用于实践的工具。SAGE 的未来工作包括改进搜索算法、提高符号执 行的精确性和求解能力。如今,微软又提出了一个在线模糊测试项目,Springfield,它提供 了包括白盒模糊测试在内的多种技术来发现用户上传的二进制程序中的错误。 AFL 是一个十分流行的路径覆盖导向的灰盒模糊测试工具,它通过代码插桩获取程序 运行时的路径信息。当被测程序具有源代码时,插桩可于编译时引入,而当被测程序是二进 制代码时,插桩通过 QEMU 实现。AFL 采用变异的方法生成测试用例,并通过遗传算法选 择能够发现新的程序状态的优良测试用例作为下一轮变异的基础。实践证明,AFL 在测试 现实世界中的软件时表现出色,它的目标程序范围很广,包括文件压缩软件、图片分析软件 等。AFL 支持 C、C++和 Objective C 源程序和能够在 Linux 系统上运行的二进制程序。由于 AFL 性能优良,许多人以它为基础开发了许多其他工具,如针对内核调用的 TriforceAFL, 测试 Windows 系统上应用程序的 WinAFL 等。虽然 AFL 高效、易用,但它也还存在提升的 空间,如果被测程序中存在对输入数据的完整性检验或者解密等操作,该工具的使用效果就 会受到很大影响。 3.3 网络协议 Sulley 是一个针对网络协议的模糊测试框架。它为用户提供了许多可选数据类型,在开 启测试之前,用户通过选择合适的数据类型来定义所有必须的数据块,这些数据块会被用来 进行变异和融合以生成新的测试用例。Sulley 可以对发现的程序错误进行分类,可以并行执 行,还可以追踪触发程序错误的测试用例。但该工具目前已经停止维护,Boofuzz 是它的一 个分支和后继工具。 TLS-Attacker 是由 Somorovsky[20]于 2016 年开发的用于检测 TLS 库安全性的模糊测试平 台。利用 TLS-Attacker 提供的简单接口,测试者可以生成并随机修改 TLS 信息流以测试 TLS 库的行为。该工具成功检测出了许多常用 TLS 库中存在的漏洞,这些库包括 OpenSSL、Botan 和 MatrixSSL。 3.4 内核 Trinity[21]是近年来最有效的 Linux 内核模糊测试工具,它实现了多种方法来生成系统调 用所需要的参数。它所采用的准则是:1) 如果一个系统调用的参数具有明确的类型设定(如 - 6 -
205 210 215 220 225 230 235 240 中国科技论文在线 http://www.paper.edu.cn descriptor),则传递所需类型的参数。2) 如果一个系统调用的参数只有几个特定的有效值 (如’flags’域),则在有效的取值列表中取值。3) 如果一个系统调用的参数有一定取值范围, 则在该范围内随机取一值。Trinity 支持许多系统架构,包括 x86-64、SPARC-64、S390x、S390、 PowerPC-64、PowerPC-32、 MIPS、IA-64、i386、ARM、Aarch64 和 Alpha。 Syzkaller 是一个针对 Linux 内核的模糊测试工具,它的测试用例的生成基于预定义的模 板,这些模板指明了每一个系统调用的参数范围。与 Trinity 不同的是,Syzkaller 会利用代 码覆盖信息来指导模糊测试的过程。因为 Syzkaller 结合了路径覆盖导向技术和基于模板生 成的技术,它在测试用例生成方面确实要比只提供系统调用参数的类型要出色。该工具目前 处于维护开发的活跃期,并且初期效果令人称赞。 kAFL 是由 Schumilo 等人[22]于 2017 年提出的路径覆盖导向的内核模糊测试工具。它并 不针对特定系统的内核,它的测试对象可以是 Linux、macOS 和 Windows。kAFL 利用一个 hypervisor 来获得覆盖信息,并借助 Intel's Processor Trace 技术在运行时得到控制流信息。 目前该工具已经发现了 Linux 的 ext4 驱动、macOS 的 HFS 和 APFS 文件系统以及 Windows 的 NTFS 驱动中的几个错误。 3.5 嵌入式设备、驱动或组件 YMIR 由 Kim 等人于 2013 年提出,该工具采用了 API 级别的动态符号执行技术来产生 基于生成的模糊测试所需要的语法规则,它的测试对象是 ActiveX 控件。YMIR 将一个 ActiveX 控件作为输入,而将生成的对应于该控件的语法规则作为输出。该工具采用的动态 符号执行在库函数级别收集约束条件,而不是在插桩级别,故导致它速度快但精度相对较低。 vUSBf 在 2014 年的欧洲黑帽大会上被提出[23],它是一个针对 USB 驱动的模糊测试框 架。该架构在 KVM(Linux 内核虚拟机)上实现了一个虚拟 USB 模糊测试工具,在 QEMU 上实现了 USB 的重定向协议。通过使用简单的 XML 配置文件,vUSBf 实现了对几百万个 测试用例的动态定义。每一次测试都有其独一无二的标记,因此可以被重现。该工具可以发 现 Linux 内核和设备驱动器中的如下错误:空指针引用、内核页面请求、内核严重错误(内 核恐慌)、坏页以及段错误。 3.6 通用 beSTORM 是一个商用的黑盒模糊测试工具,它可以用于测试研究领域内正在开发的软 件的安全性,也可以用于测试准备投入市场的商用软件的质量,它不需要源代码而只需要二 进制程序。它采用的策略是先测试那些最可能存在问题的代码,再拓展到周边有限的区域内, 因此该工具可以很快的产生结果。beSTORM 应用领域广泛,包括网络协议、应用程序、硬 件、文件、WIFI 和 EDSA(嵌入式设备安全验证)等,例如利用 beSTORM 可以找到任何 使用 EDSA 402 标准的软件中的问题。 Peach 是近年来最成功的模糊测试工具之一,它的目标程序很广泛,最常见的包括驱动、 文件读取程序、网络协议、嵌入式设备和系统等。帮助 Peach 高速高效运行的组件包括:1) Peach Pits 是预定义语法规则文件,可单独使用称为 Pits,也可组合使用称为 Pits 包。2) Test passes 可以帮助衡量变异方法的效果,以生成更优的测试用例。3) Minset 负责精简测试用例 的大小。Peach 之所以能够成为工业界炙手可热的工具是因为它具有优秀的特性,例如先进 的威胁检测功能、预定义语法功能(Peach Pits)、可扩展的测试选项等。但 Peach(尤其是 其开源版本)也存在一些有待提高的地方,最主要的一点是构建 Pits 来描述被测程序输入数 - 7 -
245 250 255 260 265 270 275 280 中国科技论文在线 http://www.paper.edu.cn 据的语法需要消耗较多的人力和时间。 除去以上详细介绍的工具外,目前还有许多其他实用的模糊测试工具,例如用于测试 perf_event_open()系统调用的 perf_fuzz、用于测试库的 libFuzzer[24]、用于测试一般软件的 honggfuzz、用于测试安卓系统的 Droid-FF 等。另外,在内存错误检测工具(如 Clang 的 AddressSanitizer[25]和 MemorySanitizer[26])的帮助下,模糊测试技术发掘埋藏在程序逻辑更 深层的错误的能力得到了进一步加强。 4 技术难点及研究现状 本节将从输入的完整性验证、格式验证、种子测试用例的选取、模糊测试结果的筛选以 及新技术的融合这些方面来详述模糊测试现有的研究成果,选取这些方面是因为它们都是影 响模糊测试效率和结果的重要因素,目前关于模糊测试的大量研究都集中在这些热点上面。 除了总结在这些方面的重要研究成果外,本节对每一项研究成果的优点和待改进的地方也都 做出了论述和评价,且对存在的开放性问题和未来方向也提出了自己的见解。 4.1 完整性验证 传输和存储数据的过程中容易引入错误,为了验证收到的数据是否与发出时的一样,一 些软件采用了数据完整性验证机制。使用有关算法生成一个独一无二的校验和,该校验和与 原始数据一同发送给接收软件,接收软件再通过同样的算法对收到的数据进行计算,把得到 的结果与校验和作对比,相同则表明数据在传播的过程中没有发生改变[27]。为了对采用了 校验和机制的软件进行模糊测试,就要保证新生成的测试用例能通过校验和机制的检测。 Tielei Wang 等人[10]提出了一种基于污点分析的方法来解决这一问题,并开发了应用了 该方法的模糊测试工具 TainScope。TainScope 首先利用污点分析和预定义的规则来发现被测 程序中的校验和检验的位置,以及能够影响到敏感 API 的输入数据(hot bytes)。接着对 hot bytes 进行变异来生成新的测试用例,并修改被测程序中那些校验和检验位置以使所有新生 成的测试用例能够通过检测。最后修改那些能够导致程序崩溃的测试用例的校验和部分,得 到既能触发程序错误又能通过校验和检测的测试用例。 TainScope 能够准确定位程序中进行校验和检测的位置,能够大幅提高模糊测试处理这 类被测程序的有效性,但该工具还存在一些有待提高的地方。第一,它不能处理数字签名[28] 和其他安全性检测机制。第二,当传输的数据是加密的时,它的效果会受到很大影响。第三, 它忽略了控制流并且不支持对所有 x86 指令的插桩,这些都是该方向上有待解决的问题。 4.2 格式验证 网络协议、编译器/解释器等对输入数据的格式有着严格的要求,如果格式有问题则该 输入会在一开始就被拒绝。故对这类软件进行模糊测试,生成格式符合被测程序要求的测试 用例至关重要。 目前针对这一问题采取的主要解决方法是:利用有关输入格式的知识或语法来指导模糊 测试生成测试用例。Joeri de Ruiter 等人[5]采用了黑盒模糊测试外加机器学习的方法测试了九 个 TLS 协议的实现。Kyle Dewey 等人[29]提出了一种利用 CLP(约束逻辑编程)方法的模糊 测试技术来生成具有复杂语法规则的测试用例,并将其应用于测试 JavaScript 程序。Chen Cao 等人[30]第一次将输入格式验证技术应用到测试安卓系统服务上,并开发了一个输入验证漏 洞扫描工具。 - 8 -
分享到:
收藏