论文分享 | PromptFuzz:用于模糊测试驱动程序生成的提示模糊测试

news2025/1/3 9:37:21

大语言模型拥有的强大能力可以用来辅助多种工作,但如何有效的辅助仍然需要人的精巧设计。分享一篇发表于2024年CCS会议的论文PromptFuzz,它利用模型提示生成模糊测试驱动代码,并将代码片段嵌入到LLVM框架中执行模糊测试。

论文摘要

制作高质量的模糊测试驱动程序不仅耗时而且还需要对被测目标有深入的了解,即使是最先进的自动化模糊测试驱动程序生成技术也未能达到预期。虽然用被测目标代码派生(OSS-Fuzz)的方式可以达到深度状态,但是程序逻辑的覆盖范围有限。解释性模糊测试(Hopper)可以探索多数接口调用,不过需要在较大的搜索空间进行多次尝试。

论文提出了 PromptFuzz ,一种覆盖引导的模糊器,它可以迭代生成模糊测试驱动程序来探索未被发现的库程序代码。通过使用大模型提示词探索被测程序的接口调用,本文提出了几种关键技术,包括:1)指导程序生成,2)错误程序验证,3)覆盖引导的提示变异,4)变量约束的模糊器调度。PromptFuzz 在 14 个真实的库程序上进行了评估,模糊测试驱动程序的分治覆盖率相比于 OSS-Fuzz 和 Hopper 分别高出 1.61 倍和 1.63 倍。此外,所提方案在 49 次崩溃中检测到了 33 个新的漏洞,其中 30 个漏洞已得到相应社区的确认。

1 背景介绍

模糊测试对软件的安全性和可靠性至关重要。OSS-Fuzz为开源软件部署了最先进的模糊测试器,截至2023年2月,已在850个项目中发现并解决了8900多个漏洞和28000个错误。开发者会选择合适的模糊测试器(Fuzzer)并编写高质量的模糊测试驱动程序(Fuzz Driver),驱动程序会解析来自模糊测试器的输入并调用被测目标(Target or Library)的程序代码。然而,编写高质量的模糊测试驱动程序具有挑战性,因为它既耗时又需要对被测目标有深入的了解。手动编写的模糊测试驱动程序通常只调用了被测目标的一小部分功能,限制了模糊测试的能力。

与手动编写的模糊测试驱动程序相比,自动化技术通过从源代码或运行时反馈中学习被测目标的接口调用情况,从而派生出模糊测试驱动程序。FUDGE,FuzzGen,UTopia方案从源代码中采用静态分析的方式提取接口调用代码,而APICraft,WINNIE则从进程执行中动态跟踪记录接口的调用顺序。Hopper是最先进的模糊测试驱动程序生成解决方案(与本文同一团队的工作,发表于2023年CCS会议),它会将对被测目标的模糊测试问题转化为解释性模糊测试问题,从接口调用的动态反馈中学习有效的接口使用情况。尽管可以覆盖到大多数接口函数,但Hopper需要在广阔的搜索空间中进行多次尝试,才能找到有用且满足深度的接口调用序列。

大语言模型(LLM)在生成代码方面有出色的表现,可以在不依赖被测目标代码的情况下可以有效地探索接口使用情况。以GPT系列为例,它们在广泛的代码预料库上进行过训练,能够生成符合用户意图的代码。之前的工作也尝试使用LLM生成模糊测试驱动程序,但它们设计的指令仅限于特定场景,生成的驱动程序在接口调用上多样性较低,无法覆盖不常用代码或深度状态。本文引入了PromptFuzz,一种覆盖引导的模糊测试器,它会迭代地改变提示词以探索未发现的库程序代码。

2 基础概念

  • 库程序模糊测试

库程序在软件开发中被广泛使用,因此针对它的模糊测试变得越来越重要。与命令行程序不同,库程序拥有多个访问入口点,即程序接口函数,这些入口有严格的格式约束规范。为了能够利用现有的模糊测试器,相应的模糊测试驱动程序被开发出来,驱动程序从模糊测试器接受随机字节,然后将这些字节转换成结构良好的接口调用参数,喂给被测目标执行模糊测试。

