【字体: 】 【打 印】 【导 出复 制关 闭
模糊测试技术的研究进展与挑战
北京计算机技术及应用研究所助理工程师 汪美琴 刘明哲;北京计算机技术及应用研究所高级工程师 夏旸 贾琼;北京计算机技术及应用研究所研究员 陈志浩
发布时间:2024-09-06

摘要:模糊测试作为一种高效的漏洞挖掘技术,近年来发展快速,受到了越来越多研究人员的广泛关注.为了深入研究模糊测试技术,介绍了模糊测试的定义,分析了优点和缺点;从种子选择的能量调度、测试用例变异算法、模糊测试执行性能、混合模糊测试等方面,总结了模糊测试的研究进展,比较了各项研究的改进点和不足,进一步提出了模糊测试未来改进的建议;描述了模糊测试在操作系统内核、协议、固件、深度学习等领域的漏洞挖掘研究成果;对模糊测试未来的挑战和研究热点提出一些思考.

关键词:模糊测试,漏洞挖掘,网络安全,逆向分析,漏洞验证

软件漏洞可造成直接安全危害的软件脆弱性问题,给计算机系统带来严重的安全威胁.由于软件漏洞具有机理复杂、产生原因多样、攻击结果各异等特点,漏洞挖掘工作面临着一定的难度.传统的漏洞挖掘技术如静态分析、动态分析、二进制比对等,要么存在操作流程复杂、自动化程度不高需要大量的专家领域知识等局限性,要么存在难以快速挖掘新的漏洞、误报率高等缺陷,已经难以满足现阶段的需要.因此,在顺应寻找高效、快速的自动化漏洞挖掘工具的需求下,模糊测试因其具有自动化程度高、资源成本消耗低、不依赖于程序源码、不受限于系统内部实现和复杂程度、以及可复用性好等优点,成为当前漏洞挖掘领域相关研究的热点.

模糊测试是一种通过向应用提供非预期的输入并监控输出中的异常来发现软件中的故障的方法[1].具体来说,是基于对目标测试对象的分析,使用种子变异算法对正常输入数据进行变异,以伪随机的方式构造大量预期或非预期的测试用例,作为输入传递给目标测试对象,来发现意外的程序行为,并通过分析目标的输出结果进行漏洞检测的方法.在模糊测试的过程中,大部分阶段都是自动化实现的,无需较多的专业人员经验即可进行,具有测试效率高、速度快的优点,同时,由于模糊测试是在程序运行过程中动态监控的,所以误报率较低,而自动化的测试用例生成策略也有利于发现未知的漏洞,提高了软件漏洞发现的概率.

尽管模糊测试具有上述优点,能够有效发现被测目标的安全性漏洞,但也具有测试用例生成策略的局限性、资源和时间的要求高、前后期分析依赖于人工等技术设计上的不足,以及难以发现越权访问漏洞、难以纠正程序的设计逻辑缺陷、难以发现多阶段组合漏洞等漏洞发现能力上的局限性.

目前,关于模糊测试的研究已经取得了很多成果,但是仍处于快速发展和持续探索的阶段,因此,对模糊测试技术的研究进展和挑战进行较为全面的总结和思考,对于未来模糊测试技术的深入研究具有重要的意义.

1 模糊测试方法研究进展

针对模糊测试基本工作流程的各个阶段存在的问题,研究学者们也进行了许多的研究和改进工作,主要可以划分为种子选择的能量调度、测试用例变异算法、模糊测试执行性能以及混合模糊测试等方面,本节将详细介绍这些方面的研究进展情况.

1.1 面向种子选择的能量调度的改进

在模糊测试工具AFL中,每个种子的变异次数基本是一样的,但是实际上不同的种子能够覆盖的代码分支的数量和频次都有所差别,进而可能影响变异生成的测试用例的边覆盖效果.因此,研究者们从种子的选择及其变异次数的角度对AFL进行改进,根据各个种子的特点采取相应的能量分配策略,控制每个种子执行的最优变异次数,以提高模糊测试的漏洞挖掘效率.

