论文学习_Fuzz4All: Universal Fuzzing with Large Language Models

论文名称 发表时间 发表期刊 期刊等级 研究单位
Fuzz4All: Universal Fuzzing with Large Language Models 2024年 arXiv - 伊利诺伊大学

0.摘要

研究背景 模糊测试再发现各种软件系统中的错误和漏洞方面取得了巨大的成功。以编程或形式语言作为输入的被测系统(SUT),例如编译器、运行时引擎、约束求解器以及具有可访问 API 的软件库尤为重要,因为它们是软件开发的基本构建块。
现存问题 SUT系统的现有模糊器通常针对特定语言,因此不能轻松应用于其他语言,甚至同一语言的其他版本。此外,现有模糊器生成的输入通常仅限于输入语言的特定功能,因此很难揭示与其他功能或新功能相关的错误。
核心思想 利用大语言模型(LLM)作为输入生成和变异引擎,这使得该方法能够为任何实际相关的语言生成多样化且真实的输入。
研究内容 论文提出首个通用模糊测试系统 Fuzz4All,该系统针对许多不同的输入语言以及这些语言对应的 SUT 系统进行模糊测试。具体来说,论文提出一种新颖的自动提示技术,该技术创建非常适合模糊测试的 LLM 提示,以及一种新颖的 LLM 支持的模糊循环,它迭代更新提示以创建新的模糊输入。
实验结果 论文在 9 个接受测试的系统上评估Fuzz4All,这些系统采用六种语言(C、C++、Go、SMT2、Java 以及 Python)作为输入。实验表明,在所有六种语言中,通用模糊测试比现有的特定语言模糊测试实现了更高的覆盖范围。此外,Fuzz4All 在 GCC、Clang、Z3、CVC5、OpenJDK 以及 Qiskit 量子计算平台等广泛使用的系统中发现了 98 个错误,其中 64 个错误已被开发人员确定为以前未知的。

1. 引言

研究背景:模糊测试是一种生成输入的自动化测试方法,旨在暴露被测系统(SUT)的以外行为,例如崩溃。研究人员和从业者以及成功构建了实用的模糊测试工具,这些工具在发现现实系统中的大量错误和漏洞方面取得了巨大成功。一个特别重要的 SUT 系列是接受编程或形式语言输入的系统,例如编译器、运行时引擎以及约束求解器等。人们为此类系统提出了许多模糊器,因为它们是软件开发的基本构建块。例如,编译器和运行时引擎中的错误会影响所有相应的下游应用程序。

现存问题:首先,现有的模糊器与目标系统紧耦合,模拟器的横向扩展性差。其次,现有的模糊器无法随着目标系统的升级而升级,模拟器纵向扩展性差。最后,现有的模糊器生成的测试样本质量不高,模拟器的测试样例生成效率低。

  • 问题一:传统的模拟器通常设计为针对特定语言或特定 SUT。然而,设计和实现模拟器非常耗时,例如 用于 C/C++ 编译的模糊器 Csmith 拥有超过 8 万行代码,用于 Linux 系统的模糊器 Syzkaller 包含数以万计的手工规则。由于每种目标语言各不相同,因此将一种输入语言实现模拟器的工作重用到另一种输入语言通常并非易事。此外,对一种 SUT 有效的模糊测试策略可能对另一种 SUT 根本不起作用。
  • 问题二:现实世界的系统在不断发展,例如,通过向输入语言添加新功能。为特定版本的语言或 SUT 设计的传统模糊器可能会在新版本上失去有效性,并且无法轻松用于测试新实现的功能。例如,Csmith 仅支持 C++11 之前的一组有限功能。事实上,最近的工作表明 Csmith 未能在新版本的 GCC 和 Clang 编译器中发生任何新的错误,这表明新版本的编译器正在变得不受现有模糊测试器的影响。
  • 问题三:即使在特定目标语言的范围内,基于生成和基于突变的模糊测试通常也无法覆盖大部分输入空间。基于生成的模糊器严重依赖输入语法来合成有效代码,并且还配备了语法规则来确保合成代码的有效性。为了生成大量有效的模糊测试输入或回避难以建模的语言特征,基于生成的模糊器通常使用完整语言语法的子集,这限制了它们只能测试所有语言特征的子集。同样,基于突变的模糊器受到其突变算子的限制,并且需要难以获得的高质量种子。

研究内容:论文提出第一个通用的模糊器 Fuzz4All,可以针对许多不太的输入语言以及这些语言的函数进行模糊测试。Fuzz4All 和目前的现存模糊器的有很大区别,例如 AFL 和 libFuzzer 使用极其简单的突变,不知道目标语言,因此很难产生有意义的编程语言模糊输入。Fuzz4All 的关键思想是利用大语言模型(LLM)作为输入生成引擎和变异引擎( LLM 接受了各种编程语言和其他形式语言的大量示例的预先训练,因此他们对这些语言的语法和语义有隐含的理解)。

具体实现:Fuzz4All的输入是用户提供的描述 SUT 的文档,以及可选的要关注的 SUT 的特定功能,例如以文档、示例代码以及正式规范的形式。然而,这些用户输入可能过于冗长,无法直接用作 LLM 的提示。为了解决上述问题,论文提出一个自动提示流程,自动将所有用户提供的输入提取为简洁有效的模糊测试提示(此提示是生成模糊输入的 LLM 初始输入)。由于使用相同的提示连续采样会导致许多类似的模糊输入,因此论文提出一个由 LLM 支持的模糊循环,它迭代更新提示以生成一组不太的模糊输入。为此,Fuzz4All 将先前迭代中生成的模糊输入与自然语言指令相结合,例如要求改变这些输入。最后,LLM 生成的模糊测试输入被传递到 SUT 以实现目标系统的模糊测试,例如检查系统崩溃。

Fuzz4All 解决了前面讨论的传统模糊器的局限性和挑战。(1)Fuzz4All 通过使用 LLM 作为生成引擎,可以应用广泛的 SUT 和输入语言,而不是为特定 SUT 精心设计单一用途的模糊器。(2)与针对特定版本的 SUT 或输入语言的现有模糊器相比,Fuzz4All 可以轻松地随目标一起发展。例如,要对新实现的功能进行模糊测试,用户只需要提供与该功能相关的文档或示例代码。(3)为了解决传统模糊器生成能力有限的问题,Fuzz4All 利用 LLM 在数十亿代码片段上进行预训练,使它们能够船舰可能遵循驶入语言的语法和语义约束的广泛示例。

实验结果:论文对 6 种输入语言(C

  • 25
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值