Bootstrap

阅读笔记——《Fuzz4All: Universal Fuzzing with Large Language Models》

  • 【参考文献】Xia C S, Paltenghi M, Le Tian J, et al. Fuzz4all: Universal fuzzing with large language models[C]//Proceedings of the IEEE/ACM 46th International Conference on Software Engineering. 2024: 1-13.
  • 【注】本文仅为作者个人学习笔记,如有冒犯,请联系作者删除。

目录

Abstract

1、Introduction

2、Background and Related Work

2.1、LLM

2.2、Fuzzing and Testing

3、Fuzz4All Approach

3.1、Autoprompting

3.1.1、Autoprompting Algorithm

3.1.2、Example: Autoprompting

3.1.3、Comparison with Existing Autoprompting Techniques

3.2、Fuzzing Loop

3.2.1、Fuzzing Loop Algorithm

3.2.2、Example: Fuzzing Loop

3.2.3、Oracle

4、Experimental Design

4.1、Implementation

4.2、Systems Under Test and Baselines

4.3、Experimental Setup and Metrics

5、Results

5.1、RQ1: Comparison against Existing Fuzzers

5.1.1、Coverage over Time

5.1.2、Generation Validity, Number, and Coverage

5.2、RQ2: Effectiveness of Targeted Fuzzing

5.3、RQ3: Ablation Study

5.4、RQ4: Bug Finding

5.4.1、Examples

6、Threats to Validity

7、Conclusion


Abstract

  • 以编程或正式语言作为输入的被测试系统(SUTs),例如编译器、运行时引擎、约束求解器和具有可访问API的软件库,尤为重要,因为它们是软件开发的基本构建模块。
  • 现有针对此类系统的模糊测试工具通常只针对特定的语言,因此难以应用于其他语言,甚至是同一语言的不同版本。此外,现有模糊测试工具生成的输入通常仅限于输入语言的特定特性,因此难以揭示与其他或新特性相关的错误。
  • 本文提出了Fuzz4All,这是第一个具有普遍性的模糊测试工具,能够针对多种不同的输入语言及其各种特性。Fuzz4All背后的关键思想是利用大语言模型(LLM)作为输入生成和变异引擎,从而使该方法能够为任何实际相关的语言生成多样且真实的输入
  • 为了实现这一潜力,我们提出了一种新颖的自动提示技术,该技术创建适合模糊测试的LLM提示,并引入了一种新颖的LLM驱动的模糊测试循环,该循环通过迭代更新提示来创建新的模糊测试输入。
  • 我们在接受九个系统测试的情况下评估了Fuzz4All,这些系统接受六种不同的语言(C、C++、Go、SMT2、Java和Python)作为输入。评估结果显示,在所有六种语言中,普遍模糊测试的覆盖率都高于现有的语言特定模糊测试工具。此外,Fuzz4All在广泛使用的系统中发现了98个错误,如GCC、Clang、Z3、CVC5、OpenJDK和Qiskit量子计算平台,其中64个错误已被开发人员确认是先前未知的。