Böhme等人[2]提出了AFLFast,将基于覆盖的灰盒模糊测试建模为对马尔科夫链的状态空间的系统探索,通过偏向低频路径的能量分配策略,可以在同等时间内执行更多的低频路径,增加了模糊测试覆盖更多路径的可能性.同年,Böhme等人[3]面向定向模糊测试场景提出了AFLGo,基于模拟退火算法,以给定的源码位置为目标生成输入,将更多的能量分配给离目标位置较近的种子,同时降低离目标位置较远的种子的能量,从而达到更快覆盖给定位置的源码的效果.

为了增加AFL所能覆盖的代码区域,Lemieux等人[4]提出了FairFuzz,通过采用偏向产生稀有分支的种子能量分配策略,控制种子的变异次数,以提高模糊测试的覆盖率.由于准确的路径覆盖需要较高的成本,大多数模糊测试通常使用粗略的覆盖信息,种子选择策略主要聚集在路径访问频次、路径深度、执行速度等方面,为了解决这一问题,Gan等人[5]提出了CollAFL,通过基于敏感路径的种子能量分配策略,将模糊测试引导到未探索的相邻分支路径、相邻后续路径以及存在较多内存访问操作的路径,从而提供更准确的路径覆盖信息减轻路径冲突,提高发现新路径和新漏洞的效率.

针对AFLFast的马尔科夫链建模不够深刻,以致能量调度比较单一的问题,Yue等人[6]提出了EcoFuzz,使用对抗性多臂老虎机的变体(variant of the adversarial multi-armed banditVAMAB)对基于覆盖的灰盒模糊测试进行建模,通过基于种子执行次数与发现新路径的平均成本的能量分配策略,实现了种子能量分配的动态调整,从而降低了模糊测试的能量消耗和平均成本.

1.2 面向测试用例变异算法的改进

测试用例生成是整个模糊测试过程中的关键步骤,变异算法决定了生成数据的有效性,可直接影响模糊测试的覆盖率以及漏洞发现效率.因此,面向测试用例变异算法的改进受到了研究者们的广泛关注.

针对结构化输入的目标程序,Wang等人[7]提出了基于语法感知的模糊测试技术Superion,通过抽象语法树解析测试输入,以及在树的层面直接修剪,并基于字典和基于树的2种语法感知的变异策略,可以生成语法语义有效的测试用例.为了在有限的时间内高效快速地发现二进制程序中的漏洞,Li等人[8]结合脆弱性预测和进化算法提出了V-Fuzz,通过基于图神经网络的漏洞预测模型,预估程序中更容易受到攻击的部分,并利用进化算法生成更有可能到达漏洞位置的测试用例,提高了模糊测试的速度.

1.3 面向模糊测试执行性能的改进

模糊测试的执行性能可以直观地展示模糊测试工具的效率,由于任务调度、系统可扩展性、代码插桩、测试用例追踪等诸多因素的影响,模糊测试的资源成本、执行时间、挖掘效率也相应地受到一些限制,因此,对于这方面的改进还有较多的发展空间,以下是一些面向模糊测试执行性能方面的研究.

为了减少AFL追踪测试用例覆盖率产生的性能开销,Nagy等人[9]提出了UnTracer,通过量化测试用例与代码覆盖率的频率之间的关系,筛选出能够增加覆盖率的测试用例,并对其进行追踪,同时减少对不能增加覆盖率的测试用例的追踪,进而降低基于覆盖引导的模糊测试的开销.为了节省模糊处理的资源成本、提高模糊测试效率,Zhou等人[10]提出了一种分布式模糊测试方法UltraFuzz,通过基于集中式的动态调度和弹性分配计算能力,实现种子能量调度的全局优化,解决了并行模式下,由于缺乏合适的任务调度方案和实时状态同步导致的任务冲突、负载不均、资源浪费等问题.

1.4 基于混合模糊测试的改进

