定向模糊测试技术综述

作者: 张云菲 张月明 沈小茜 孙宇帆

定向模糊测试技术综述0

摘要:模糊测试技术是一种应用模糊过程来验证待测程序(PUT) 是否违反正确性策略的测试技术,被广泛应用于自动化漏洞挖掘。然而,模糊测试技术在生成测试用例的过程中,由于搜索空间过大,因此存在着较大的随机性和盲目性,无法有效率地找到潜在的漏洞。定向模糊测试技术通过定位到目标位置,提高了模糊测试的效率,被广泛应用于缺陷复现、补丁检验和静态分析验证。通过调研大量文献,分析了定向模糊测试的特征以及常见的模型,总结了多篇论文中定向模糊测试在目标识别、适应度、模糊优化方面使用的度量指标,阐述了当今定向模糊测试的几种应用场景,并在最后探究了若干未来可能的发展方向。

关键词:定向模糊测试;种子选择;调度方式;缺陷复现

中图分类号:TP311.5      文献标识码:A

文章编号:1009-3044(2023)31-0074-05

开放科学(资源服务)标识码(OSID)

0 引言

1) 应用背景

安全测试是现代软件最有效的漏洞检测技术之一。在安全测试技术中,模糊测试被认为是最有效且可扩展的,它为PUT提供各种输入,并监控异常行为,例如堆栈或缓冲区溢出、无效读/写、断言故障或内存泄漏。自提出以来,模糊测试越来越受行业和学术界欢迎,并演变为适用于不同测试场景的不同类型的模糊器。

2) 模糊测试的方法、特点、不足之处

根据模糊测试对PUT内部结构的认识,模糊器可以分为黑盒、白盒或灰盒。以灰盒为例,灰盒模糊器基于来自PUT执行的反馈信息,使用进化算法来生成新的输入和探索路径。一般来说,模糊器的目标是在有限的时间内覆盖尽可能多的程序状态。这是因为从直觉上来说,代码覆盖率与bug覆盖率密切相关,代码覆盖率高的模糊器可以发现更多的bug。然而,存在几种测试场景,其中只涉及部分需要进行充分测试的程序状态。例如,如果MJS(嵌入式设备的JavaScript引擎)在MSP432 ARM平台上发现了漏洞,则在其他平台的相应代码中可能会出现类似的漏洞。在这种情况下,应该引导模糊器在这些重要的位置重现错误。另一种情况是,当bug被修复时,程序员需要检查补丁是否完全修复了错误。这需要模糊器聚焦于那些补丁代码上。在这两种情况下,都需要引导模糊器到达PUT中的某些指定位置。

3) 定向模糊测试的发展

目前,定向模糊测试已经成为一个研究热点,发展非常迅速。它已经超越了依赖手动标记的目标站点,基于距离的度量来区分种子优先级的原始模式。使用了新的适合度指标,例如踪迹相似性和漏洞预测模型。当前的定向模糊测试工具不仅能自动识别目标,而且能以定向的方式暴露目标程序的行为。在不同的场景下,大量的变体已经被应用于软件测试、例如补丁测试[1-2]、回归测试[3]、错误重现[4]、知识整合、结果验证[5-6]、节能[7]和特殊错误检测[4,7]。虽然定向模糊测试发展迅速且有效,但它也有普遍的局限性和挑战,值得进一步研究。在这种背景下,本文开展综述,总结定向模糊测试研究进展的经验证据。在分析定向模糊测试研究的优点和局限性的基础上,尝试找出当前研究中的差别,同时揭示新的研究机会,并提出进一步研究的领域。

1 研究框架

1.1 框架图

1.2 研究方法

1.2.1 关键词

根据综述研究的主题,选取了如下关键词进行文献检索:定向模糊测试、定向白盒模糊测试、定向灰盒模糊测试。对于白盒模糊器,检索关键词细分为符号执行、程序分析等;对于灰盒模糊器,检索关键词细分为种子选择、调度方式、缺陷复现等。

1.2.2 搜索过程

