Page 39 - 《软件学报》2025年第7期
P. 39
2960 软件学报 2025 年第 36 卷第 7 期
来解决复杂的路径约束问题. QSYM [28] 结合了符号执行和具体执行, 提高了对复杂路径的探索能力. Matryoshka [29]
[9]
提出了一种嵌套层次的模糊测试策略, 可以更有效地测试深层嵌套的程序结构. 此外, VUzzer 利用控制流和数据
流分析来指导输入生成, 提高了对深层路径的覆盖. Redqueen [30] 提出了一种基于输入到输出的推理技术, 能够有效
地处理复杂的比较操作. MOPT [31] 引入了基于粒子群优化的突变调度策略, 提高了模糊测试的效率.
除了以覆盖率为指导的工作, 还有一类以程序性能为指导的研究, 这些研究涵盖了多个性能相关的方面.
[6]
SlowCoach [32] 和 SlowFuzz 专注于发现可能导致程序性能下降的输入, 而 HotFuzz [33] 则针对 Java 程序, 通过观察方
[7]
法执行时间来识别性能问题. 在资源使用方面, PerfFuzz 通过最大化资源使用来发现性能瓶颈, MemLock [34] 则专
注于检测内存消耗异常, 可以发现潜在的内存泄漏和内存耗尽问题. 在安全方面, Pythia [35] 致力于发现时间侧信道
漏洞, 此外, Singularity [36] 采用了创新的方法, 利用机器学习技术来预测输入对性能的影响. 这些多样化的研究方法
共同构成了一个全面的性能导向模糊测试框架, 为开发者提供了有力的工具来发现和解决各种潜在的性能问题和
安全漏洞.
此外, 一些研究者开始探索如何将机器学习技术应用于灰盒模糊测试. 例如, Neuzz [37] 使用神经网络来学习程
序的边界行为, 从而更有效地生成测试用例. MTFuzz [38] 则利用多任务学习来同时优化多个测试目标, 提高了测试
的全面性. 在这一趋势下, 更多的工作开始涌现. 例如, Learn&Fuzz [39] 使用序列到序列的学习模型来生成结构化的
测试输入. DeepFuzz [40] 利用深度强化学习来指导模糊测试过程, 提高了对深层漏洞的发现能力. FuzzGuard [41] 使用
机器学习来预测测试用例的有效性, 从而优化测试用例的选择. Cerebro [42] 结合了程序分析和机器学习, 可以更准
确地预测程序行为, 提高测试效率.
这些工作极大地推动了灰盒模糊测试的发展, 提高了漏洞发现的效率. 然而, 对于需要输入具有语义合法性的
程序, 现有方法的能力仍然有限. 如何在保证变异后输入的语义合法性的同时提高灰盒模糊测试的效率, 仍是一个
值得探索的问题. 未来的研究可能需要更深入地结合程序分析技术、机器学习方法以及领域特定知识, 以应对日
益复杂的软件系统带来的挑战.
6.2 语法可感知的模糊测试
近年来, 学术界和业界日益关注提升灰盒模糊测试对测试输入语法合法性的感知能力. 这一趋势主要源于特
定软件系统 (如 XML 解析器) 对输入语法合法性的严格要求. 为了应对这一挑战, 研究者们提出了多种创新方法.
[1]
例如, MongoDB 的模糊测试工具 [43] 对 JavaScript 测试输入的抽象语法树进行受控破坏. Superion 采用基于树的
增量变异方式, 并具有良好的通用性. LangFuzz [44] 和 IFuzzer [45] 都使用语法来提取和重组代码片段, 生成新的测试
输入. µ 4SQLi [46] 则专注于 SQL 语言, 使用专家设计的变异算子来生成语法正确且可执行的 SQL 语句. Skyfire [47] 利
用概率上下文敏感语法来生成结构化的种子输入, 提高了对复杂格式的测试效率. Nautilus [48] 则针对解释器和编译
器, 提出了一种基于语法的模糊测试方法, 可以生成语法正确的程序进行测试. Fuzzilli [49] 专门针对 JavaScript 引擎
设计, 使用定制的中间表示来生成有效的 JavaScript 代码. 此外, Gramatron [23] 提出了一种基于文法的随机测试方
法, 可以高效地生成符合特定语法的输入. Grimoire [50] 结合了输入语法推断和基于语法的模糊测试, 可以在不需要
预定义语法的情况下进行结构感知的模糊测试. Zest [51] 则提出了一种创新的生成器参数变异方法, 通过调整生成
器的输入参数来实现输入变异, 同时保持测试输入的合法性. 这些方法各具特色, 共同推动了灰盒模糊测试在处理
需求语法合法输入的待测程序方面的进步.
6.3 语义可感知的模糊测试
如第 1 节所述, 编译器这类复杂的软件系统不仅要求输入在语法上合法, 更需要在语义层面上合法 (例如, 变
量必须在定义后才能使用). 大量代码在经过语法和语义检查后才会执行. 因此, 要探索编译器的不同行为, 关键在
于保持输入的语义合法性. 然而, 第 6.2 节所述的语法可感知的模糊测试方法, 由于缺乏对程序语义的建模, 难以
保障基本的语义合法性 (如变量定义使用顺序). 这导致变异后的程序往往只在语法上合法, 但在语义上不合法.
近年来, 研究者们在提高模糊测试的语义合法性保持能力和语义多样性探索能力方面也做出了诸多创新尝
试. CodeAlchemist [52] 采用了语义保持的代码合成技术, 能够生成语义有效的 JavaScript 代码用于测试. SPE [53] 通过