混合模糊测试一般指结合模糊测试与符号执行的技术,利用模糊测试来测试容易到达的代码区域,并使用符号执行探索由复杂分支条件保护的代码块,通过2种技术的结合使用达到挖掘更深的程序状态空间的效果.但是混合测试也面临生成约束慢、路径爆炸、需要源码以及无效测试用例等带来的性能瓶颈,虽然混合模糊测试起步较晚,但是随着研究的不断深入,近年来也取得一些进展.

Stephens等人[11]提出了Driller,结合动态符号执行解决了模糊测试对基本块校验检查的不足,能实现选择性地探索感兴趣的程序路径,并帮助模糊测试跳过不能满足的判断条件语句路径,能够探索更深层次的漏洞,避免了符号执行的路径爆炸和模糊测试的不完全性问题.不足之处在于较为损耗计算资源,且为白盒测试,需要源代码.针对模糊测试挖掘效率低、程序状态遍历复杂的问题,Zhao等人[12]提出了概率路径优先的混合测试工具DigFuzz,通过基于蒙特卡洛搜索的概率路径优先级模型,量化评估每条路径的探索难度并排序,然后利用符号执行探索困难路径,大幅度提升了漏洞挖掘的效率和性能.

1.5 其他改进

上述提及的改进工作是目前研究较为聚集的热点方向,随着研究的不断深入,为了充分发挥模糊测试的漏洞挖掘效果,面向其他方向的改进工作也在慢慢被发掘.

Chen等人[13]提出了EnFuzz,基于全局和局部的种子同步机制,针对3种启发式模糊测试工具的多样性进行集成,涵盖覆盖信息粒度、输入生成策略、种子选择与变异策略等方面,最终获得了比单一的模糊测试工具更好的性能.

1.6 模糊测试改进技术的总结与思考

模糊测试是一个持续进行的研究领域,为了更好地发挥模糊测试的效能,针对各个阶段的改进仍旧在持续进行中.经过综合分析和比较上述提到的模糊测试技术的改进点和不足(如表1所示),本文提出一些改进方向的思考和建议:

1可以考虑优化初始种子的选择.目前大部分测试目标的初始种子需要分析输入向量后再进行人工构造,因此具有一定的不可确定性,所以可以尝试定制一套评估初始种子可靠性的准则,并根据评估反馈优化初始种子的多样性.

2种子选择能量策略的优化.可以考虑集成现有的能量分配策略,根据具体的目标对象选择并优化相应的方案,尽可能避免一些耗费时间和人力的方法.

3测试用例变异算法可以从结构化输入的目标程序和非结构输入的目标程序2方面进行考虑.对于结构化输入的目标程序,目前的方法有Superion[7]等,存在的问题主要是缺乏大量样本、变异样本的有效性无法控制、耗时等.未来的改进可以考虑结合逆向分析和深度学习技术,获取程序的语法规则,提高生成种子的有效性;对于非结构化输入的目标程序,主要目的是提高测试样本的路径覆盖广度,因此可以尝试集成现有变异算法的基础上,根据测试用例的路径覆盖度量动态调整变异策略,使变异朝着探索更多路径的方向生成.

4目前的混合测试主要是结合动态符号执行解决路径约束问题,但不适合处理整体结构上的约束,且大部分只适用于小规模程序,未来可以考虑结合其他的新型技术如污点分析、机器学习、二进制插桩等,辅助实现模糊测试的智能化和发现更多样性的漏洞.

5可以从平台的适配性角度进行改进.目前大部分工具都只适用于LinuxWindows平台,鲜少有工具能同时用于LinuxWindowsMacOS等通用平台,所以未来的改进可致力于提高工具的平台适配性.

2 模糊测试技术应用进展

2.1 操作系统内核漏洞检测

由于内核驱动程序大都由第三方人员开发,并且数据结构复杂、对输入的约束强,所以往往存在较多的漏洞安全隐患,严重者可导致权限提升攻击,而系统调用接口作为内核和用户级程序交互的桥梁,其安全性更要受到关注.在目前的研究中,操作系统模糊测试主要是测试内核和用户级应用程序之间的系统调用接口是否存在安全漏洞,并关注模糊测试工具的性能开销、测试效率等关键指标.