确定关键词后,小组使用以下三种方式搜索相关期刊论文:1) 在软件工程和安全领域的顶级期刊和会议网站上搜索;2) 通过google scholar 搜索引擎搜索;3) 在ACM Digital Library中搜索。随后对收集到的论文进行筛选,下列类型的论文将被排除在外:1) 非CCF中A类、B类的会议与期刊;2) 传统的基于覆盖率的模糊测试,非定向模糊测试;3) 论文较短(少于6页),只讲模糊器模型,缺少相关工作的背景介绍;4) 较过时的技术选型,如部分2017年后的白盒模糊器。

1.2.3 分析过程

将筛选后的论文进行整理,共收集到27篇相关论文。其中灰盒部分21篇,白盒部分6篇。2020—2022年12篇,2017—2019年10篇,2009—2016年5篇。根据从每篇论文中提取出的摘要、关键词,首先将研究方向进行分类。之后对每篇论文的技术模型展开分析,总结其应用场景,阐述其发展趋势与挑战。具体而言,研究问题如下:

RQ1:定向模糊测试有哪些目标识别方法?

RQ2:定向模糊测试有哪些适应度指标?

RQ3:本文研究的定向模糊器对模糊过程具体做了怎样的优化?

RQ4:定向模糊测试有哪些应用场景?

RQ5:定向模糊测试的发展趋势与挑战是怎样的?

2 目标识别

定向模糊测试的目标识别可分为针对目标位置和针对目标bug两类。

2.1 针对目标位置

大多数定向模糊策略的难点在于需要对PUT进行目标预标记[8-11]。手动标记依赖于关于目标位置的先验知识,例如在源代码中的行号,或二进制级别的虚拟内存地址,来标记目标并引导执行到所需位置。然而获得这样的先验知识是具有挑战性的,特别是对于二进制代码。为了合理有效地设置目标位置,研究人员会使用辅助元数据,例如git提交日志中的代码变更[2]、从错误跟踪中提取的信息[4]、CVE漏洞描述中的语义[7]或深度学习模型[5-6],来识别代码中易受攻击的功能[5-6]、关键位置、语法标记、完整性检查以及补丁相关分支[1,3],并将这些易受攻击的代码部分或位置设定为目标。然而,这种目标识别方案仍然依赖于额外的处理信息并在PUT上标记目标的工作。当第一次对PUT进行模糊测试或缺乏结构良好的信息时,这种方法是不合适的。

为了提高自动化程度,静态分析工具[9,12-15]被应用于自动发现PUT中的潜在危险区域。然而,这些工具通常只适用于特定错误类型和编程语言。另一种定向利用编译器sanitiser的遍(pass) 来注释PUT中的潜在错误,或者进行二进制级比较来识别补丁相关的目标分支[1]。深度学习方法已被用于预测二进制[6]和抽象语法树级别[5]的潜在易受攻击的代码。最后,攻击面识别组件也被用于自动识别定向灰盒模糊测试的易受攻击目标。

2.2 针对目标bug

定向灰盒模糊测试也可以用作特定错误检测的手段。例如,UAFuzz[4]和UAFL[16]利用目标操作序列而不是目标站点来寻找释放后使用漏洞,其存储操作(例如,分配、使用和释放存储)必须以特定顺序执行。AFL-HR[17]通过协同进化方法触发了难以显现的缓冲区溢出和整数溢出的错误。Greyhound[7]引导Wi-Fi客户端表现出偏离Wi-Fi协议的异常行为。对于针对特定错误的定向灰盒模糊测试,不需要在PUT中标记目标,这意味着模糊器可以以进化的方式自动识别和触发这样的错误。

3 适应度指标

3.1 基于距离

AFLGo[11]在编译时检测源代码,并根据PUT的调用和控制流图中的边数计算到目标基本块的距离。然后在运行时,它聚合每个基本块的距离值,计算平均值来评估种子。它根据距离对种子进行优先排序,并优先选择更接近目标的种子。一些后续的模糊器也更新了此基于距离的方案。例如,TOFU[8]的距离度量被定义为达到目标所需的正确分支决策的数量。对于每个目标,1dVul[1]采用贪婪突变策略评估从每个测试输入到目标分支的距离,并优先考虑更接近目标的测试输入。SemFuzz[2]将每一个使用输入的运行称为模糊实例,对于每一个实例,通过内置观测器观察执行以测量易受攻击函数与模糊实例的执行轨迹之间的距离。对应于最短距离的输入被选择为新的种子输入,用于另一轮模糊化,直到达到任何易受攻击函数。UAFuzz[4]则使用调用链的距离度量,导致目标函数更有可能同时包含分配函数和释放函数,以检测复杂的行为释放后使用漏洞。不同于在传统的距离计算中使用等权重的基本块,AFLChurn[3]基于基本块最近被改变的时间或改变的频率来分配数字权重,WindRanger[18]则在计算距离时考虑偏差基本块(即,执行轨迹开始偏离目标位置的基本块)。基于距离的方法的一个缺点是它只关注最短的距离,因此当有多条路径到达同一目标时,较长的选项可能会被忽略,从而导致差异。另一个缺点是在基本块级计算距离时耗费大量的时间,在一些目标程序上,用户报告说仅仅计算距离文件就要花费数小时。