1、Introduction

  • 传统模糊测试方法面临以下限制和挑战:
    • 与目标系统和语言紧密耦合
      • 传统的模糊器通常是针对特定的语言或特定的SUT而设计的。然而,设计和实现一个模糊器是非常耗时的。从一种输入语言为另一种输入语言重用实现模糊器的工作通常是不简单的。此外,对一个SUT有效的模糊策略可能对另一个SUT根本不起作用。
    • 缺乏进化支持
      • 现实世界的系统都在不断发展,例如,向输入语言添加新的特性。为特定语言或SUT版本或SUT设计的传统模糊器可能会在新版本上失去有效性,也不能轻易地用于测试新实现的特性。
    • 生产能力受限
      • 即使在特定目标语言的范围内,基于生成和基于突变的模糊化往往也不能覆盖很大一部分的输入空间。
      • 基于生成的模糊器严重依赖于输入语法来合成有效的代码,此外还配备了语义规则,以确保合成代码的有效性。为了生成大量有效的模糊输入或偏离困难的断层模型语言特征,基于生成的模糊器通常使用完整语言语法的一个子集,这限制了它们只测试所有语言特征的一个子集。
      • 同样,基于突变的模糊器也受到其突变操作符的限制,需要难以获得的高质量的种子。
  • 我们提出了Fuzz4All,这是第一个通用的模糊器,因为它可以针对许多不同的输入语言和这些语言的不同特性。我们的方法与现有的通用模糊器不同,例如,AFL和libFuzzer,它们使用极其简单的突变方式,并且不知道目标语言,因此难以产生有意义的编程语言模糊输入。相反,我们的关键思想是利用一个大型语言模型(LLM)作为输入生成和突变引擎。因为LLM对各种编程语言和其他形式语言中的大量示例进行了预训练,所以它们伴随来了对这些语言的语法和语义的隐含理解。
  • Fuzz4All的输入是用户提供的描述SUT的文档,以及可选择关注的SUT的特定特性。例如,以文档、示例代码或正式规范的形式。但是,这些用户输入可能过于冗长,无法直接用作LLM的提示符。我们不要求用户手动设计提示,而是提供一个自动提示步骤,自动将所有用户提供的输入提炼为简洁有效的模糊提示。此提示符是对生成模糊输入的LLM的初始输入。
  • 由于在相同的提示下连续采样会导致许多类似的模糊输入,我们提出了一个LLM驱动的模糊循环,它迭代地更新提示以生成一组不同的模糊输入。为此,Fuzz4All将之前迭代中生成的模糊输入与自然语言指令结合起来,例如,要求修改这些输入。然后,LLM生成的模糊输入传递给SUT,我们根据用户提供的测试预测对其进行验证,例如检查系统崩溃。
  • Fuzz4All解决了前面讨论的传统模糊器的局限性和挑战。
    • Fuzz4All通过使用LLM作为生成引擎,而不是精心设计一个单一用途的模糊器,可以应用于广泛的SUT和输入语言。
    • 与现有的针对特定版本的SUT或输入语言的模糊器相比,Fuzz4All可以很容易地随着目标而进化。例如,为了模糊地测试一个新实现的特性,用户可以简单地提供与该特性相关的文档或示例代码。
    • 为了解决传统模糊器受限的生成能力,Fuzz4All利用了llm对数十亿个代码片段进行了预先训练的这一事实,使它们能够创建大量可能服从的示例输入语言的句法和语义约束。最后,Fuzz4All不需要任何SUT的插桩,这使得该方法在实践中易于应用。
  • 本文贡献如下:
    • Universal fuzzing:我们引入了一个模糊测试的新维度,它直接利用LLM的多语言功能来对许多具有广泛有意义的输入的SUT进行模糊测试。
    • Autoprompting for fuzzing:我们提出了一个新的自动提示阶段,来支持一般和目标模糊。通过自动提取用户输入为一个提示,该提示能够有效生成SUT输入的提示。
    • LLM-powered fuzzing loop:我们提出了一种算法,通过选择的例子和生成策略迭代修改提示,不断生成新的模糊输入。
    • Evidence of real-world effectiveness:我们通过六种流行语言和九种真实的SUT(例如,GCC、CVC5、Go、javac和Qiskit)展示,与最先进的模糊器相比,我们的方法显著提高了覆盖率(平均36.8%),检测到98个错误,其中64个已经被确认为之前未知。

2、Background and Related Work