考虑到操作系统内核崩溃对覆盖引导的模糊测试工具性能的影响,Schumilo等人[14]提出了一种硬件辅助的模糊测试工具kAFL,利用虚拟机和因特尔处理器追踪技术,设计了一个与目标操作系统交互的小型用户空间组件,解决了操作系统崩溃带来性能开销的难题.

2.2 协议漏洞检测

作为信息网络中重要的设计和组成部分,网络协议是实现计算机网络安全高效通信的基础,所以保证网络协议的健壮性和安全性具有重要意义.模糊测试由于具有轻量级检测、快速的覆盖反馈以及动态调整策略的优势,在网络协议漏洞挖掘领域发挥了重要的作用.但是由于网络协议种类繁多、格式复杂,且存在一些格式规范未知的协议,所以协议模糊测试仍旧面临着成本高、速度慢、自动化程度低等挑战.

针对网络服务器依赖于多消息序列状态而导致的模糊测试成本高、需要手工定制的问题,Natella等人[15]提出了STATEAFL,通过在编译时插入对内存分配和网络输入输出操作的预测,在运行时分析内存快照推断当前目标的协议状态,并构建协议状态机,即可轻量级地实现对目标服务器多消息状态的处理,提高了模糊测试的效率.

2.3 固件漏洞检测

固件在物联网、工业控制、汽车电子、医疗器械等嵌入式系统中都有广泛的应用,而内存损坏、命令注入、程序逻辑、并发问题、配置项出错以及定制化等问题均有可能触发固件的漏洞,因此研究固件的安全性具有非常重要的意义.目前,固件漏洞检测的难点主要在于固件代码提取困难,且固件镜像大部分情况下难以成功地模拟仿真等,所以针对固件的模糊测试研究相对来说聚焦在目标设备固件的顺利执行上.

针对IoT设备固件模拟仿真困难的问题,Du等人[16]提出了基于LinuxIoT设备二进制程序的通用模糊测试框架AFLIoT,通过检测无偏移的二进制指令,使得无需二进制程序重写即可继承外围设备的兼容性,从而实现在目标IoT设备上的直接执行.

2.4 深度学习漏洞检测

随着智能化技术的发展和普及,深度学习已被广泛应用于日常生活的各个领域,如自然语言处理、医疗、自动驾驶、物联网等,所以保障深度学习系统的安全性具有十分重要的意义.目前,相关研究主要分为2方面:一方面使用深度学习技术提高模糊测试的检测效率;另一方面将模糊测试技术用于检测神经网络系统的漏洞,两者均处于研究的初期,未来还有一定的发展空间.

Odena等人[17]将覆盖引导的模糊测试应用于神经网络模型的测试中,提出了TensorFuzz,通过覆盖率引导神经网络输入的随机变异,并使用近似最近邻算法度量输入的覆盖率,以此作为反馈以生成满足用户指定约束的输入,有利于指导对抗例子的生成,并发现神经网络中的数值、字符等错误.

2.5 其他方面漏洞检测

除了上述提及的操作系统内核、协议、固件、深度学习领域的漏洞检测之外,还有将模糊测试应用于并发漏洞检测、文件系统漏洞检测等领域的研究.面向并发程序漏洞检测问题,Ko等人[18]提出了检测并发漏洞的模糊测试工具AutoInterFuzzing,通过感知线程交互的能量调度,严格控制各线程间的交互状态,有利于检测多线程程序中的漏洞.针对文件系统模糊测试存在的大斑点图像测试效率低下,以及文件系统不可复制的问题,Xu等人[19]提出了探索2维输入空间的文件系统的模糊测试工具JANUS,通过操作系统库而非虚拟机测试操作系统的功能,能够在生成面向图像的工作负载的同时,有效地改变大图像中的元数据块,以更广泛地探索目标文件系统.

3 模糊测试的挑战与展望

模糊测试技术在操作系统、固件、协议等方面的漏洞挖掘中发挥着重要的作用,随着研究的快速发展,模糊测试也在慢慢应用于更多领域,未来的发展具有广大的前景.但是,模糊测试因其技术的综合性和复杂性,仍旧具有设计的不足和漏洞发现的局限性,同时如何最大限度发挥其作用也是值得思考的重要问题.综合上述对于模糊测试研究进展和应用领域的探讨,本文对模糊测试未来的挑战和研究热点提出以下展望:

