【论文阅读】Fuzz4All: Universal Fuzzing with Large Language Models

news2024/11/28 18:45:42

文章目录

  • 摘要
  • 一、介绍
  • 二、Fuzz4All的方法
    • 2.1、自动提示
      • 2.1.1、自动提示算法
      • 2.1.2、自动提示的例子
      • 2.1.3、与现有自动提示技术的比较
    • 2.2、fuzzing循环
      • 2.2.1、模糊循环算法
      • 2.2.2、Oracle
  • 三、实验设计
    • 3.1、实现
    • 3.2、被测系统和baseline
    • 3.3、实验设置以及评估指标
  • 四、结果分析
    • 4.1、RQ1:Fuzz4Aall与现有模糊器相比如何?
    • 4.2、RQ2:Fuzz4All在执行有针对性的模糊处理方面的有效性如何?
    • 4.3、RQ3:不同的组件如何影响Fuzz4All的有效性?
    • 4.4、RQ4:Fuzz4All在现实世界中发现了哪些bug?
  • 五、结论


摘要

  Fuzzing在发现各种软件系统中的错误和漏洞方面取得了巨大成功。以编程或形式语言为输入的被测系统(SUT),例如编译器、运行时引擎、约束求解器和具有可访问API的软件库,尤其重要,因为它们是软件开发的基本构建块。然而,用于此类系统的现有模糊器通常针对特定语言,因此不能容易地应用于其他语言甚至同一语言的其他版本。此外,现有模糊器生成的输入通常仅限于输入语言的特定特征,因此很难揭示与其他或新特征相关的错误。
  本文介绍了Fuzz4All,这是第一个通用的模糊器,它可以针对许多不同的输入语言和这些语言的许多不同特征。Fuzz4All背后的关键思想是利用大型语言模型(LLM)作为输入生成和变异引擎,这使得该方法能够为任何实际相关的语言生成多样化和现实的输入。为了实现这一潜力,我们提出了一种新的自动提示技术,该技术创建了非常适合模糊处理的LLM提示,以及一种新颖的LLM驱动的模糊循环,该循环迭代更新提示以创建新的模糊输入。
  我们在九个测试系统上评估Fuzz4All,这些系统采用六种不同的语言(C、C++、Go、SMT2、Java和Python)作为输入。评估表明,在所有六种语言中,通用模糊比现有的特定语言模糊实现了更高的覆盖率。此外,Fuzz4All已经在广泛使用的系统中发现了98个漏洞,如GCC、Clang、Z3、CVC5、OpenJDK和Qiskit量子计算平台,其中64个漏洞已经被开发人员确认为以前未知的。

一、介绍

  传统的模糊器分为基于生成的模糊器和基于突变的模糊器:

  • 基于生成的模糊器:直接合成完整的代码片段
  • 基于突变的模糊器:将突变算子或转换规则应用于高质量模糊种子集

  但是这两种模糊器都面临着两种挑战

  • C1:现有模糊器与特点的语言和待测系统紧密耦合,将对于一种语言有效的模糊器应用于另一种语言可能就会完全无效,并且需要花费大量精力去针对特定语言设计模糊器。
  • C2:缺乏对于更新后软件或语言的支持,例如,Csmith仅支持C++11之前的一些有限功能,但是对于后面更新的功能则无法支持。
  • C3:生成能力受限,即使在特定语言的目标范围内,这两种模糊器都无法覆盖大部分的输入空间。基于生成的模糊器严重依赖输入语法来生成有效代码,且依赖语义规则来保证API的调用依赖,基于突变的模糊器受到算子的限制,并且难以获得高质量的种子。

  本文基于以上挑战,设计了第一个通用的模糊器Fuzz4All,Fuzz4All不同于AFL和Libfuzzer,Fuzz4All关键思想是利用大模型作为输入生成和突变引擎,由于大模型接受了各种编程语言的预训练,因此它可以有效的为多种语言进行突变和输入生成。从而解决上述的挑战。

  • 针对C1,通过使用LLM作为生成引擎,应用于广泛的被测系统以及语言
  • 针对C2,Fuzz4All可以跟随被测目标一起更新
  • 针对C3,大模型在数十亿的代码片段上进行训练,使得它能够具有广泛的生成能力

二、Fuzz4All的方法

在这里插入图片描述
  Fuzz4All主要由两部分组成,自动提示以及fuzzing循环。

