尽管许多真实世界的项目都附带配置启用/禁用功能,fuzz大多被用于测试单配置这些项目。在这项工作中,我们首先进行实证研究,以了解程序配置影响起毛性能。我们发现限制竞选一个配置会导致未能覆盖大量的代码。我们还观察到不同的项目配置贡献不同的大量的代码覆盖率,挑战,每一个可以单独有效地晕。出于这两个观测结果,我们建议ConfigFuzz,模糊配置以及正常输入。ConfigFuzz转换目标程序编码其程序选项内fuzzable输入的一部分,所以可以重用现有fuzz的变异算子模糊程序配置。我们实例化ConfigFuzz六个可配置的,常见的模糊目标,并集成在FuzzBench处决。在我们的评估中,ConfigFuzz优于两个基线fuzz四目标,而结果混杂在其他目标由于程序大小和配置空间。我们也分析了期权晕ConfigFuzz以及它们是如何影响性能。
大多数模糊器(及其科学评估)集中在给定单个固定程序配置(例如,引用[16,19]),因此可能无法正确测试程序功能的重要部分。因此,潜在的罕见缺陷可能会逃过检测,对模糊化性能的科学评估可能无法说明全貌。
对此问题的简单补救方法是模糊所有有效的程序配置。然而,现实世界的程序的配置空间通常很大,这使得彻底模糊所有配置是不可行的。软件测试文献对这个问题进行了广泛的研究。一个广泛采用的解决方案是组合测试[17,18],其提出测试覆盖配置空间的某些属性的配置样本(例如,所有选项对出现在样本中的一些配置中)。此外,已经开发了基于字典或语法的方法来模糊程序配置[27,29].由这些技术生成的程序配置可以用作输入来模糊程序的输入文件。
然而,由于缺乏进一步的预先了解,现有技术将在每个配置上花费相同的时间,即使不同的配置实现不同数量的可达代码;这样的平等待遇浪费资源。 AFL有一个实验性的argv_fuzzing特性[2]模糊程序的argv和程序的输入数据。虽然可以通过argv_fuzzing将程序配置建模为argv中的无界字符串来模糊程序配置,但我们发现这种方法浪费了大部分时间来试图获得有效的配置
上述观察促使我们设计ConfigFuzz,它能够同时有效地模糊程序配置和输入数据(第4).ConfigFuzz将程序的输入空间分成两部分:配置字节和数据字节。我们将程序选项编码到转换程序的配置字节中,并允许fuzzer的变异算子在fuzzing活动中决定何时以及如何变异程序的配置。由于配置空间是高度结构化的,ConfigFuzz的编码确保程序选项的变化总是生成有效的配置。同时,数据字节(即正常输入数据)也被模糊器变异,并作为目标程序主函数的输入给出。
具体来说,ConfigFuzz将程序的选项规范——本质上是选项的语法——作为输入。该规范区分不同的选项类型(即布尔型、选择型、数字型和字符串型),并指定每个选项的有效值。例如,数值选项的有效值是可以用范围指定的整数或实数。该规范的设计方式使用户可以自由控制模糊哪些选项,并可以禁用某些选项组合。这是因为有时模糊的程序配置可能没有帮助。有些命令行选项不是为在安全关键的上下文中使用而开发的,例如实验性功能的选项。此外,程序选项之间可能存在依赖或冲突关系,在模糊配置时,应避免这些选项的某些组合。
我们使用ConfigFuzz来转换六个常见的模糊目标,并使用Google的FuzzBench [7]框架,运行AFL和AFL++ [19]模糊器(部分5).我们将ConfigFuzz的模糊化性能与两种基线进行了比较:(1)当总是模糊化单个默认