论文给出了一个模糊测试驱动程序的例子,该驱动程序嵌入在LLVM框架中,每次执行一个测试用例。驱动程序接受数据和大小两个参数,被测目标为视频解码库libvpx,驱动程序执行初始化和数据转换操作,调用库程序的接口函数进行视频解码。

#include <vpx/vp8dx.h>
#include <vpx/vp8cx.h>
#include <vpx/vpx_decoder.h>

extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
    // Create the decoder configuration
    vpx_codec_dec_cfg_t dec_cfg = {0};
    ...
    // Initialize the decoder
    vpx_codec_ctx_t decoder;
    vpx_codec_iface_t *decoder_iface = vpx_codec_vp8_dx();
    vpx_codec_err_t decoder_init_res = vpx_codec_dec_init_ver(&decoder, decoder_iface, &dec_cfg, 0, VPX_DECODER_ABI_VERSION);
    if (decoder_init_res != VPX_CODEC_OK) {
        return 0;
    }
    // Process the input data
    vpx_codec_err_t decode_res = vpx_codec_decode(&decoder, data, size, NULL, 0);
    if (decode_res != VPX_CODEC_OK) {
        vpx_codec_destroy(&decoder);
        return 0;
    }
    // Get the decoded frame
    vpx_image_t *img = NULL;
    vpx_codec_iter_t iter = NULL;
    while ((img = vpx_codec_get_frame(&decoder, &iter))!= NULL) {
        // Process the frame
        vpx_img_flip(img);
        ...
    }
    // Cleanup
    vpx_codec_destroy(&decoder);
    return 0;
}

  • 大语言模型

LLM是一种深度学习模型,具有非常复杂的架构和大量的参数,使得它们能够从大量文本数据中获取知识,GPT3,ChatGPT,GPT4是当前十分具有代表性的LLM。大语言模型被训练为预测下一个词,表示为 w n + 1 w_{n+1} wn+1,给定一个词序列 w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn,最大化语言模型的目标函数,如下列公式。

P ( w 1 , w 2 , . . . , w n ) = ∏ i = 1 n P ( w i ∣ w 1 , w 2 , . . . , w i − 1 ) P(w_1,w_2,...,w_n)=\prod^n_{i=1}P(w_i|w_1,w_2,...,w_{i-1}) P(w1,w2,...,wn)=i=1nP(wiw1,w2,...,wi1)

在推理阶段,LLM利用广泛参数中学习到的模型权重,基于先前的token w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn,自动回归地生成下一个token w n + 1 w_{n+1} wn+1,用户提供的起始token被称为提示词。为了确保LLM产生的输出与用户给定指令保持一致,一系列LLM已通过强化学习训练得到增强,例如ChatGPT和GPT4。

  • 基于大语言模型的模糊测试驱动程序生成

最近,出现一些利用LLM来增强模糊测试的研究,其主要的挑战包括自动构造提示词和对模型输出的验证。在基于LLM的模糊测试驱动程序生成中,提示词通常由任务描述和上下文信息组成。为了尽可能提供信息和指导模型,任务描述应至少制定被测目标库程序,以及包含在其中的接口函数。在早期的尝试中,每个提示词仅分配一个接口函数作为目标,过于简单而且难以有效果。另一方面,LLM生成的代码无法直接用于模糊测试,因为它产生的代码很容易出错。依赖编译器或简单规则进行输出的验证,只能报告语法或浅层逻辑错误,当其用作模糊测试驱动程序时,这种缺陷代码会产生许多误报。

3 系统设计

PromptFuzz通过覆盖率引导的LLM提示词生成高质量的模糊测试驱动程序以检测库程序错误,它会改变LLM提示词以生成涵盖更广泛接口调用范围的驱动程序,首先随机选择一个库接口函数构造提示词,然后根据覆盖率反馈改变该提示词,直到模糊测试达到被测目标的收敛,工作流程如图1所示。

图1 PromptFuzz模糊测试驱动程序生成流程

图1 PromptFuzz模糊测试驱动程序生成流程

3.1 指导程序生成

