当前位置: 首页 > news >正文

论文分享 | 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 阶段,使用蒸馏大模型随机选取多个不同的候选提示词,每个候选的提示词通过生成大模型输出代码片段,Fuzz4All根据这些代码片段的质量选取最合适的提示词。

Fuzzing Loop 阶段,Fuzz4All持续地随机选取从生成大模型输出的代码片段,从中获得一个作为示例,应用生成策略如新产生、变异、语义等价再指导生成大模型输出新的代码片段,循环往复地利用产生的代码片段进行模糊测试,检查被测系统触发的崩溃。

Fuzz4All 使用 GPT-4 作为蒸馏大模型,StarCoder 作为生成大模型。

2.1 自动化提示词

用户输入可能包含关于被测系统的技术文档、示例代码、使用手册等,大模型可以直接使用这些内容来产生蒸馏提纯后的输入提示词,用于后续的模糊测试。

图2 自动化提示词生成算法

图2 自动化提示词生成算法

上述算法描述了 Fuzz4All 自动化生成提示词的过程,首先使用贪心策略生成一个候选提示词,再通过设置较高的温度来随机采样选取多个候选提示词, M D \mathcal{M}_\mathcal{D} MD 即蒸馏大模型。

下一步,Fuzz4All 在所有候选提示词中,计算得分来选取表现最好的作为模糊测试的输入提示词,论文中将候选集合的大小设置为30一批次。得分函数计算由该候选提示词产生的多个代码片段,在被测系统中成功验证的比率,比率越高则该候选提示词的得分越高, M G \mathcal{M}_\mathcal{G} MG 即生成大模型。

2.2 模糊测试循环

给定输入提示词,模糊测试循环可以利用生成大模型,迭代地产生程序输入。为了实现多样化,同时喂给大模型代码示例和生成指令,结合输入提示词以获取不同的程序输入。

图3 模糊测试循环执行算法

图3 模糊测试循环执行算法

上述算法描述了 Fuzz4All 执行模糊测试的过程,算法随机选取一个由输入提示词在生成大模型中产生的程序输入作为代码示例,再随机选取一个指令策略,结合输入提示词和代码示例一起喂给生成大模型,产生新的程序输入。

该过程循环直到满足时间条件,生成大模型每轮产生的代码片段都会随机采样给到下一轮作为输入,以尽可能地多样化模型输出。模糊测试产生的程序崩溃信息会被收集下来,最终返回进行分析。

图4 模糊测试指令策略和代码示例

图4 模糊测试指令策略和代码示例

上图列出了三种指令策略的对应内容和喂给大模型产生的代码片段示例,这些变异和新生成的代码片段将输入给被测系统进行模糊测试,在算法中使用 O r a c l e \mathrm{Oracle} Oracle 抽象表示检查被测系统的行为,从而发现漏洞(论文中使用段错误和内部断言错误来检查被测系统的崩溃)。

3 实验设计和效果

整体上看,思路是很简单的,大语言模型和模糊测试基本都是黑盒,进行巧妙的组合衔接,以期达到想要的效果。其中,最重要的部分就是实验,模糊测试的一个普遍目标函数是提高覆盖率,越高的覆盖率就越有几率碰撞出程序漏洞。Fuzz4All 选取了 6 种编程语言,对应 9 编译器作为被测系统,并分别使用了针对该被测系统的传统模糊测试工具做基线比较实验,如下表所示。

图5 被测系统和基线工具

图5 被测系统和基线工具

那么,实验需要评估以下几个研究问题:

  1. Fuzz4All 与现有的模糊测试工具相比如何?
  2. Fuzz4All 在有针对性的模糊测试效果如何?
  3. Fuzz4All 不同组件对它的效果有多大贡献?
  4. Fuzz4All 发现了哪些真实世界的软件漏洞?

3.1 与现有模糊测试工具比较

评价一个模糊测试工具,一个普遍的指标即代码或者分支覆盖率,覆盖率越高则探索的程序状态空间越多,发现更深层次漏洞的可能性也越大。

图6 覆盖率对比实验

图6 覆盖率对比实验

论文给出了对不同目标语言在对应基线工具上的实验对比,如上图所示。# programs 表示产生的独立代码片段,即模糊测试输入,的数量,% valid 表示在这些输入中通过被测系统验证的比例,Coverage 表示由模糊测试工具检查出的代码命中数量。

可以看到,Fuzz4All 产生了较少的代码片段,且这些代码片段通过被测系统的验证比率较低,获得了更高的覆盖率。

3.2 特定模糊测试目标的效果