2.1、LLM

  • 自然语言处理(NLP)的最新发展导致了大型语言模型(LLMs)对自然语言和代码任务的广泛采用。最先进的LLMs基于transformers,可分为decoder-only(如GPT3和StarCoder)、encoder-only(如BERT和CodeBERT)和encoder-decoder(BART和CodeT5)模型。最近,基于指令的LLMs(例如,ChatGPT和GPT4)和使用来自人类反馈(RLHF)的强化学习进行微调的LLMs被证明可以理解和遵循复杂的指令。
  • LLM通常要么是经过微调的,要么是提示执行特定的任务。微调通过对特定于任务的数据集的进一步训练来更新模型的权重。然而,合适的数据集可能无法获得,而且随着LLM的规模的持续增长,对LLM的微调也越来越昂贵。另一方面,提示不需要显式地更新模型权重,但为LLM提供了任务的描述,并可选地提供了一些解决任务的示例。选择输入(即提示)的过程被称为提示工程,即用户尝试不同的输入指令,直到找到一个工作良好的输入指令。最近,研究人员提出了自动提示,一种使用LLM梯度来选择软提示的自动过程,即连续向量嵌入,或硬提示,即自然语言文本。甚至最近,研究人员通过计算有效性的代理分数来代替基于梯度的方法。
  • 这项工作利用LLM来解决模糊测试的重要问题。与传统的自动提示和基于代理的方法不同,我们的自动提示策略直接使用GPT4综合提示,并根据一个模糊的特定目标对它们进行评分。

2.2、Fuzzing and Testing

  • 最近,研究人员还直接利用LLM来模糊特定的库,例如,TitanFuzz使用Codex生成种子程序,InCoder执行基于模板的突变以模糊深度学习库。
  • 与之前的基于学习和LLM的模糊器不同,Fuzz4All可以很容易地应用于许多编程语言。以前的工作是训练特定于语言的模型或需要特定于语言的解析。即使是TitanFuzz,也是专门为具有手工提示和突变模式的深度学习库设计的,因此不能轻易扩展到其他SUT。此外,与现有的以特定语言生成一般模糊输入的技术不同,Fuzz4All还支持目标模糊,它可以生成专注于选定特性的代码片段。
  • 除模糊测试外,LLM还被应用于单元测试生成的相关问题。CodaMosa将传统的基于搜索的软件测试与查询Codex相结合,以便在达到覆盖平台时生成新的单元测试。TestPilot使用方法源代码和示例用法提示Codex以生成单元测试并修复错误生成的测试。与这些基于LLM的测试生成器相比,它们需要特定类型的输入(例如,函数源代码),并且只用于单元测试,通过使用我们的新型自动提示阶段,Fuzz4All可以接受任意格式的输入,用于一般和目标的模糊。此外,这种单元测试发生器通常需要手动工作来检查或完成测试,因为它们受到自动生成的测试神谕的限制,即使是最先进的也不能总是可靠地产生。相反,Fuzz4All利用了广泛使用的模糊oracles,比如崩溃,并且是完全自动化的。

3、Fuzz4All Approach

  • 图 1 概述了我们的方法。Fuzz4All 首先接收任意的用户输入,这些输入描述了要生成的模糊测试输入,例如,被测试系统(SUT)的文档、示例代码片段或规范。由于用户输入可能冗长、冗余且部分不相关,该方法将其提炼为一个简洁但信息丰富的模糊测试提示。为此,Fuzz4All 通过使用一个大型的、最先进的提炼语言模型执行自动提示步骤(第 3.1 节),以采样多个不同的候选提示。每个候选提示都会传递给生成语言模型来生成代码片段(即模糊测试输入)。然后,Fuzz4All 选择生成最高质量模糊测试输入的提示
  • Fuzz4All建立在两个模型之上,一个是减少给定用户输入的提炼LLM,另一个是创建模糊输入的生成LLM,以平衡不同LLM提供的成本和收益之间的权衡。因为提炼LLM需要理解和提取任意的用户输入,所以我们使用了一个具有很强的自然语言理解能力的高端的、大型的基础模型。然而,由于自回归生成的高推理成本,直接使用这样一个大的模型进行输入生成将是低效的。相反,为了执行高效的模糊测试,Fuzz4All使用了一个更小的模型作为生成LLM。我们使用最先进的GPT4和StarCoder实现了Fuzz4All。
  • 使用通过自动提示选择的最佳提示作为生成语言模型的初始输入提示,接下来我们进入模糊测试循环(第 3.2 节),在这个循环中,Fuzz4All 不断对生成语言模型进行采样以生成模糊测试输入。为避免生成许多相似的模糊测试输入,Fuzz4All 在每次迭代中不断更新输入提示。具体来说,该方法选择一个先前生成的输入作为示例,该示例展示了我们希望模型生成的未来输入的类型。除了该示例,Fuzz4All 还会在初始提示中附加一个生成指令,以引导模型生成新的模糊测试输入。这个过程会不断重复,同时将生成的模糊测试输入传递到被测试系统(SUT)中,并根据用户定义的断言(例如崩溃)检查其行为