论文选择ChatGPT和GPT-4作为大语言模型来指导模糊测试驱动程序生成,尽管模型生成的程序并不总能够严格遵循指令,但它们有助于探索有效的库程序接口调用情况,可以用提示词来引导大语言模型生成符合预期的程序。PromptFuzz使用目标库程序和接口函数组合填充提示词模板,如图2所示包含以下组件。

  • 任务描述。说明了LLM应生成的驱动程序代码,指定了库程序的哪些接口函数在LLVMFuzzerTestOneInput函数中是必需的。
  • 库程序上下文。包括了库程序使用的头文件,接口函数签名,自定义类型等信息,通过整合对库程序上下文的理解,显著减少LLM产生幻觉的发生。
  • 库程序说明。指导LLM生成符合库程序所需指定模式的代码,部分库程序的接口函数可能从文件,文件流或描述符读取输入,对其进行相应规范。

图2 提示词模板

图2 提示词模板

3.2 错误程序验证

PromptFuzz消除错误驱动程序通过如下三个步骤。

  1. 删除C/C++编译器识别出语法错误的驱动程序。
  2. 剩余的驱动程序编译成可执行文件,结合多个运行时sanitizers,捕获和分析与预期行为模式的偏差。
  3. 使用提供的语料库对这些驱动程序进行模糊测试,删除检测到偏差的任何驱动程序。

在这部分模糊测试过程中,触发独特行为的输入将添加到语料库中,从而扩展进行更深入的运行时验证。PromptFuzz同时还会计算驱动程序执行的代码覆盖率,删除那些不符合代码覆盖标准的驱动程序,表明库程序的接口函数得到了充分的利用,错误驱动程序验证流程如图3所示。

图3 错误驱动程序验证流程

图3 错误驱动程序验证流程

3.3 覆盖引导的提示变异

为了创建连续多轮次的提示词,PromptFuzz会改变前几轮提示词中的接口函数组合,生成不同的模糊测试驱动程序,同时以代码覆盖率作为反馈来生成有效的提示词。

  • 能量分配

首先,PromptFuzz为每个接口函数分配相同的能量,在每次模糊测试迭代期间,更新访问过的分支并计算接口函数的分支覆盖率。

c o v ( i ) = 包含 i 的覆盖的分支数 包含 i 的所有的分支数 cov(i)=\frac{包含i的覆盖的分支数}{包含i的所有的分支数} cov(i)=包含i的所有的分支数包含i的覆盖的分支数

接着,按照AFLFast中的指数调度来更新其能量,令 s e e d ( i ) seed(i) seed(i)为调用接口函数 i i i的种子驱动程序数量, p r o m p t ( i ) prompt(i) prompt(i)表示为包含接口函数 i i i的提示词数量,计算能量如下。

e n e r g y ( i ) = 1 − c o v ( i ) ( 1 + s e e d ( i ) ) e × ( 1 + p r o m p t ( i ) ) e energy(i)=\frac{1-cov(i)}{(1+seed(i))^e \times (1+prompt(i))^e} energy(i)=(1+seed(i))e×(1+prompt(i))e1cov(i)

执行越少次数的接口函数将被分配更高的能量,于是在未来的提示词中包含该接口函数的概率就越高。

  • 变异策略

然后,PromptFuzz会改变提示词中的接口函数组合以指导模糊测试驱动程序生成,这些策略与传统的模糊测试器类似,例如在C组合中插入A函数Insert(C,A),替换C组合中的A函数为B函数Replace(C,A,B),合并C组合和S组合形成新的组合CrossOver(C,S)

在接口函数能量的指导下,PromptFuzz通过变异策略组合接口函数以生成之前未探索过的组合,用density表示调用显式数据依赖的库程序接口函数的最大数量,用unique branches表示驱动程序执行时触发的独立分支数量。计算quality(g)=density(g) x (1+unique_branches(g))用以量化驱动程序的质量,以质量值更高为目标来指导变异策略

图4 接口函数组合变异算法

图4 接口函数组合变异算法

在每次模糊测试迭代过程中,PromptFuzz都会探索驱动程序种子集合并更新这些种子驱动程序的质量,使用库程序接口函数能量和种子驱动程序质量的反馈,应用如图4所示算法来选择下一次迭代中使用的新接口函数组合。

3.4 变量约束的模糊器调度

为了使得种子驱动程序能够执行模糊测试,PromptFuzz对其中的接口函数参数进行约束类型推断,将部分参数从常量转换为从模糊测试器输入的任意字节的变量,例如数组长度、文件名、格式化字符串等,一个简单的实例如图5所示。