1提高预处理的自动化程度,包括对输入向量的分析、初始测试用例的构造等.由于预处理工作的复杂性,目前主要是依靠人工逆向分析获取目标程序的输入向量、函数结构等关键信息,然后构造初始输入数据,耗费的时间和人力成本较高,因此未来可以从这方面着手,考虑研制出一套通用方便且自动化程度高的预处理工具套件.

2解决数据不平衡的问题,包括初始测试用例的分支覆盖不均、生成测试用例的有效性差距较大等.具体来说,每个初始测试用例能够覆盖的代码分支数不太相同,而构造初始测试用例时难以确保每个都有近似概率的分支覆盖程度,由于后续的变异是基于初始用例的,所以会在一定程度上影响生成测试用例的质量;同时测试用例的生成具有随机性和不确定性,真正有效的测试用例数量偏少,导致样本数据正负不平衡.因此,如何从根本上解决样本数据不平衡的问题,是提高模糊测试效率需要思考的问题.

3提高结果分析的水平,包括crash去重、漏洞验证、漏洞成因分析等.目前专注于结果分析这部分的研究较少,但是在实际的模糊测试过程中,输出的导致程序崩溃的测试用例数量庞大,但其中很多定位的漏洞均为重复性的,所以如何做到自动化、快速、且准确地去重是需要思考的,同时,如果能在一定程度上自动化地分析出导致程序崩溃的漏洞位置、追溯漏洞成因、评估漏洞可利用性、输出漏洞报告等,将会对提高漏洞挖掘全过程的效率、维护软件安全起到非常突出的提升作用.

4提高模糊测试工具的通用性和可移植性,形成通用的模糊测试工具集成平台.尽管目前针对不同的目标对象已研发出多种模糊测试工具,但是受仿真环境、操作系统等因素影响,仍没有通用的工具能满足所有目标对象的漏洞挖掘需求,所以构造一个通用的模糊测试平台是当前需要研究的一个重点方向.

5通用的度量标准和评估体系.如何评估一个模糊测试工具的好坏目前尚未有合适的基准,由于测试目标的不同、硬件性能的差异以及执行时间不一致等问题的存在,仅仅依靠代码的覆盖率、挖掘漏洞的数量等指标无法绝对评估一个工具的好坏,所以制定一套通用、合理、标准化的度量标准,有助于在新工具层出不穷的情况下,及时准确地引导科研成果朝着更加合适的方向推进.

4 结语

本文介绍了模糊测试的定义,分析了模糊测试的优缺点.其次,分类概述了现有的针对模糊测试的改进工作,主要包括种子选择的能量调度、测试用例变异算法、模糊测试执行性能、混合模糊测试4个方面以及其他的改进,总结了它们的改进点和不足,并提出了一些未来的改进建议.然后介绍了一些模糊测试的典型应用领域,包括操作系统内核、协议、固件、深度学习、并发、文件系统等方面的漏洞检测,并基于上述研究,着重分析了模糊测试面临的一些挑战,对未来的发展提出了思考和展望,希望能为读者在未来的研究方向和方法中提供指引.

参考文献:

[1]Sutton M, Greene A, Amini P, et al. Fuzzing: Brute Force Vulnerability Discovery[M]. Beijing: Publishing House of Electronics Industry, 2013: 17-22

[2]Böhme M, Pham V T, Roychoudhury A. Coverage-based greybox fuzzing as Markov chain[J]. IEEE Trans on Software Engineering, 2017, 455: 489-506

[3]Böhme M, Pham V T, Nguyen M D, et al. Directed greybox fuzzing[C]//Proc of the 2017 ACM SIGSAC Conf on Computer and Communications Security. New York: ACM, 2017: 2329-2344

[4]Lemieux C, Sen K. FairFuzz: A targeted mutation strategy for increasing greybox fuzz testing coverage[C]//Proc of the 33rd ACM/IEEE Int Conf on Automated Software Engineering New York: ACM, 2018: 475-485