3.2 基于相似度

相似度是由Chen等人在Hawkeye[10]中首次提出的一种度量,它在函数级别上度量种子的执行轨迹与目标的执行轨迹之间的相似度。直觉是,在“预期轨迹”中覆盖更多功能的种子将有更多机会变异并到达目标。Hawkeye将基本块轨迹距离与覆盖函数相似性相结合,用于种子优先级排序和功率调度。LOLLY[19]使用用户指定的程序语句序列作为目标,并将种子覆盖目标序列的能力(即序列覆盖率)作为评估种子的度量。Berry[12]通过考虑目标序列的执行上下文来升级LOLLY。这增强了具有“必要节点”的目标序列,并使用目标执行轨迹和增强的目标序列之间的相似性来区分种子的优先级。然后,相似性被扩展到覆盖其他目标形式,例如操作、bug跟踪和标记位置。形式上,相似性是某个度量的当前状态和目标状态之间的重叠程度,其中度量包括错误跟踪的长度,以及覆盖的位置、覆盖的操作或覆盖的功能的数量。UAFL[16]使用操作序列覆盖来指导测试用例生成,以逐步覆盖可能触发释放后使用漏洞的操作序列。UAFuzz[4]还使用序列感知的目标相似性度量来测量种子的执行和目标自由后使用错误跟踪之间的相似性。相比之下,基于相似性的度量比基于距离的替代方法能够更好地处理多目标拟合。此外,基于相似性的度量可以包括目标之间的关系,例如目标的排序[4]。最后,在基本块级别测量基于距离的度量,这将引入相当大的开销,而基于相似度的度量可以以相对较高的水平提高整体效率。

3.3 基于概率

研究人员通过使用一些基于深度学习的方法,预测函数的易受攻击概率,量化种子到达目标位置的可能性。易受攻击函数中的每个基本块被给予静态易受攻击分数以测量易受攻击概率,对于每个输入的种子,将执行路径上所有基本块的静态易受攻击分数的总和用作适应度分数,优先考虑具有较高分数的输入[6]。FuzzGuard [20]在模糊器生成大量新输入后利用模型预测每个输入的可达性。为了解决训练的模型可能不适用于新生成的输入的问题,FuzzGuard设计了一种具有代表性的数据选择方法,以从每一轮变异中抽取训练数据,从而最小化采样数据的数量以提高效率。基于概率的方法可以扩展到指定崩溃以外的位置,例如信息的泄露,漏洞利用、特定的漏洞类型和不同的资源使用。

3.4 基于其他

TIFF[21]监视基本块及其执行频率,并根据执行的基本块计算输入的适合度。任何执行新基本块的输入都会被考虑进一步变异。AFLchurn[3]建议同时对所有提交进行模糊处理,但更多(最近)提交中的代码具有更高的优先级。每个基本块都成为目标,都被分配了一个数字权重,以衡量其最近或多久更改一次。CAFL[22]旨在满足一系列约束条件(即目标站点和数据条件的组合),而不是到达一组目标站点。它将约束的距离定义为给定种子满足约束的程度,并按顺序排列更好地满足约束的种子的优先级。AFL-HR[17]首次使用脆弱性特定的适应度指标来生成和保留接近暴露漏洞的测试输入,采用了一种称为headroom的面向漏洞的适应性度量,它指示测试输入在给定漏洞位置暴露难以发现的漏洞(例如,缓冲区或整数溢出)的程度。

上一篇 点击页面呼出菜单 下一篇