图5 约束参数转换例子

图5 约束参数转换例子

最终,PromptFuzz将种子驱动程序整合到模糊测试器,根据其提供的几个特定字节来调度每个种子驱动程序,3.2节中进行错误程序验证的模糊测试语料将用来作为驱动程序的初始输入。此外,转换之前的参数常量值也将形成初始语料,配合以进行模糊测试器的执行。

4 实现验证

PromptFuzz用Rust语言实现了大约1万7千行代码,开源在仓库https://github.com/PromptFuzz/PromptFuzz中,其中使用了clang_ast做抽象语法树的提取,额外实现了FSan插件来进行文件描述检查。论文在14个广泛使用的开源项目上对PromptFuzz进行了评估,总体实验结果,发现的已知漏洞,消融实验和变异策略的比较,可以详细去看原论文,这里不再赘述。

学习笔记

这篇论文做了很好的尝试,利用大语言模型来生成针对被测目标的驱动程序,再使用传统的模糊测试器来执行测试,相关工作OSS-Fuzz也做过尝试。论文偏工程,有一定启发,方法比较杂,与近期部分LLM+Fuzz方向的研究类似,大语言模型用于辅助仍需要进行提纯,通过算法筛选和纠偏,但确实在自动化和发散性方面比较有效。最后,附上文献引用和DOI链接:

Lyu Y, Xie Y, Chen P, et al. Prompt Fuzzing for Fuzz Driver Generation[C]//Proceedings of the 2024 on ACM SIGSAC Conference on Computer and Communications Security. 2024: 3793-3807.

https://doi.org/10.1145/3658644.3670396

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

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

相关文章

实用技巧:关于 AD修改原理图库如何同步更新到有原理图 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144738332 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

QT集成IntelRealSense双目摄像头3,3D显示

前两篇文章&#xff0c;介绍了如何继承intel realsense相机和opengl。 这里介绍如何给深度数据和色彩数据一块显示到opengl里面。 首先&#xff0c;需要了解深度数据和彩色数据是如何存储的。先说彩色数据。彩色图像一般都是RGB&#xff0c;也就是每个像素有三个字节&#xf…

PHP框架+gatewayworker实现在线1对1聊天--gatewayworker说明(2)

文章目录 gatewayworker使用说明onConnect 说明 gatewayworker使用说明 gatewayworker里只需要使用Applications\YourApp下的Events.php文件。 对文件的代码进行一下改造&#xff0c;如下&#xff0c;我们只需要用到onConnect方法&#xff0c;写法固定&#xff0c;其他方法都…

未授权访问漏洞集合

Redis未授权访问漏洞 进入vulhub目录启动靶机 进⼊⽬录&#xff1a;cd /vulhub-master/redis/4-unacc 启动&#xff1a;docker-compose up -d 检查&#xff1a;docker ps 在Kali上安装redis程序 #安装redis apt-get install redis #redis链接 redis-cli -h 124.221.58.83 -…

环,域,体,整区,理想,极大理想,

环&#xff1a; 定义&#xff1a; 加法交换群 乘法半群 分配律 域的定义&#xff1a; 加法交换群 乘法群&#xff08;去掉0元是交换群&#xff09; 分配律 Eg:比如整数集合不是域&#xff0c;因为对于乘法来说&#xff0c;去掉0后没有单位元了&#xff0c;但是是环 Eg…

Idea创建JDK17的maven项目失败

Idea创建JDK17的maven项目失败 Error occurred during initialization of VM Could not find agent library instrument on the library path, with error: Can’t find dependent libraries Possible solution: Check your maven runner VM options. Open Maven Runner setti…

基于MPPT算法的光伏并网发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT算法的光伏并网发电系统simulink建模与仿真&#xff0c;包括PV光伏发电模块&#xff0c;并网电路&#xff0c;MPPT&#xff0c;PWM等模块。 2.系统仿真结果 3.核心程…

NAT 技术如何解决 IP 地址短缺问题?

NAT 技术如何解决 IP 地址短缺问题&#xff1f; 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 随着互联网的普及和发展&#xff0c;IP 地址的需求量迅速增加。尤其是 IPv4 地址&…

KOI技术-事件驱动编程(Sping后端)