评估对某个语言特性进行模糊测试的效果,以C语言为例,论文分别列举了typedefuniongoto三个关键字。结果给出了在不同关键字作为用户输入指定时,模糊测试的代码覆盖数量,以及对其他关键字相应的命中率。

图7 C语言关键字测试结果

图7 C语言关键字测试结果

举个例子,当针对typedef关键字作为测试目标时,产生的代码片段集合中,命中typedef关键字有83.11%,对应的命中union关键字有10.80%,而命中goto关键字只有0.22%。

通过命中率,也可以看出关键字之间typedefunion具有一定相关性,而goto与前两个关键字基本无关。关于其他语言的实验效果和观察细节可以翻阅原论文。

3.3 消融实验研究

Fuzz4All 主要靠自动化提示词和模糊测试循环两个关键组件构成,还是以C语言为例,比较系统自身在不同组件配合情况下,对被测系统的代码覆盖数量和通过被测系统验证的有效率。

图8 C语言消融实验结果

图8 C语言消融实验结果

其中,控制变量的含义如下。在自动化提示词中,no input表示不提供任何初始提示词,即不应用该模块;raw prompt表示直接使用用户提供的输入作为提示词,即蒸馏大模型未生效;autoprompt表示利用自动化提示词组件生成初始提示词。

在模糊测试循环中,w/o example表示禁用算法2中第6行example的采样操作,即每次都使用相同的初始化提示词;w/ example表示禁用算法2中第7行instruction的采样操作,即每次都使用产生新代码这种指令;FUZZ4ALL表示应用所有策略。

可以看到,每个组件都对Fuzz4All有一定的贡献,尤其是蒸馏大模型的筛选和初始化提示词的更新。目标是要达到更多的在被测系统中的代码覆盖数量,以及更低的模糊测试输入中的验证有效率。更多实验细节请翻阅原始论文。

3.4 真实漏洞发现

作者列出了所设计的通用模糊测试工具发现的错误实例,依旧以C语言为例,下图分别展示了GCC和Clang两款编译器软件的错误,一个是内部编译错误,另一个是段错误。

图9 真实发现的错误实例

图9 真实发现的错误实例

可以看到,这些代码的写法都比较隐晦,但也符合语法。具体这种漏洞能造成多大的影响以及如何利用,那就得依靠资深的渗透测试工程师的智慧了。

学习笔记

模糊测试的本质其实是在探索输入空间,尤其是非常规的输入能极大提高模糊测试的效果,大模型的泛化能力甚至是幻觉对于模糊测试而言都有很正向的意义。目前这部分的工作还处于较为粗糙的阶段,还有很多领域和技巧有待发掘,个人觉得是个很好的研究方向。最后,附上文献引用和DOI链接:

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.

https://doi.org/10.1145/3597503.3639121

相关文章:

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

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

VS Code 配置docker 管理员权限终端

问题描述 在容器中需要使用sudo或者su root时候,权限不够,被灵魂提问。 然而,镜像是官方发布的,翻遍了githubissues也没有找到password. 解决 Attach shell 在docker插件中,attach shell 可以直接获得shell。 所…...

使用Linux实现FTP云盘1

关于FTP服务器 FTP(文件传输协议)服务器是在互联网上提供文件存储和访问服务的计算机,它们依照FTP 协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。 程序运行,服务端不断接收客户端指令,服务 端可同时处…...

tombo resquiggle

Re-squiggle 算法 简介 纳米孔读取产生的电流信号水平数据称为squiggle。将这些squiggle信息进行基底呼叫通常与参考序列相比会包含一些错误。Re-squiggle算法定义了从squiggle到参考序列的新分配,即重新squiggle。 Re-squiggle算法是Tombo框架的基础。该算法输入包含原始信…...

vue3获取vue实例 并注册全局属性方法

vue3注册全局属性方法 前言一、app.config.globalProperties1 注册实例2 注册方法 二、依赖注入(Provide / Inject)1 注册实例2 注册方法3 一次性多次传入 最后 前言 在使用 Vue 时,多个地方使用同一个方法导致每个地方都需要按需引用&#…...

function calling后,如何让大模型进行自然语言输出?

在现代的自然语言处理(NLP)系统中,Function Calling 是指模型在对话过程中调用外部函数以获取特定数据或执行特定操作的能力。在 Function Calling 后,你可以将接收到的数据发送回大模型,并生成自然语言输出。以下是如…...

Android笔试面试题AI答之Kotlin(8)