3.1、Autoprompting

  • 下面介绍Fuzz4All如何通过自动提示将给定的用户输入提炼的提示来进行模糊测试。用户输入可以描述一般的SUT,或要测试的SUT的特定特性。如图1所示,用户输入可以包括技术文档、示例代码、规范,甚至是不同模式的组合。传统的模糊器需要输入遵循特定的格式,例如,代码片段作为种子或格式良好的规范,Fuzz4All可以直接理解用户输入中的自然语言描述或代码示例。然而,用户输入中的一些信息可能是冗余的或不相关的,因此,直接使用用户输入作为生成LLM的提示可能是无效的,我们在第5.3节中的消融研究证实了这一点。因此,自动提示的目标是生成一个精炼的输入提示,以实现有效的基于LLM的模糊测试。
3.1.1、Autoprompting Algorithm
  • 算法1描述了Fuzz4All的自动提示过程。输入的内容是用户输入和要生成候选提示的数量。最终输出是选择用于模糊活动的输入提示。由于我们的目标是使用提炼LLM生成提示,提取用户提供的信息,我们给提炼LLM以下自动提示指令:“Please summarize the above information in a concise manner to describe the usage and functionality of the target”。设 MD 为提炼语言模型,userInput 为用户输入,APInstruction 为自动提示指令。生成的提示 prompt 可以形式化为条件概率:MD (prompt | userInput, APInstruction)。
  • Fuzz4All 首先使用temperature为 0 的贪心采样生成一个候选提示(第 2 行)。通过首先以低temperature采样,该算法以高置信度获得一个合理的解决方案。这种方法在其他领域也被普遍使用,例如程序综合,其中首先评估贪心输出以检查它是否能解决问题。
  • 然后,该算法继续以更高的temperature进行采样以获得更多样化的提示= 5 行),如先前的工作所做的那样。与贪心方法相比,高temperature采样会产生不同的提示,每个提示都可以为用户输入提供独特的提炼总结。每个生成的提示都会添加到候选提示列表中(第 6 行),直到算法达到所需的候选数量。
  • 为了挑选在模糊测试步骤中使用的最佳输入提示,该算法通过执行一个小规模的模糊测试实验来评估每个候选提示。具体来说,该方法将每个提示作为生成语言模型的输入,为每个提示生成多个代码片段。然后,Fuzz4All 根据一个评分函数为每个提示生成的代码片段打分。虽然评分函数可以基于各种不同的指标,例如覆盖率、漏洞发现或生成的模糊测试输入的复杂性,但为了使该方法轻量且通用,我们的评分函数是有效(即被目标被测试系统(SUT)接受)的独特生成代码片段的数量。选择这个指标是因为对于模糊测试,我们希望模糊测试输入对于 SUT 内部深处的逻辑是有效的或接近有效的。设 MG 为生成语言模型,p 为候选提示,isValid 是一个函数,如果生成的代码 c 有效则返回 1,否则返回 0。我们的默认评分函数定义为:∑_{c∈MG(p)} [isValid(c, SUT)] 。最后,Fuzz4All 选择得分最高的输入提示(第 7 行)作为用于模糊测试的初始输入提示。总之,我们的自动提示步骤结合了提示生成和评分,这使得 Fuzz4All 能够自动生成并选择适合模糊测试目标的提示。