2.1、自动提示

  该步骤通过自动提示将给定的用户输入提取为适合模糊处理的提示。用户输入可以描述一般的被测系统,或者被测系统的特定特征。用户输入可以包括技术文档、示例代码、规范,或者甚至不同模态的组合。与传统的模糊器要求输入遵循特定格式不同(例如,用作种子的代码片段或格式良好的规范),Fuzz4All可以直接理解用户输入中的自然语言描述或代码示例。然而,用户输入中的一些信息可能是多余的或不相关的,因此,自动提示的目标是生成一个提取的输入提示,从而实现有效的基于LLM的模糊处理。

2.1.1、自动提示算法

在这里插入图片描述
  在这个算法中,userInput表示用户输入,numSamples表示生成的候选提示数量,输出的inputPrompt表示用于输入模糊循环的输入提示。第二行伪代码中, M D M_D MD表示蒸馏大模型,APInstruction表示自动提示命令,文中使用的是Please summarize the above information in a concise manner to describe the usage and functionality of the target
  在生成了一定数量的提示词之后,在第七行伪代码里把生成的所有提示词放到评分函数中评分并排序,并从中选出最好的提示词作为输入放到下面的fuzzing循环阶段。

2.1.2、自动提示的例子

  使用了C++23下的std::expected来举例子,展示自动生成的提示

2.1.3、与现有自动提示技术的比较

  本文是第一个使用黑匣子自动提示从软件工程任务的任意用户输入中自动提取知识的文章。与之前在NLP和软件工程中关于自动提示的工作相比(通过访问模型梯度来优化提示),我们的自动提示只需要访问蒸馏LLM的黑盒采样。虽然使用评分函数来评估每个提示与NLP[87]中最近的工作类似,但我们的评分函数直接评估生成有效代码片段的确切下游任务的提示,而不是使用近似的代理评分函数

2.2、fuzzing循环

  给定在Fuzz4All的第一步中创建的输入提示,模糊循环的目标是使用生成LLM生成不同的模糊输入。然而,由于LLM的概率性,使用相同的输入进行多次采样会产生相同或相似的代码片段。对于模糊化,我们的目标是避免这种重复输入,而是希望生成一组不同的模糊化输入,覆盖新代码并发现新错误。为了实现这一目标,我们利用LLM的能力,利用示例和自然语言指令来指导生成。
  模糊循环的高级思想是通过从以前的迭代中选择一个模糊输入示例并指定一个生成策略来不断增加原始输入提示。使用示例的目的是演示我们希望生成LLM生成的代码片段的类型。生成策略被设计为关于如何处理所提供的代码示例的指令。这些策略受到传统模糊器的启发,模仿它们合成新的模糊输入(如基于生成的模糊器)和产生先前生成的输入的变体(如基于突变的模糊器中)的能力。在模糊循环的每次新迭代之前,Fuzz4All都会在输入提示中添加一个示例和一个生成策略,使生成LLM能够连续创建新的模糊输入。

2.2.1、模糊循环算法

在这里插入图片描述
  模糊循环算法的大致流程如图所示,它接受从上一流程传来的提示词,并通过生成式大模型完成三种变异,分别是

  • 1、通过提示词生成新的模糊输入
  • 2、通过提示词变异已经存在的代码
  • 3、通过提示词创建与给定示例相同语义的输入

在这里插入图片描述

  输入是初始输入提示和模糊预算。最终输出是由用户定义的预言机(Oracle)识别的一组错误。
  首先,该算法初始化生成策略(生成新的、变异现有的和语义等价),这些策略将用于在模糊循环期间修改输入提示(第2行)。 M G M_G MG表示的生成LLM的第一次调用,该算法还没有任何模糊输入的例子。因此,它在输入提示中添加生成新一代指令,该指令引导模型生成第一批模糊输入(第3行)。
  接下来,算法进入主模糊循环(第5-9行),该循环不断更新提示以创建新的模糊输入。为此,该算法从前一批生成的模糊输入中选择一个示例,从所有对SUT有效的模糊输入随机选取(第6行)。除了示例之外,该算法还随机选择三种生成策略中的一种(第7行)。生成策略要么指示模型对所选示例进行变异(变异现有示例),要么生成与该示例在语义上等效的模糊输入(语义等效),要么提出新的模糊输入。
  该算法将初始输入提示、所选示例和所选生成策略连接到一个新提示中,然后用该提示查询生成LLM,以生成另一批模糊输入(第8行)。重复主模糊循环,直到算法耗尽模糊预算为止。对于每个创建的模糊输入,Fuzz4All将输入传递给SUT。如果用户定义的预言机识别出意外行为,例如崩溃,则算法会向检测到的错误集添加一个报告(第4行和第9行)。