文章目录 34.Kotlin 泛型中的“*”和“Any”有什么区别?Any*总结 35.Kotlin 协程在哪些方面优于 RxKotlin/RxJava?1. 语法简洁性和易读性2. 性能3. 错误处理和调试4. 场景适用性5. 学习和使用成本 36.Kotlin 协程中的 launch/join 和 async/await 有什么…...

LVS服务的搭建之NAT模式、DR模式的搭建实战

# LVS的概述 1/什么是LVS linux virtural server的简称,也就是linxu虚拟机服务器,使用lvs可以达到的技术目标是:通过linux达到负载均衡技术和linux操作系统实现一个高性能高可用的linux服务器集群,他具有良好的可靠性&#xff0…...

Raft分布式存储

文章目录 前言一、项目大纲二、Raft模块1.Raft介绍2.大致内容Leader与选举日志同步、心跳raft日志的两个特点 3.主要流程1. raft类的定义关键函数m_nextIndex 和 m_matchIndex作用 2.启动初始化3.竞选leaderelectionTimeOutTicker:doElectionsendRequestVoteRequestVote 4.日志…...

【Linux】使用nm命令查看动态库包含的符号表

【Linux】使用nm命令查看动态库包含的符号表 文章目录 【Linux】使用nm命令查看动态库包含的符号表1. nm的简介2. nm的使用3. nm查找具体的函数名或变量名Reference 1. nm的简介 nm命令来自name的简写。nm命令常用于查看二进制文件中的符号表,通常用于静态库和可执…...

你还不知道苹果手机截长图的方法?4 种方法都可以

苹果手机截长图 先给大家介绍第一个苹果手机截长图的方法,如果你是在 Safari 浏览器中想要截图分享的话,浏览器截图自带可以截取全页的选项,让你实现截长屏的操作。首先找到你想要截取的网页,然后按下手机的电源按键以及音量按键…...

C++选择题带答案

1. 在定义成员函数时给出的成员函数的正确标记是 (1) 。 (a) <类名>.<函数名> (b) <类名>::<函数名> (c) <对象名>.<函数名> (d) <对象名>::<函数名> 2&#xff0e;以下关于函数指针的叙述中&#xff0c;正确…...

Unity动画模块 之 简单创建一个序列帧动画

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 1.什么是序列帧动画 序列帧动画简单来讲就是通过连续播放一系列静态图像&#xff0c;形成动态视觉效果的过程&#xff…...

学会高效记录并整理编程学习笔记

文章目录 一、前言二、建议和方法2.1 明确笔记目的2.2 选择合适的工具2.3 结构化笔记2.4 高效记录技巧2.5 图文并茂2.6 定期回顾与整理2.7 利用搜索与链接2.8 分享与交流2.9 实践与应用 三、总结 一、前言 高效记录并整理编程学习笔记是提升学习效率和巩固知识的重要手段&…...

Llama 3.1中文微调数据集已上线,超大模型一键部署

7 月的 AI 圈真是卷完小模型卷大模型&#xff0c;精彩不停&#xff01;大多数同学都能体验 GPT-4o、Mistral-Nemo 这样的小模型&#xff0c;但 Llama-3.1-405B 和 Mistral-Large-2 这样的超大模型让很多小伙伴犯了难。 别担心&#xff01;hyper.ai 官网在教程板块为大家提供了…...

css实现太极图

<template><div><!-- 太极图 --><div class"all"><div class"left box"></div><div class"right box"></div><div class"black"><div class"inner_white"><…...

Android 13 移植EthernetSettings/Ethernet更新

移植EthernetSettings Android 13 在Settings搜索没有发现以太网设置,应该是移除了,但是客户的设备需要,所以移植Android 11的. 以太网相关的功能在Android13中进行模块化,提取到packages/modules/Connectivity/中, EthernetManager相关代码从framework移到packages/modules/…...

极狐GitLab 如何设置访问令牌前缀?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…...

leetcode日记(72)最大矩形

依旧是看了答案才知道大概方法…太难想到了 和上一道题思路相似&#xff01;可以直接调用上题的函数&#xff0c;只不过调用前的准备非常难想到&#xff0c;就是建造形状相同的矩阵&#xff0c;第i行j列的元素是i行中j列前相邻的“1”的个数。 class Solution { public:int m…...

自驾畅游保定:参观总督署,品美食文化

这是学习笔记的第 2490篇文章 前几天跟孩子聊天&#xff0c;孩子说暑假都没出去玩了&#xff0c;暑假旅行的作业咋写&#xff1f;让我有满满的负疚感&#xff0c;去附近的公园、吃点美食不算旅游&#xff0c;得了&#xff0c;得安排一下一日游。 几个月前心心念的去保定&#x…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...