3.1.2、Example: Autoprompting
  • 图 2 展示了一个由我们的自动提示算法生成的输入提示的示例。该示例是针对模糊测试 C++编译器的,特别聚焦于 C++23 中引入的新特性 std::expected。
  • 作为用户输入,我们将原始的 cppreference 文档[2]传递给 Fuzz4All,它跨越多个屏幕长度,包含小表格和冗长的描述(498 个单词,3262 个字符)。相比之下,自动提示算法创建的提炼后的输入提示提供了关于目标特性更简洁的自然语言描述(214 个单词,1410 个字符)。该输入提示包含了关于如何使用 std::expected 的高级描述。例如,输入提示包含了一个简洁的句子(以橙色突出显示),总结了该特性有用的情况。此外,输入提示还包含了关于输入的描述,以及该特性的不同用法(即成员函数)。例如,函数 and_then、transform、or_else 和 transform_error 在原始文档中有非常相似的描述,并且每个函数都会重复。相反,在提炼后的输入提示中,这些函数以简洁的方式组合在一起,仍然说明了它们可以如何被使用。使用提炼后的输入提示,Fuzz4All 能够生成有效地针对 C++编译器的 std::expected 特性的模糊测试输入。
3.1.3、Comparison with Existing Autoprompting Techniques
  • 据我们所知,我们是第一个使用黑箱自动提示从任意用户输入中为软件工程任务自动提炼知识的。与自然语言处理和软件工程中先前关于自动提示的工作(通过访问模型梯度来优化提示)相比,我们的自动提示只需要对提炼语言模型进行黑箱式的采样访问。虽然使用评分函数来评估每个提示与自然语言处理中的最新工作类似,但我们的评分函数直接在生成有效代码片段这一确切的下游任务上评估提示,而不是使用近似的代理评分函数。

3.2、Fuzzing Loop

  • 给定在Fuzz4All的第一步中创建的输入提示,模糊测试循环的目标是使用生成LLM生成不同的模糊测试输入。然而,由于LLM的概率性质,使用相同的输入进行多次采样将产生相同或相似的代码片段。对于模糊测试,我们的目标是避免这种重复的输入,而是希望生成一组不同的模糊输入,以覆盖新的代码和发现新的bug。为了实现这一目标,我们利用LLM的能力来利用示例和自然语言指令来指导生成。
  • 模糊循环的最高思想是通过从以前迭代中选择一个模糊输入示例并指定生成策略,不断增加原始输入提示。使用示例的目的是演示我们希望LLM生成的代码片段类型。生成策略被设计为说明如何处理所提供的代码示例。这些策略受到传统模糊器的启发,模仿它们合成新的模糊输入的能力(如基于生成的模糊器),并生成以前生成的输入的变体(如基于突变的模糊器)。在模糊循环的每一次新迭代之前,Fuzz4All都向输入提示添加一个示例和生成策略,使生成LLM能够不断创建新的模糊输入。
3.2.1、Fuzzing Loop Algorithm
  • 算法 2 描述了模糊测试循环。输入为初始输入提示和模糊测试预算。最终输出是由用户定义的断言所识别的一组漏洞。首先,该算法初始化生成策略(生成新的、变异现有的和语义等价),这些策略将在模糊测试循环中用于修改输入提示(第 2 行)。图 3(右上角)列出了我们的三种生成策略及其相应的指令。对于生成语言模型 MG 的首次调用,该算法还没有任何模糊测试输入的示例。因此,它将“生成新的”生成指令附加到输入提示中,引导模型生成第一批模糊测试输入(第 3 行)。
  • 接下来,算法进入主模糊测试循环(第 5 - 9 行),不断更新提示以创建新的模糊测试输入。为此,算法从前一批生成的模糊测试输入中选择一个示例,从所有对 SUT 有效的模糊测试输入中随机挑选(第 6 行)。除了该示例,算法还随机选择三种生成策略中的一种(第 7 行)。生成策略要么指示模型变异所选示例(变异现有的),生成一个与示例语义等价的模糊测试输入(语义等价),要么想出一个新的模糊测试输入(生成新的)。算法将初始输入提示、所选示例和所选生成策略连接成一个新的提示,然后用这个提示查询生成语言模型以生成另一批模糊测试输入(第 8 行)。
  • 主模糊测试循环会一直重复,直到算法用完模糊测试预算。对于每个创建的模糊测试输入,Fuzz4All 将输入传递给 SUT。如果用户定义的断言识别到意外行为,例如崩溃,那么算法将一份报告添加到检测到的漏洞集合中(第 4 行和第 9 行)。