2.2.2、Oracle

  Fuzz4All在模糊化循环期间产生的模糊化输入可用于对照oracle检查SUT的行为,以检测错误。oracle是为每个SUT定制的,它可以由用户完全定义和定制。例如,当模糊C编译器时,用户可以定义一个差分测试预言机,用于比较不同优化级别下的编译器行为,在本文中,我们将重点讨论简单易定义的预言机,例如由于分段故障和内部断言故障导致的崩溃。

三、实验设计

  本文根据以下四个问题进行评估:

  • Fuzz4Aall与现有模糊器相比如何?
  • Fuzz4All在执行有针对性的模糊处理方面的有效性如何?
  • 不同的组件如何影响Fuzz4All的有效性?
  • Fuzz4All在现实世界中发现了哪些bug?

3.1、实现

  Fuzz4All主要是用Python实现的。Fuzz4All使用GPT4作为蒸馏LLM来执行自动提示,主要是使用通过OpenAI API提供的最大token为500的gpt-4-0613检查点。max_token强制提示始终适合生成LLM的上下文窗口。对于自动提示,我们对四个候选提示进行采样,每个提示生成30个模糊输入,并使用基于有效率的评分函数进行评估(如第3.1.1节所述)。对于模糊循环,我们使用HuggingFace上的StarCoder[41]模型作为生成LLM,该LLM在80多种语言的一万亿个代码令牌上进行训练。当生成模糊输入时,我们的默认设置使用温度为1,批大小为30,最大输出长度为1024,使用核采样,top-p为1。

3.2、被测系统和baseline

  针对六种语言的九个被测系统进行测试,如下:
在这里插入图片描述

3.3、实验设置以及评估指标

  对于RQ1,自动提示和模糊循环每个任务用时24小时
  对于其他RQ,使用10000个生成的模糊输入的模糊预算,并重复四次进行消融研究。
环境
  Ubuntu 20.04.5 LTS、256 GB内存、RTX A6000 GPU
评估指标
  我们使用广泛采用的代码覆盖率度量来评估模糊工具[7,36,76]。为了统一,我们报告了评估中研究的每个目标的line coverage。根据先前的工作[36],我们使用Mann-Whitney U型检验来计算统计显著性。我们还将输入的有效率(%valid)测量为生成的有效且唯一的模糊输入的百分比。由于Fuzz4All同时支持通用模糊和目标模糊,为了评估目标模糊的有效性,我们报告了命中率,即使用特定目标特征的模糊输入的百分比(用简单的正则表达式检查)。最后,我们还报告了模糊化最重要的指标和目标:Fuzz4All在九个SUT中检测到的错误数量。

四、结果分析

4.1、RQ1:Fuzz4Aall与现有模糊器相比如何?

随时间变化的覆盖率
  
  图中的实线表示平均覆盖率,范围表示五次测试下来的最大值和最小值,每一幅小图中,都是Fuzz4All与其语言对应的模糊器的比较。

生成测试的有效性、数量和覆盖率
在这里插入图片描述  这张表中展示了对于不同的被测目标,Fuzz4All与相对应应用于该目标的模糊器进行比较,分别是在生成测试的有效性、数量和覆盖率这三个方面进行比较。

4.2、RQ2:Fuzz4All在执行有针对性的模糊处理方面的有效性如何?

  这里主要是评估Fuzz4All执行有针对性的模糊处理的能力,即生成聚焦于特定特征的模糊输入。对于每个目标SUT和语言,我们针对三个不同的示例特征,并将它们与RQ1中使用的具有一般用户输入的设置进行比较(如第4.3节所述)。这些功能是内置的库或函数/API(Go、C++和Qiskit)、语言关键字(C和Java)和理论(SMT)。目标模糊运行的用户输入是我们关注的特定功能的文档。表3显示了目标模糊的结果以及RQ1中使用的默认通用模糊。每一列都代表一个有针对性的模糊化运行,我们将重点放在一个特性上。每个单元格中的值显示了特定模糊运行的特征(第4.3节)的命中率。我们还包括获得的覆盖结果。

