论文分享 | Fuzz4All: 基于大语言模型的通用模糊测试

大语言模型是当前最受关注的研究热点,基于其生成和理解能力,对现有领域在提升性能和效果上做更多尝试。分享一篇发表于2024年ICSE会议的论文Fuzz4All,它组合多个大语言模型以非常轻量且黑盒的方式,实现了一种跨语言和软件的通用模糊测试。

论文摘要

模拟测试在发现各种软件系统中的错误和漏洞方面取得了巨大成功,尤其是针对以编程语言或形式语言作为输入的被测系统(System Under Test,SUTs),例如编译器、运行时引擎、约束求解器和动态链接库等。现有的多种模糊测试工具通常只运行在特定语言上,无法直接应用于其他语言甚至同一语言的其他版本,且在进行模糊测试时也仅能发现特定功能的错误。

本文介绍了一种名为 Fuzz4All 的模糊测试工具,可以针对不同的语言及其特性进行通用的模糊测试。Fuzz4All 的核心思想是利用大语言模型作为输入生成和变异的引擎,使得其能够为任何相关语言提供多样化且真实的输入。为实现这一目标,论文提出了一种自动提示词技术,以及大语言模型驱动的模糊测试循环,可以迭代地更新提示词以创建新的输入。

作者在9个系统上测试了 Fuzz4All,其中包括了6种不同的语言(C、C++、Go、SMT2、Java 和 Python)作为输入,实验结果表明论文提出的通用模糊测试工具,相比于特定语言的模糊测试工具,具有更高的覆盖率。在广泛使用的系统中发现了98个错误,例如 GCC、Clang、Z3、CVC5、OpenJDK 和 Qiskit 量子计算平台,其中64个为以前未知的错误。

1 背景介绍

传统的模糊测试工具被分为基于生成的和基于变异的,其中基于生成的模糊测试工具旨在根据预定义的语法合成完整的代码片段,基于变异的模糊测试工具在高质量的种子输入上执行多种变异操作。当前的模糊测试工具都面临如下几个限制和挑战:

  • 挑战1:与目标系统和语言的紧耦合。传统的模糊测试工具,一般针对特定语言的代码或者特殊系统而开发,无法直接跨语言或跨系统使用。
  • 挑战2:缺少对系统更新的支持。实际系统或软件经常会进行更新迭代,而传统的模糊测试工具一般更适用于指定版本的系统和语言。
  • 挑战3:有限的输入生成能力。不论是基于生成的还是基于变异的模糊测试工具,其产生的输入很难覆盖到更大的输入空间。

本文提出的Fuzz4All利用大语言模型作为输入生成和变异的引擎,利用模型预训练提供的大量知识,来帮助模糊测试过程产生覆盖更广的输入。主要贡献包括:

  1. 通用化模糊测试,可同时支持多种不同的语言和系统进行模糊测试。
  2. 提示词自动生成,通过蒸馏用户提供的内容自动产生合适的提示词。
  3. 模型驱动的循环,通过设计算法持续且循环生成新的模糊测试用例。
  4. 实际使用的效果,交叉在6种语言和9个软件上验证了这套系统能力。

2 Fuzz4All 方法

Fuzz4All 首先输入任意的,描述执行模糊测试任务的【用户输入】,例如被测系统的文档、示例代码、或使用手册。这类用户输入通常十分的冗长,且仅部分相关,因此需要通过蒸馏提纯以获取更加精确的信息,再基于精确的信息来构造多样化的程序输入,循环执行模糊测试。图1展示了该方法的基本流程。

图1 Fuzz4All基本流程

图1 Fuzz4All基本流程

Autoprompting

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值