1 “你日渐平庸&#xff0c;甘于平庸&#xff0c;将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的&#xff0c;那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人&#xff0c;和他们斗了那么久&#xff0c;最终却要变得和他们一样&#xff0c;…

java: JDK isn‘t specified for module ‘product-service‘问题解决

目录 问题 解决方法 1.打开File->Project Structure... 2.将Project SDK修改为17 Oracle OpenJDK 17.0.12&#xff0c;并Apply&#xff0c;OK 问题 添加module后报错&#xff1a;java: JDK isnt specified for module product-service 查看pom.xml文件也添加了对应的JDK…

慧集通iPaaS低代码平台培训-基础篇

训练使用素材&#xff1a; 1.数据源&#xff1a; 单号业务日期工厂仓库物料单位数量批次0100012022-5-1210031001030001kg500202304150100012022-5-1210031001030001kg122202304150100012022-5-1210031001030001kg1250202304150100012022-5-1210031001030002kg130202304110100…

CMS漏洞靶场攻略

DeDeCMS 环境搭建 傻瓜式安装 漏洞一&#xff1a;通过文件管理器上传WebShel 步骤⼀:访问目标靶场其思路为 dedecms 后台可以直接上传任意文件&#xff0c;可以通过⽂件管理器上传php文件获取webshell 登陆网站后台 步骤二&#xff1a;登陆到后台点击 【核心】 --》 【文件式…

计算机网络 (12)物理层下面的传输媒体

前言 计算机网络物理层下面的传输媒体是计算机网络设备之间的物理通路&#xff0c;也称为传输介质或传输媒介&#xff0c;并不包含在计算机网络体系结构中&#xff0c;而是处于物理层之下。 一、传输媒体的分类 导向型媒体&#xff1a;电磁波被导引沿着固体媒体传播。常见的导向…

光储充一体化解决方案详解。

一、光储充介绍 1、什么是光储充 “光储充”一体化&#xff0c;顾名思义&#xff0c;是由光伏发电、储能、充电集成一体、互相协调支撑的绿色充电模式。其工作原理是利用光伏发电&#xff0c;余电由储能设备存储&#xff0c;共同承担供电充电任务。在用电高峰&#xff0c;光储…

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算 一、简介 在MATLAB中计算Sobol二阶效应指数通常涉及到全局敏感性分析&#xff08;Global Sensitivity Analysis, GSA&#xff09;&#xff0c;其中Sobol方法是一种流行的技术&#xff0c;用于评估模型输入…

RK3568 bsp 9 - USB调试记录

文章目录 1、环境介绍2、RK3568 USB资源介绍3、配置目标4、dts配置4.1、USB3.0 OTG4.2、USB2.0 Host 2 和 USB2.0 Host 3 5、kernel配置5.1、USB PHY CONFIG5.2、USB Host CONFIG5.3、USB OTG CONFIG5.4、USB外设CONFIG5.4.1、Mass Storage Class CONFIG5.4.2、USB HID CONFIG …

挖空的解决思路

用RagFlow解析完文档后怎么对某些实体的某些参数进行遮挡&#xff0c;给他设置预设好的可选项&#xff0c;并最终整合成文档模版&#xff0c;给我详细讲解怎么实现 解析–实体抽取&#xff08;Open NRE、UIE&#xff09;–遮挡–插入可选项–保存模版1–微调训练得模版2

【AI日记】24.12.30 kaggle 比赛 2-18

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Regression with an Insurance Dataset时间&#xff1a;8 小时 读书 1 书名&#xff1a;教育的本质时间&#xff1a;0.5 小时评估&#xff1a;快速读完&#xff0c;收获不…

javaweb 04 springmvc

0.1 在上一次的课程中&#xff0c;我们开发了springbootweb的入门程序。 基于SpringBoot的方式开发一个web应用&#xff0c;浏览器发起请求 /hello 后 &#xff0c;给浏览器返回字符串 “Hello World ~”。 其实呢&#xff0c;是我们在浏览器发起请求&#xff0c;请求了我们…

【C++】九九乘法表编程题详解与多角度对比分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目概述题目描述 &#x1f4af;老师的实现方法代码解析优点不足 &#x1f4af;我的实现方法代码解析优点不足 &#x1f4af;实现方法对比&#x1f4af;优化与扩展代码优化…