4.3、RQ3:不同的组件如何影响Fuzz4All的有效性?

  这里主要是基于Fuzz4All的两个关键组件进行了消融研究:(a)自动提示,即提供给生成LLM的初始输入提示的类型;(b) 模糊循环,使用选定的例子和生成策略。我们研究了两个关键组成部分中每一个的三种变体。

在这里插入图片描述
  首先,我们研究了提供给生成LLM的不同初始输入的影响。为了减少额外因素的影响,我们将生成策略固定为仅使用生成新的并研究三个变动条件下的覆盖率和有效性

  • 1)无输入不使用任何初始提示
  • 2)原始提示直接使用原始用户输入作为初始输入
  • 3)autoprompt应用autoprompt生成初始提示

  接下来,我们通过保持初始提示相同(通过使用默认的自动提示)来检查模糊循环设置的不同变体:

  • 1)w/o example表示在模糊循环期间不选择示例(即,它从相同的初始提示连续采样)
  • 2)w/ example选择示例但仅使用生成新指令2
  • 3)Fuzz4All是使用所有生成策略的完整方法。

4.4、RQ4:Fuzz4All在现实世界中发现了哪些bug?

在这里插入图片描述

五、结论

  我们介绍了Fuzz4All,这是一种通用模糊器,利用LLM来支持任意SUT的通用模糊和有针对性的模糊,这些SUT采用多种编程语言。Fuzz4All使用一个新颖的自动提示阶段来生成输入提示,简要总结用户提供的输入。在模糊循环中,Fuzz4All使用代码示例和生成策略迭代更新初始输入提示,以产生不同的模糊输入。对六种不同语言的九种不同SUT的评估结果表明,与最先进的工具相比,Fuzz4All能够显著提高覆盖率。此外,Fuzz4All能够检测到98个bug,其中64个已经被开发人员确认为以前未知的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1650106.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt | QComboBox(组合框)

01、上节回顾 Qt 基础教程合集02、QComBox 一、QComboBox 类(下拉列表、组合框) 1、QComboBox 类是 QWidget 类的直接子类,该类实现了一个组合框 2、QComboBox 类中的属性 ①、count:const int 访问函数:int count() const; 获取组合框中的项目数量,默认情况下,对于空…

nginx 负载均衡、反向代理实验

nginx 负载均衡、反向代理实验 实验目的 理解概念:明确反向代理和负载均衡的基本概念及其在网络架构中的作用。 掌握技能:学习如何配置Nginx以实现反向代理和负载均衡功能。 实践应用:通过实际操作,体验Nginx如何提升Web服务的可…

246 基于matlab的交流电机动态方程

基于matlab的交流电机动态方程,用于交流电机动态分析。输入电机的额定功率(kW)、电机的额定转速(r/min)、转子外径(m)、铁心长(m)转子槽数、电机极对数 等参数,输出转速变化、力矩变化等结果。程序已调通,可直接运行。 246 交流电机动态 转速…

一堆自定义C#代码片段,让你开发效率飞涨

SharpBoxes 是一款用于 Visual Studio 的扩展,作者为本人; 该扩展旨在提高开发效率。它为开发人员提供了一组日常使用频率较高的代码片段,让你在编写代码时能够更快地插入常用的代码段。通过安装这个扩展,你可以使用快捷键轻松插…

笔记本连接不上远程桌面,笔记本无法连接远程桌面的可能原因及解决方法

在使用远程桌面功能时,笔记本无法成功连接的情况可能由多种原因引起。为了有效地解决这个问题,我们需要逐一排查这些可能的原因,并采取相应的解决措施。 首先,网络连接稳定性是远程桌面连接成功的关键。请确保笔记本和远程计算机之…

【数据结构】链表经典OJ题目练习(2)

面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode) 思路1:先计算出链表的长度,在将链表中的值存在数组中,在返回第k个节点。 思路2:利用快慢指针,先让快指针走k步,在让快慢指针分…

北京大学-知存科技存算一体联合实验室揭牌,开启知存科技产学研融合战略新升级

5月5日,“北京大学-知存科技存算一体技术联合实验室”在北京大学微纳电子大厦正式揭牌,北京大学集成电路学院院长蔡一茂、北京大学集成电路学院副院长鲁文高及学院相关负责人、知存科技创始人兼CEO王绍迪、知存科技首席科学家郭昕婕博士及企业研发相关负…

谷歌推出10门免费AI课程,无需教科书及费用

