目录
挑战1 :Usability Issues of Existing Fuzzers.
挑战2:Lack of Pragmatic(实用的) Real-World Benchmark Programs.
挑战3:Lack of Proper and Comprehensive Performance Metrics.
4.Evaluations of the State-of-the-art Fuzzers
摘要:
本文介绍了一个名为UNI FUZZ的开源平台,用于全面、定量地评估软件漏洞检测工具(模糊测试)(fuzzer)。该平台整合了35个可用的fuzzer、20个真实世界程序的基准测试和六类性能指标。作者通过对现有fuzzer的系统研究,发现并修复了一些缺陷,并将它们整合到UNI FUZZ中。作者提出了一组实用的性能指标,从六个互补的角度评估fuzzer的性能。作者使用UNI FUZZ对几个著名的fuzzer进行了深入评估,发现没有一个fuzzer在所有目标程序上表现最佳。作者还发现了一些之前被忽视的因素,如仪器方法和崩溃分析工具,它们对fuzzer的性能评估至关重要。作者希望这些发现能够为可靠的fuzzer评估提供启示,以便未来能够发现有前途的fuzzer原语,有效地促进fuzzer设计。
1 Introduction
现有的Fuzzing技术存在一些问题,如缺乏可靠的实验结果、缺乏统一的基准测试程序和不完整的性能指标等。为了解决这些问题,作者设计并实现了一个名为“UNI FUZZ”的开源、综合和实用的度量驱动平台,用于评估Fuzzing技术。该平台具有高可用性、实用性和综合性能指标,可以帮助用户更好地评估Fuzzing技术。
主要贡献:
- 设计并实现了开源的UNI FUZZ平台,用于综合、量化地评估35种流行的fuzzer性能,并提供了易于安装和部署的Dockerfile。同时,UNI FUZZ还提供了20个真实世界程序的基准测试套件和6类性能指标,以及用于崩溃分析的工具。
- 利用UNI FUZZ进行了8种基于覆盖率的fuzzer的广泛评估,发现没有一种fuzzer在所有测试基准程序上表现最好,这揭示了以往fuzzer评估中可能存在的主观性和偏见。
- 从评估中获得了对未来fuzzer研究的重要见解和发现,例如发现了一些之前未考虑的因素会显著影响fuzzer的性能,需要更加严格和精确地进行fuzzer实验。
2 Motivation of UNI FUZZ
对模糊器进行如此全面的评估存在许多挑战,如下所示:
挑战1 :Usability Issues of Existing Fuzzers.
现有的模糊测试工具存在可用性问题,有些难以直接使用,有些实现存在缺陷。因此需要对现有工具进行测试,努力提高工具的可用性。同时,需要进行深入比较研究,以指导新工具的设计。
挑战2:Lack of Pragmatic(实用的) Real-World Benchmark Programs.
缺乏实用的现实世界基准程序。
好的基准程序应具备以下特点:
首先,它们应具有与现实世界程序相似的特征,包括编码风格、大小和漏洞。这样,模糊测试器在这些基准程序上的性能才能更具指示性。其次,为了提供全面的评估,基准程序应展示多样的功能、大小和漏洞类型等。第三,从发现漏洞的实际评估角度来看,每个基准程序应至少包含一个在合理时间内可以发现的漏洞,这意味着实用基准的两个重要属性。(1)该程序应至少包含一个漏洞。否则,它无法有效区分模糊测试器在发现漏洞方面的能力。(2)发现漏洞的难度应该是合理的。否则,可能会导致无法承受的评估开销。
现有的模糊测试基准程序可以分为两类:合成程序和现实世界程序。
无论是合成的还是现实的,都不令人满意。
现有的合成基准通常规模较小,人为注入的漏洞是根据一些相对简单的机制设计和注入的。因此,模糊测试器的开发者可以通过了解注入模式和机制来提高其性能,评估结果可能会有偏差。因此,在这些合成基准程序上表现良好的模糊测试器可能在现实世界程序上效果不佳。
现有的真实世界基准程序存在以下问题:缺乏标准和充足的真实世界基准程序,现有的模糊器通常在自选程序上进行评估,这可能导致评估偏差;真实世界程序不如合成程序方便验证漏洞,因为缺乏明确的漏洞触发指标;现有的崩溃分类方法可能存在偏差,手动验证CVE耗时且容易出错。因此需要开发一套多样化和实用的基准程序以及自动工具来分析崩溃。
挑战3:Lack of Proper and Comprehensive Performance Metrics.
现有的性能评估指标无法全面衡量模糊测试工具的表现,仅仅依靠独特崩溃数量、独特漏洞数量和覆盖率等指标容易导致误导性结论。除了漏洞数量,漏洞质量也是一个重要的指标,同时还需要考虑计算资源开销。因此,需要完善指标以提供全面可靠的模糊测试工具评估。
3 Design of UNI FUZZ
构成:UNI FUZZ是由可用的模糊测试工具、实用的基准测试(benchmarks)和性能指标(performerce metrics)三个组成部分构成。该平台旨在解决模糊测试面临的挑战。
3.1 Usable Fuzzers
UNI FUZZ目前已经整合了35个可用的模糊测试工具,包括AFL、Angora、Honggfuzz等。通过手动构建和测试这些工具,发现了其中的一些设计和实现缺陷,并向开发者报告了这些问题。此外,还为每个工具实现了Dockerfile,以便在Docker容器中方便地安装和使用。使用Docker容器进行模糊测试可以更方便地进行资源分配和隔离,并且相对于虚拟机来说,Docker更轻量且占用更少的计算资源。除了测试这些工具的可用性并使其可用外,还对八个重要的基于覆盖率的模糊测试工具进行了全面评估。
注:Docker容器是一种轻量级、可移植的软件打包技术,用于将应用程序及其所有依赖关系打包在一起,以便在任何环境中快速、可靠地运行。每个Docker容器都是一个独立的运行环境,包含应用程序、运行时、系统工具、系统库和设置。Docker容器可以在任何支持Docker的环境中运行,无需对环境进行任何修改。
3.2 Pragmatic Benchmarks
本文作者选择的基准程序都是真实世界中的程序,他们没有对这些程序进行修改,以保留它们的原始特征。他们的重点是如何选择这些程序,并开发工具来方便地分析实验结果。
3.2.2程序选择
为了选择合适的程序,我们调查了在信息安全和软件工程领域的顶级会议上发表的与模糊测试相关的论文,以找到用于评估的真实世界程序和相应的版本。根据上述过程,我们最终选择了20个真实世界的程序,如表2所示。所选程序涵盖了图像、音频、视频、文本、二进制和网络数据包处理软件等六种功能类型。此外,它们涵盖了各种类型的漏洞,包括堆缓冲区溢出、栈溢出、分段错误、过度内存分配、全局缓冲区溢出、栈缓冲区溢出、内存泄漏、释放错误、浮点异常、分配-释放不匹配、memcpy参数重叠、使用后释放等。因此,这些程序能够全面评估模糊测试工具的性能。
UNI FUZZ提供了方便分析目标程序的崩溃样本的有效工具。分析包括但不限于:
(1)将崩溃样本去重和分类为错误;
将崩溃分为唯一的错误有两种主要方法:
一种是基于分析错误的根本原因
根本原因(错误)是指:例如崩溃文件a和崩溃文件b都触发了目标程序的错误,但在修复错误后没有触发,它们将被视为相同的错误。尽管这种方法似乎能够提供基准程序的准确真实信息,但根本原因分析很困难,并且在实践中存在许多挑战。要提供程序中所有错误的真实信息,需要访问目标程序的所有修补版本。每个修补版本应该只修复一个唯一的错误,不能重叠。否则,可能会导致大量的误报/漏报。
一种是基于分析输出结果。
例如,一种常用的方法是利用诸如ASan之类的工具,在程序出现错误时生成堆栈跟踪信息,然后使用堆栈哈希方法提取N个堆栈帧以去重错误。选择N的值可能会导致误报/漏报。然而,如何选择N的值以提供最低的误报/漏报结果是一个难题,尚未完全解决,超出了本文的范围。为了权衡和参考之前的工作[13,52],我们选择N为3。此外,由于不同的工具使用不同的方法来检测错误,仅依赖单个工具可能会忽略某些类型的错误。因此,为了获得更精确的检测结果,我们优先考虑ASan [20]生成的输出报告,并将其他工具生成的输出报告(如GDB [21])作为补充。
(2)将崩溃样本与相应的CVE匹配;
注:CVE(Common Vulnerabilities and Exposures)是一种公共的标准化标识系统,用于唯一标识和跟踪公共已知的信息安全漏洞和公开的安全漏洞披露。CVE的目标是提供一个单一的、唯一的标识符,以便在不同的信息安全工具和服务之间进行交流和数据一致性。每个CVE标识符包含一个"CVE-"前缀,后面跟着年份、一个分配给该年份的顺序号,以及一个分配给特定漏洞的顺序号。例如,"CVE-2021-1234"。
过往的普通CVE匹配方法的缺陷:
大多数现有的模糊测试工作通过利用CVE信息来评估其模糊器发现漏洞的能力。然而,将崩溃样本与相应的CVE匹配是耗时且繁琐的,因为CVE的描述是用自然语言编写的,没有明确定义的结构,很难直接从描述中提取关键信息。此外,虽然每个CVE的参考文献可能提供额外的信息,如触发CVE的PoC文件和崩溃分析工具生成的输出报告,但这些信息通常是不完整或缺失的,使得CVE匹配更加困难。此外,参考文献也是无结构的,需要人工努力来确定参考链接表示的内容。最后,由于可能使用不同的工具来获取输出报告,直接匹配不同的输出报告也很困难。
本文改进后的CVE匹配方法:
本文介绍了一种构建CVE关键词数据库的方法,以便于匹配UNI FUZZ基准程序相关的CVE。该数据库包含了每个基准程序的CVE表,每个表项包含CVE ID、漏洞类型、受影响函数、受影响文件、堆栈跟踪等关键信息。利用该数据库,可以方便地生成初始匹配结果,并通过手动检查来获得最终匹配结果。同时,作者指出了官方CVE网站存在的缺陷和错误,以及可能存在的0-day漏洞。
(3)分析由崩溃样本触发的错误的严重程度。
3.3 Performance Metrics
对现有的模糊测试论文的性能指标进行了系统研究,并总结和提出了一组指标,可以分为六个类别:唯一漏洞的数量、漏洞的质量、发现漏洞的速度、发现漏洞的稳定性、覆盖率和开销。每个类别代表了模糊测试工具性能的一个属性,每个属性可以通过许多具体的指标来评估,这些指标是可扩展的。例如,在评估唯一漏洞的数量时,我们可以利用许多具体的数学指标,如p值、A^12分数。对于每个类别,我们提出了具体的指标作为实际评估的建议。
4.Evaluations of the State-of-the-art Fuzzers
使用UNI FUZZ进行了大量实验,对最先进的模糊测试工具进行了全面比较,涉及六个性能指标。按照指南,进行了24小时、30次重复的模糊测试。
4.1 Experiment Settings
本文介绍了在评估过程中选择的八种最先进的基于覆盖率的模糊测试工具,包括AFL、AFLFast、Angora、Honggfuzz、MOPT、QSYM、T-Fuzz和VUzzer64。这些工具被选择的原因是它们在工业界和学术界都有广泛的应用和先进的技术。本文还介绍了使用的20个真实世界程序和LAVA-M来评估这些工具,并对初始种子、环境等进行了详细说明。最后,本文提供了更详细的评估结果和数据集。
4.2 Quantity of Unique Bugs
本文旨在比较不同fuzzer在发现独特漏洞方面的表现。通过ASan和GDB等工具的输出报告,将不同的漏洞类型和函数堆栈信息作为三元组来去重。在UNI FUZZ基准和LAVA-M上进行30次重复实验,发现不同fuzzer在不同程序上表现不同,QSYM在5个程序上表现最佳,Angora在3个程序上表现最佳,Honggfuzz和MOPT各在3个程序上表现最佳,而AFL只在一个程序上表现最佳。在LAVA-M上,Angora表现最佳。
本文介绍了在30次重复实验中,七种fuzzer在四个真实世界程序上发现的唯一漏洞的统计结果。通过p值和A12分数来衡量fuzzer的性能,其中AFL作为基准fuzzer。结果表明,Angora、QSYM和VUzzer64在LAVA-M的所有四个程序上显著优于AFL。MOPT在17个真实世界程序上表现最佳,QSYM、Angora和Honggfuzz分别在13、11和11个真实世界程序上显著优于AFL。然而,AFLFast只在4个真实世界程序上显著优于AFL,而T-Fuzz和VUzzer64在任何真实世界程序上都没有显著优于AFL。
4.3 The Quality of Bugs
4.3.1 Severity of Bugs
本文介绍了使用不同的fuzzer在多个程序上进行fuzzing的结果。使用CVE CVSS评分和Exploitable结果来量化漏洞的严重程度。结果表明,不同的fuzzer在不同的程序上表现不同,其中MOPT在检测EXPLOITABLE漏洞方面表现最好。此外,AFL和AFLFast在每个程序上发现的高度严重的CVE数量相当。
4.3.2 Rareness of Bugs
本文介绍了针对不同实际应用程序的多个模糊测试工具的性能比较。其中,QSYM在发现独特的罕见漏洞方面表现最佳,发现了262个独特的罕见漏洞。MOPT排名第二,发现了90个独特的罕见漏洞。Angora总共发现了56个独特的罕见漏洞。然而,AFLFast只在两个程序中检测到罕见漏洞。AFL、T-Fuzz和VUzzer64只在一个程序中检测到罕见漏洞。值得注意的是,模糊测试工具在发现罕见漏洞时也有偏好。例如,QSYM在tcpdump上发现了204个独特的罕见漏洞,而与之相比,Angora只发现了一个罕见漏洞,其他模糊测试工具都未能发现任何罕见漏洞。对于nm,Angora可以发现25个独特的罕见漏洞,而其他模糊测试工具包括QSYM都未能发现任何罕见漏洞。
4.4 Speed of Finding Bugs
本文介绍了30个fuzzer在不同程序上的表现,通过平均每个fuzzer在一定时间内发现的独特bug数量来比较它们的速度。结果表明,没有一个fuzzer在所有程序上都表现最好,而且不同fuzzer的表现随时间变化可能会颠倒。此外,即使某些fuzzer发现了相似数量的独特bug,它们的速度也可能不同,因此速度指标的重要性不容忽视。
4.5 Stability of Finding Bugs
该文研究了七种fuzzer在30次重复实验中找到唯一漏洞数量的相对标准偏差(RSD),结果显示fuzzer的稳定性存在差异,Angora和T-Fuzz稳定性较好,而AFL和Honggfuzz稳定性较差。同时,fuzzer的稳定性也与不同程序有关。需要注意的是,找到更多的漏洞比稳定性更重要。
4.6 Coverage
本文介绍了一种有效的方法来跟踪测试用例的覆盖率,该方法只考虑能够提高覆盖率的测试用例,以平衡精度和效率。通过比较不同模糊测试工具的代码覆盖率和发现的唯一漏洞数量,发现高覆盖率并不一定意味着发现更多的唯一漏洞。此外,唯一漏洞数量和代码覆盖率之间的相关性不强。
4.7 Overhead
1.AFL、AFLFast和MOPT在模糊测试期间的平均内存消耗较低,分别为24.6 MB、22.2 MB和51.8 MB,而T-Fuzz的内存消耗量最高,达到1,082 MB。
2.不同的模糊测试工具在测试相同程序时,内存消耗量差异很大。例如,AFL在测试exiv2程序时使用的内存不超过25 MB,而T-Fuzz使用的内存约为4 GB。
3.同一模糊测试工具在测试不同程序时,内存消耗量也有很大差异。例如,Angora在测试pdftotext时使用了超过7 GB的内存,而在测试其他程序时内存消耗量不到2 GB。
5 Further Analysis
评估了影响模糊测试器性能的被忽视的因素,包括仪器化方法和崩溃分析工具。这些因素对模糊测试器的性能有重要影响。
5.1 Instrumentation Methods(仪器化方法)
不同的模糊测试工具使用不同的仪器方法,导致编译后的二进制文件具有不同的特征。这可能会影响模糊测试的评估结果。例如,对于某些程序,AFL仪器化的二进制文件可能会崩溃,而Angora仪器化的二进制文件则不会。这是由于编译方法的不同导致的。因此,在评估模糊测试工具时,需要考虑不同的仪器方法可能会影响评估结果。
编译方法会影响漏洞的触发,不同编译器和优化级别会导致不同结果。建议使用交叉验证来分析崩溃样本,即使用不同编译的二进制文件重新执行崩溃样本,以检查它们是否只能导致二进制文件的部分崩溃。
5.2 Crash Analysis Tools
使用不同的工具分析崩溃样本可能会导致不同的结果,例如ASan和GDB。在对收集的329,857个崩溃样本进行分析时,只有61.1%的样本可以被ASan和GDB同时验证,14.5%的样本只能被GDB验证,12.2%的样本只能被ASan验证,而剩下的12.2%的样本两个工具都无法验证。这表明ASan作为广泛采用的分析工具,只能验证73.3%的崩溃样本。
单独使用一个分析工具可能会限制检测到的漏洞数量,因此最好结合多个工具来分析崩溃样本,以便更全面地评估模糊测试器。在ffmpeg上使用ASan和GDB时,发现使用不同的分析工具会得到不同的评估结果。因此,在评估中使用ASan作为主要工具来检测漏洞,同时采用GDB作为补充。