3.2.2、Example: Fuzzing Loop
  • 图 3 展示了我们的模糊测试循环如何使用输入示例和生成策略来创建不同的模糊测试输入。在这种情况下,我们正在对一个 SMT 求解器进行模糊测试,其中输入是用 SMT2 语言编写的逻辑公式。最初,没有示例,因此,算法使用“generate-new”策略来合成新的模糊测试输入。接下来,以一个生成的、有效的模糊测试输入作为示例,算法基于“mutate-existing”策略查询模型以创建一个新的输入,该策略旨在对所选示例进行变异。我们观察到新的模糊测试输入通过交换变量的类型以及添加一些计算,对之前的输入进行了细微的修改。在接下来的模糊测试迭代中,算法选择之前生成的模糊测试输入作为示例,并使用“semantic-equiv”生成策略,旨在创建一个不修改给定示例语义的输入。这一次,我们观察到新的模糊测试输入只是向所选示例添加了一个语法标签。事实上,示例中所示的生成策略的组合帮助 Fuzz4All 生成了一个导致 SMT 求解器意外崩溃的模糊测试输入。该崩溃暴露了 Fuzz4All 在我们的评估期间检测到的一个真实世界的漏洞,该漏洞已被开发人员确认并修复。
3.2.3、Oracle
  • 在模糊测试循环期间,Fuzz4All 生成的模糊测试输入可用于根据断言检查被测试系统(SUT)的行为以检测漏洞。每个 SUT 的断言都是定制的,并且可以由用户完全定义和定制。例如,在对 C 编译器进行模糊测试时,用户可以定义一个差异测试断言,用于比较编译器在不同优化级别下的行为。在本文中,我们关注简单且易于定义的断言,例如由于段错误和内部断言失败导致的崩溃,更多细节在第 4.2 节中讨论。

4、Experimental Design

  • 我们根据以下研究问题对Fuzz4All进行了评估:
    • RQ1:Fuzz4All与现有的模糊器相比如何?
    • RQ2:Fuzz4All在执行目标模糊化方面的效果如何?
    • RQ3:不同的组件如何促进Fuzz4All的有效性?
    • RQ4:Fuzz4All发现了什么真实的漏洞?

4.1、Implementation

  • Fuzz4All 主要是用 Python 实现的。Fuzz4All 的自动提示和模糊测试循环组件仅包含 872 行代码(LoC)。与传统的模糊测试器(如 Csmith(> 80K LoC))相比,后者在实现生成器时需要大量的人工工作,Fuzz4All 的实现非常轻量。Fuzz4All 使用 GPT4作为提炼语言模型来执行自动提示,因为该模型在广泛的基于自然语言处理的推理任务中是最先进的。具体来说,我们通过OpenAI API使用 gpt-4-0613 检查点,最大令牌数(max_token)为 500。max_token 强制提示始终适合生成语言模型的上下文窗口。对于自动提示,我们采样四个候选提示,每个生成 30 个模糊测试输入,并使用基于有效率的评分函数进行评估(如第 3.1.1 节所述)。对于模糊测试循环,我们使用 Hugging Face 实现的 StarCoder模型作为生成语言模型,该模型在超过 80 种语言的超过一万亿个代码令牌上进行了训练。在生成模糊测试输入时,我们的默认设置使用温度为 1,批处理大小为 30,最大输出长度为 1024,使用核采样,top-p 为 1。