谷歌面向小白以及开发者分别推出了不同的AI课程~ 包含初级、中级和高级。课程章节大致包括:(含教学视频、参考材料、测验) 基础入门:45分钟深入了解生成式AI 简单实操:30分钟掌握大语言模型 了解如何释放生成式 AI S…

02-Fortran基础--Fortran操作符与控制结构

02-Fortran基础--Fortran操作符与控制结构 0 引言1 操作符1.1 数学运算符1.2 逻辑运算符1.3 关系运算符 2 控制流程2.1 条件结构2.2 循环结构2.3 分支结构 0 引言 运算符和控制流程对编程语言是必须的,Fortran的操作符和控制流程涉及到各种数学运算符、逻辑运算符以及控制结构。…

学习云计算亚马逊云科技AWS的6大教科书神级别免费网站

亚马逊☁️(AWS)是全球云行业最🔥火云平台,云行业的就业机会和市场前景都非常巨大,现在通过学AWS去转云会是个千载难逢的好机会。小李哥这次来盘点学习AWS的6大教科书级免费官方网站(免费课程+动手实验)。欢迎大家点击图片左下角加…

栈的实现以及c语言解决括号匹配问题

一、栈的实现 1、头文件 typedef int STDataType; typedef struct Stack {STDataType* _a;int _top; // 栈顶int _capacity; // 容量 }Stack; // 初始化栈 void StackInit(Stack* ps); // 入栈 void StackPush(Stack* ps, STDataType data); // 出栈 void StackPop(S…

C语言内存函数memcpy与memmove

一.memcpy的使用和模拟实现 1.函数原型 void* memcpy(void* destination, const void* source, size_t num); destination是目标内存块的指针 source是源内存块的指针 num是要复制的字节数 .函数memcpy从source的位置开始向后复制 num个字节 的数据到destination指向的内存位置…

无人零售,重塑购物新纪元

在这个快节奏的时代,科技的每一次跃进都在悄无声息地改变着我们的生活方式。而今,无人零售正以雷霆之势,颠覆传统购物模式,为我们带来前所未有的便捷与智能体验。想知道无人零售如何彻底改变我们的购物方式吗?跟随我&a…

2024五一劳动节活动策划方案

2024五一劳动节打工人青松游园大会(劳动节放青松主题)活动策划方案-51P.pptx 活动策划信息: 方案页码:51页 文件格式:PPT 方案简介: 劳动是世界上最伟大的事 所以我们该把一些劳动留给明天&#xff0…

Offline:IQL

ICLR 2022 Poster Intro 部分离线强化学习的对价值函数采用的是最小化均方bellman误差。而其中误差源自单步的TD误差。TD误差中对target Q的计算需要选取一个max的动作,这就容易导致采取了OOD的数据。因此,IQL取消max,,通过一个期望回归算子…

【Stable Diffusion本地部署简易教程】从入门到实践

Stable Diffusion 本地部署指南:简单易懂的图文教程 引言 Stable Diffusion是一种深度学习模型,用于生成高质量的图像。本地部署意味着你可以在自己的计算机上运行这个模型,从而无需依赖于在线服务。本教程将循序渐进地指导你如何在自己的计…

勾股定理 口诀

def t_o(a):t int(a/2)b t*t-1c t*t1f (a*ab*bc*c)print(f,ou,a,b,c,a*ab*b,c*c)def t_j(a):t a*abint(t/2)c t-bf (a*ab*bc*c)print(f,j-,a,b,c,f,a*ab*b,c*c)for i in range(2,100,2):t_o(i)t_j(i1) 奇数平方写连续 偶数半方加减一

Java 框架安全:Spring 漏洞序列.(CVE-2022-22965)

什么叫 Spring 框架. Spring 框架是一个用于构建企业级应用程序的开源框架。它提供了一种全面的编程和配置模型,可以简化应用程序的开发过程。Spring 框架的核心特性包括依赖注入(Dependency Injection)、面向切面编程(Aspect-Or…

【网络编程】http协议

预备知识 什么是http协议 HTTP(Hypertext Transfer Protocol,超文本传输协议)是一个应用层的协议,用于在网络中传输超文本(如HTML文档)。HTTP协议建立在TCP/IP协议之上,是Web浏览器和Web服务器…

数据结构之链表深度讲解

小伙伴们,大家好呀,上次听我讲完顺序表想必收获不少吧,嘿嘿,这篇文章你也一样可以学到很多,系好安全带,咱们要发车了。 因为有了上一次顺序表的基础,所以这次我们直接进入正题,温馨…