论文:https://arxiv.org/pdf/2308.04748.pdf
今天分享一篇来自伊利诺伊大学厄巴纳-香槟分校(UIUC)的一篇研究论文 Universal Fuzzing via Large Language Model,提出了利用大语言模型(LLMs)来辅助 fuzzing 中 input 的生成与变换的思路。
01
—
模糊测试
传统的模糊测试(fuzzing)工具可以分为生成型( generation-based )和变异型( mutation-based )两种,但它们都存在一些问题:
与目标系统和编程语言紧密耦合(C1):传统的模糊测试工具通常专为特定的编程语言或目标系统设计。开发这样的工具非常耗时,并且跨语言迁移性、可扩展性都不高
缺乏对系统演进的支持(C2):现实世界中的系统不断演进,不断添加新的特性到输入语言中。传统的模糊测试工具通常仅适用于特定版本的语言或系统。当目标系统演进或引入新特性时,这些工具可能失效,无法识别新的漏洞。例如,为旧版本语言设计的工具可能无法有效测试最新语言特性。
生成能力受限(C3):生成型和变异型模糊测试工具都有生成多样化测试输入的限制。generation-based工具依赖预定义的语法和语义规则来生成有效的test case,但这些规则可能会限制生成输入的质量;mutation-based工具受mutation算法和初始seed的质量限制。获取高质量的seed可能很困难,导致覆盖率受到限制。
02
—
Fuzz4ALL
如上图,是本文开发的工具fuzz4all的流程图,主要由两部分构成
-
Autoprompting:这一步先用一个distillation LLM分析用户输入(包括系统文档、测试用例等)随后用generation LLM生成可以用来fuzz的promote
-
Fuzzing Loop:这一步通过fuzz的结果,用generation LLM不断进行Mutating,完成fuzz的循环。
03
—
具体流程
-
首先生成一系列的candidate prompts
-
随后通过一个简单的fuzzing test,对每一个candidate prompt打分。这也是经典的AFL的fuzzing方法。
-
随后进入fuzz,通过随机选择:generate-new(产生新input), mutate-existing(变异已有input), and semantic-equiv(使用语义相同的测试用例) 中的一个来进行fuzz变换
-
最后,通过用户自定义oracle,来检测crash等信息。
04
—
实践与测试
总体来说,Fuzz4ALL比传统的fuzz工具对于代码的覆盖率高36.8%,并且找到了76 bugs,其中47 个bug已经被确认是之前未知的。项目链接: https://fuzz4all.github.io
Fuzz4ALL只包含872行python+GPT4/StarCoder,但是效果却非常好。
下表是测试的目标,总共测试了6种语言,对应7个传统fuzzing工具
下表是测试的目标,可以看到,在24小时测试中,对于不同的语言,Fuzz4ALL都有很好的表现。
随后我们来看一下Fuzz4ALL漏洞挖掘的能力,
下面是几个样例分析
GCC漏洞,在使用noexcept时会崩溃,传统工具不支持noexcept特性因此无法检测出
clang漏洞,在使用不同寻常的function declaration方法时会崩溃。传统工具很少构建decltype函数,因此很难触发这种情况。
go语言漏洞,参数设定为nil时会崩溃而非产生报错信息。这个漏洞也可以被其他fuzzing工具发现。
Qiskit漏洞,在name=crz时,会产生一个名为crz的output file,此系统会将文件名作为索引。然而 crz实际上是QASM language中的一个关键字。这里用到了LLM能够依据上下文产生有含义的变量名的特性。
原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 阅读推荐 2023-09-22 LLMs 支持的通用 Fuzzing
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论