4.2、Systems Under Test and Baselines

  • 为了展示 Fuzz4All 的通用性,我们在六种输入语言和九个被测试系统(SUT)上对其进行评估。表 1 展示了每种语言、SUT 以及相应的基准工具。请注意,我们对每种语言的一个 SUT 进行覆盖率的比较,表 1 的最后一列显示了用于覆盖率测量的 SUT 版本。

4.3、Experimental Setup and Metrics

  • Fuzzing campaigns。对于 RQ1,我们使用 24 小时的模糊测试预算(包括自动提示)。为了考虑方差,我们对 Fuzz4All 和基线都重复实验五次。由于实验成本较高,对于后续的研究问题(RQs),我们使用 10,000 个生成的模糊测试输入作为模糊测试预算,并在消融研究中重复四次。
  • Environment。实验在一个具有 256GB 内存、运行 Ubuntu 20.04.5 LTS 操作系统的 64 核工作站上进行,配备 4 个 NVIDIA RTX A6000 GPU(每次模糊测试运行仅使用一个 GPU)。
  • Metrics。我们使用广泛采用的代码覆盖率指标来评估模糊测试工具。为了统一,我们报告评估中所研究的每个目标的行覆盖率。遵循先前的工作,我们使用Mann-Whitney U-test来计算统计显著性,并在适用的表(表 2 和表 4)中用*表示显著(p < 0.05)的覆盖率结果。我们还测量输入的有效率(%有效),即生成的有效且唯一的模糊测试输入的百分比。由于 Fuzz4All 支持通用和有针对性的模糊测试,为了评估有针对性的模糊测试的有效性,我们报告命中率,即使用特定目标特征(通过简单的正则表达式检查)的模糊测试输入的百分比。最后,我们还报告模糊测试最重要的指标和目标:Fuzz4All 为我们的九个被测试系统(SUT)中的每个所检测到的漏洞数量。

5、Results

5.1、RQ1: Comparison against Existing Fuzzers

5.1.1、Coverage over Time
5.1.2、Generation Validity, Number, and Coverage

5.2、RQ2: Effectiveness of Targeted Fuzzing

5.3、RQ3: Ablation Study

5.4、RQ4: Bug Finding

5.4.1、Examples

6、Threats to Validity

  • 内部
    • 主要的内部威胁来自于Fuzz4All的实施。为了解决这个问题,我们进行了代码审查和测试,以确保正确性。此外,我们尽可能地从它们提供的复制包中运行每个基线。
  • 外部
    • 主要的外部威胁是我们的评估目标。为了支持我们的一般性主张,我们在Fuzz4All应用于六种语言的九种不同的sut上。此外,为了解释长时间的模糊运行的差异,我们重复24小时的模糊运动5次,并检查有统计学意义的结果。由于一代LLM利用了在去年完成的培训中获得的知识,使用本工作中使用的LLM(StarCoder)的精确检查点重新应用Fuzz4All可能会由于数据转移而降低未来的有效性。Fuzz4All都可以使用自动提示步骤来缓解这种情况,其中更最新的文档/示例代码允许模型生成最新的模糊输入。另一个威胁来自于使用提炼LLM来产生初始输入,其中LLM可能会产生“幻觉”,即产生化妆或不准确信息。这种限制对于大多数使用LLM的管道来说都是常见的,我们希望在未来的工作中解决这个问题。

7、Conclusion

  • 我们提出了 Fuzz4All,这是一个通用的模糊测试器,利用大语言模型(LLMs)支持对接受多种编程语言的任意被测试系统(SUT)进行通用和有针对性的模糊测试。Fuzz4All 使用了一个新颖的自动提示阶段来生成输入提示,简洁地总结了用户提供的输入。在其模糊测试循环中,Fuzz4All 迭代地使用代码示例和生成策略更新初始输入提示,旨在生成多样化的模糊测试输入。对六种不同语言的九个不同 SUT 的评估结果表明,与最先进的工具相比,Fuzz4All 能够显著提高覆盖率。此外,Fuzz4All 能够检测到 98 个漏洞,其中 64 个已被开发人员确认为先前未知的。
;