[5]Gan S, Zhang C, Qin X, et al. CollAFL: Path sensitive fuzzing[C]//Proc of the 2018 IEEE Symp on Security and Privacy SP. Piscataway, NJ: IEEE, 2018: 679-696

[6]Yue T, Wang P, Tang Y, et al. EcoFuzz: Adaptive energy-saving greybox fuzzing as a variant of the adversarial multi-armed bandit[C]//Proc of the 29th USENIX Conf on Security Symp. Berkeley, CA: USENIX Association, 2020: 2307-2324

[7]Wang J, Chen B, Wei L, et al. Superion: Grammar-aware greybox fuzzing[J]. arXiv preprint, arXiv: 1812.01197, 2019

[8]Li Y, Ji S, Lyu C, et al. V-Fuzz: Vulnerability prediction-assisted evolutionary fuzzing for binary programs[J]. IEEE Trans on Cybernetics, 2022, 525: 3745-3756

[9]Nagy S, Hicks M. Full-speed fuzzing: Reducing fuzzing overhead through coverage-guided tracing[J]. arXiv preprint, arXiv: 1812.11875, 2019

[10]Zhou X, Wang P, Liu C, et al. UltraFuzz: Towards resource-saving in distributed fuzzing[J]. IEEE Trans on Software Engineering, 2023, 494: 2394-2412

[11]Stephens N, Grosen J, Salls C, et al. Driller: Augmenting fuzzing through selective symbolic execution[C]//Proc of the 2016 Network and Distributed System Security Symposium. San Francisco, USA: NDSS, 2016: 1-16

[12]Zhao L, Cao P, Duan Y, et al. Probabilistic path prioritization for hybrid fuzzing[J]. IEEE Trans on Dependable and Secure Computing, 2022, 193: 1955-1973

[13]Chen Y L, Jiang Y, Ma F C, et al. EnFuzz: Ensemble fuzzing with seed synchronization among diverse fuzzers[C]//Proc of the 28th USENIX Security Symposium. Berkeley, CA: USENIX Association, 2019: 1967-1983

[14]Schumilo S, Aschermann C, Gawlik R, et al. kAFL: Hrdware-assisted feedback fuzzing for OS kernels[C]//Proc of the 26th USENIX Security Symposium. Berkeley, CA: USENIX Association, 2017: 167-182

[15]Natella R. StateAFL: Greybox fuzzing for stateful network servers[J]. arXiv preprint, arXiv: 2110.06253, 2021

[16]Du X, Chen A, He B, et al. AflIot: Fuzzing on linux-based IoT device with binary-level instrumentation[J]. Computers & Security, 2022, 122: 102889-102991

[17]Odena A, Goodfellow I. TensorFuzz: debugging neural networks with coverage-guided fuzzing[J]. arXiv preprint, arXiv: 1807.10875, 2018

[18]Ko Y, Zhu B, Kim J. Fuzzing with automatically controlled interleavings to detect concurrency bugs[J]. Journal of Systems and Software, 2022, 191: 111379-111394

[19]Xu W, Moom H, Kashyap S, et al. Fuzzing file systems via two-dimensional input space exploration[C]//Proc of the 2019 IEEE Symposium on Security and Privacy SP. Piscataway, NJ: IEEE, 2019: 1-17

作者简介:汪美琴,硕士,助理工程师.主要研究方向为模糊测试、漏洞挖掘.1569677451@qq.com;夏旸,硕士,高级工程师.主要研究方向为网络安全、密码通信.15810194836@139.com;贾琼,硕士,高级工程师.主要研究方向为网络与信息安全.821825059@qq.com;陈志浩,硕士,研究员.主要研究方向为网络与信息安全.czh8553@sina.com;刘明哲,硕士,助理工程师.主要研究方向为网络空间安全.arthur_lmz@126.com

《信息安全研究》2024年第7期

Copyright© 1998-2026 DRCnet.com.cn All Rights Reserved
版权所有 北京国研网信息有限公司