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

文章目录

  • 摘要
  • 一、介绍
  • 二、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.mzph.cn/diannao/7938.shtml

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

相关文章

每日OJ题_贪心算法三③_力扣45. 跳跃游戏 II(dp解法+贪心解法)

目录 力扣45. 跳跃游戏 II 解析代码1_动态规划 解析代码2_贪心 力扣45. 跳跃游戏 II 45. 跳跃游戏 II 难度 中等 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 num…

ws注入js逆向调用函数

这里需要选择一个文件夹 随便 紫色为修改保存 记得ctrls保存 注入代码如下 (function() {var ws new WebSocket("ws://127.0.0.1:8080")ws.onmessage function(evt) {console.log("收到消息:" evt.data);if (evt.data "exit") {…

PHPStudy Apache或者MySQL启动以后自动停止

问题 phpstudy小皮面板中的Apache或MySQL启动以后自动停止 正在启动——已启动——已停止 总结:最主要的原因:端口冲突 端口冲突了,已经有其他程序占用了80、3306端口。 也就是说你的电脑上已经有了一个Apache、MySQL并且正在运行。 解决方案…

C++ list 介绍

&#x1f308;一、认识list这个模版 ist是一个模版&#xff0c;需要结合一个具体的数据类型作为模版参数&#xff0c; 即list < T > <T> <T>&#xff0c;才能成为一个类类型。list是双向循环链表&#xff0c;是序列容器&#xff0c;允许在序列中的任何位置进…

DNS域名解析服务的部署及优化方案

实验要求: 1.配置2台服务器要求如下&#xff1a; a&#xff09;服务器1&#xff1a; 主机名&#xff1a;dns-master.timinglee.org ip地址&#xff1a; 172.25.254.100 配置好软件仓库 b&#xff09;服务器2&#xff1a; 主机名&#xff1a;dns-slave.timinglee.org ip地址&am…

MySQL数据库练习——视图

schooldb库——utf8字符集——utf8_general_ci排序规则 先创建库&#xff0c;再去使用下列的DDL语句。 DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL COMMENT 创建时间,modifyDate datetime DEFAULT NULL …

使用 GPT-4-turbo+Streamlit+wiki+calculator构建Math Agents应用【Step by Step】

&#x1f496; Brief&#xff1a;大家好&#xff0c;我是Zeeland。Tags: 大模型创业、LangChain Top Contributor、算法工程师、Promptulate founder、Python开发者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 个人说明书&#xff1a;Zeeland&…

机器人系统ros2-开发实践07-将机器人的状态广播到 tf2(Python)

上个教程将静态坐标系广播到 tf2&#xff0c;基于这个基础原理这个教程将演示机器人的点位状态发布到tf2 1. 写入广播节点 我们首先创建源文件。转到learning_tf2_py我们在上一教程中创建的包。在src/learning_tf2_py/learning_tf2_py目录中输入以下命令来下载示例广播示例代码…

双ISP住宅IP有何优势?

双ISP住宅IP在当前的互联网环境中具有显著的优势&#xff0c;这些优势主要体现在网络连接的稳定性、安全性、速度以及业务适用范围等方面。以下是对双ISP住宅IP优势的详细分析&#xff1a; 第一点网络连接的稳定性&#xff0c;双ISP住宅IP使用两个不同的互联网服务提供商&…

区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(三)

&#x1f436;原文&#xff1a; Preventing Content Cloning in NFT Collections &#x1f436;写在前面&#xff1a; 这是一篇 2023 年的 CCF-C 类&#xff0c;本博客只记录其中提出的方法。 F C o l l N F T \mathbf{F_{CollNFT}} FCollNFT​ and Blockchains with Native S…

SpringBoot2 仿B站高性能前端+后端项目(wanjie)

SpringBoot2 仿B站高性能前端后端项目(完结) Spring Boot 2 仿B站高性能前端后端项目&#xff1a;打造高效、稳定、可扩展的应用 在当今的互联网时期&#xff0c;网站的性能、稳定性和可扩展性成为了权衡一个项目胜利与否的关键要素。本文将引见如何运用 Spring Boot 2 构建一…

智启算力平台基本操作

智启算力平台 智启算力平台路径搭载数据集搭载镜像配置 智启算力平台 开发文档 帮助文档 - OpenI - 启智AI开源社区 路径搭载 OpenIOSSG/promote: 启智AI协作平台首页推荐组织及推荐项目申请。 - notice/Other_notes/SDKGetPath.md at master - promote - OpenI - 启智AI开…

数据结构-线性表-应用题-2.2-11

1)算法的基本设计思想&#xff1a; 分别求两个升序序列的中位数a,b 若ab&#xff0c;则a或b即为所求中位数 若a<b&#xff0c;则舍弃A中较小的一半&#xff08;中位数偏小&#xff0c;往后面找&#xff09;&#xff0c;同时舍弃序列B中较大的一半&#xff0c;两次舍弃长度…

【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 子集(解法2)(难度⭐⭐)(72)

1. 题目解析 题目链接&#xff1a;78. 子集 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 为了生成一个给定数组 nums 的所有子集&#xff0c;我们可以利用一种称为回溯&#xff08;backtracking&#xff09;的算法…

pytest(二):关于pytest自动化脚本编写中,初始化方式setup_class与fixture的对比

一、自动化脚本实例对比 下面是一条用例,使用pytest框架,放在一个类中,两种实现方式: 1.1 setup_class初始化方式 1. 优点: 代码结构清晰,setup_class 和 teardown_class 看起来像传统的类级别的 setup 和 teardown 方法。2. 缺点: 使用 autouse=True 的 fixture 作为…

Mac 链接 HP 136w 打印机步骤

打开 WI-FI 【1】打开打印机左下角Wi-Fi网络设计【或者点击…按钮进入WI-FI菜单】&#xff0c;找到NetWork选项OK进入&#xff1b; 【2】设置WI-FI选项&#xff1a;在菜单内找到Wi-Fi选项OK进入&#xff1b; 【3】在菜单内找到Wi-Fi Direct选项OK进入&#xff1b; 【4】在菜单…

java:File类概述和构造方法

一、File类概述和构造方法 1.File类的概述 File&#xff1a;它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的对File而言&#xff0c;其封装并不是一个真正存在的文件&#xff0c;仅仅是一个路径名而已。它可以是存在的&#xff0c;也可以是不存在的。…

瑞友天翼应用虚拟化系统SQL注入致远程代码执行漏洞复现

0x01 产品简介 瑞友天翼应用虚拟化系统是西安瑞友信息技术资讯有限公司研发的具有自主知识产权,基于服务器计算架构的应用虚拟化平台。它将用户各种应用软件集中部署在瑞友天翼服务器(群)上,客户端通过WEB即可快速安全的访问经服务器上授权的应用软件,实现集中应用、远程接…

人工智能-2024期中考试

前言 人工智能期中考试&#xff0c;认真准备了但是没考好&#xff0c;结果中游偏下水平。 第4题没拿分 &#xff08;遗传算法&#xff1a;知识点在课堂上一笔带过没有细讲&#xff0c;轮盘赌算法在书本上没有提到&#xff0c;考试的时候也没讲清楚&#xff0c;只能靠猜&…

Python网络协议socket

01 协议基础 01 网络协议 协议&#xff1a;一种规则 网络协议&#xff1a;网络规则&#xff0c;一种在网络通信中的数据包的数据规则 02 TCP/IP协议 osi模型 tcp/ip协议 03 tcp协议 TCP协议提供了一种端到端的、基于连接的、可靠的通信服务。 三次握手 创建连接 四次挥手…