论文名称 | 发表时间 | 发表期刊 | 期刊等级 | 研究单位 |
Large Language Models Based Fuzzing Techniques: A Survey | 2024年 | arXiv | - | 悉尼大学 |
0.摘要
研究背景 | 在软件发挥举足轻重作用的现代社会,软件安全和漏洞分析对软件开发至关重要,模糊测试作为一种高效的软件测试方法,并广泛应用于各个领域。大预言模型(LLM)的快速发展促进了其在软件测试领域的应用,并表现出卓越的性能。考虑到现有的模糊测试技术并非完全自动化,并且软件漏洞不断发展,基于大预言模型生成的模糊测试的趋势越来越明显。 |
研究内容 | 针对当前最先进的 LLM 技术、模糊测试技术、基于 LLM 的模糊测试技术进行了统计分析和讨论。并讨论了基于 MML 的牧户测试技术未来广泛部署和应用的潜力。 |
1. 引言
模糊测试自 20 世纪 90 年代以来已被广泛采用,其原理涉及生成一系列意想不到的输入来测试软件的可靠性和安全性。随着现代软件行业的发展,模糊测试已经成为软件测试的关键。目前,大语言模型在各个领域都展现出了强大的性能,其中也包括软件测试领域。与传统软件测试系统相比,大语言模型生成的软件测试在效率和准确性方面都有所提高,这些方法包括 TitanFuzz、FuzzGPT 以及针对不同软件类型的其他模糊测试。这些研究将不同的大语言模型与模糊测试技术相结合,并开发新的模糊测试系统,下面将详细介绍这些方法。
针对现有基于 LLM 的模糊测试技术,提出三个研究问题,(1)基于 LLM 的模糊测试技术在 AI 软件系统和非 AI 软件系统中的表现;(2)基于 LLM 的模糊测试技术相较于传统模糊测试技术有哪些优势;(3)基于 LLM 的模糊测试技术未来研究趋势和存在的挑战是什么?
2. 背景知识
2.1 大语言模型(LLM)
大型语言模型的出现为不同的复杂语言任务提供了很大的帮助,例如翻译、摘要、对话交互等(源于 Transformer 的引入)。根据 Humza Naveed 等人 2023 年 7 月的统计,从2019 年到 2023 年,总共出现了 75 个有影响力的大语言模型(涉及通用、医疗以及教育等领域)。
大语言模型主要可分为三类,分别是 Decoder-only 语言模型, Encoder-only masked 语言模型,Encoder-Decoder 语言模型。
- Decoder-only 语言模型(GPT):类似于一个讲故事的人。模型接收一个故事的开头,如“今天天气很好”。然后模型继续生成剩余的内容,如“适合出去转转”。这类模型擅长创造性的协作,比如写小说或自动生成文章。它更多的关注于从已有的信息扩展出新的内容。OpenAI选择 Decoder-Only 方案,因为它对自然语言生成特别有效。这种架构能够更好的理解和预测语言模式,尤其适合处理开放式、生成性的任务。
- Encoder-only masked 语言模型:类似于一个专业的内容评论家。模型接收待评论的内容,如一本书。然后模型输出对应的评论,如书籍的质量的高低、主题等。这类模型擅长处理输入数据,专注于理解和编码信息,而不是生成新的文本。这种架构在理解和分类任务中更为有效,尤其适合文本分类、情感分析等任务。
- Encoder-Decoder 语言模型:类似于一个翻译家。这类模型接收原文,如英文。然后模型理解原文并生成译文,如中文。这类模型通过 Encoder 处理输入内容,通过 Decoder 生成输出。这类模型擅长处理需要理解输入然后生成相关输出的任务,如翻译或问答系统。
2.2 模糊测试
第一个模糊测试技术由 Miller 的等人于 1990 年提出,用于测试软件和系统的可靠性;在 2005 年之前,该技术仍处于发展的早期阶段,大多是使用随机变异的黑盒模糊测试;从 2006 年 到 2010 年,一些模糊测试系统采用了污点分析技术,基于符号执行的模糊测试得到了充分的发展;2011 年至 2015年间,模糊测试发生了重要的演变,(1)基于覆盖引导的模糊测试成为学术和工业领域的重要角色,(2)模糊测试过程中使用不同类型的调度算法,(3)整合各种技术来提高模糊测试的效率;2016 年至 2017 年,许多模糊系统基于 AFL 进行了改进,其中包括 AFLFast 和 AFLGo等;2018 至今,出现了结合多种技术以获得更好的模糊测试技术的趋势,机器学习的概念被引入模糊测试中。一般来说基于机器学习的模糊测试主要分为两类,(1)基于突变的模糊测试技术,(2)基于生成的模糊测试技术。模糊测试根据测试者对被测软件内部结构的了解程度和访问权限的不同,可分为黑盒、白盒以及灰盒模糊测试。
- 黑盒模糊测试:黑盒测试是最基础的测试形式,其中测试者几乎不了解软件的内部工作原理。测试完全基于对软件外在行为的观察,无需访问源码。通过想软件输入异常或随机数据,测试者观察软件反应,以识别潜在漏洞。该方法简单、直接,能够迅速对软件进行广泛测试,但可能无法探测到更深层的复杂安全问题。
- 白盒模糊测试:白盒测试与黑盒测试相反,测试者可以完全访问软件的内部逻辑和源代码。通过应用程序分析技术,如静态代码分析和动态执行跟踪,饱和测试能够系统地深入探测软件行为。这种方法能够识别特定代码路径触发地漏洞,提供更高地检测覆盖率和深入地安全评估,但要求测试者具有较高地专业知识和较大地资源投入。
- 灰盒模糊测试:结合黑盒和白盒测试地优势,测试者对软件的内部信息有限了解,无需完全的代码访问权限。灰盒测试依赖于对部分代码结构的知识,如通过程序插桩收集运行时的反馈信息,来指导测试用例的生成。这种方法既保持了黑盒测试的灵活性和快速性,又通过有限的内部视角提升了测试的效率和有效性。
3. 基于 LLM 的模糊测试
模糊测试的应用范围广泛,已在各个软件领域实施,以评估软件的可靠性和安全性。然而,传统的模糊测试存在局限性,这鼓励研究人员探索新兴 LLM 与模糊测试的集成,以提高其效率和准确性。通过对基于 LLM 的模糊测试技术的深入分析,发现这些技术主要将 LLM 引入 prompt 工程和 种子变异以实现模糊测试性能的提升。基于LLM 的模糊测试技术的评价主要针对三个方面,分别是代码相关的评价指标、性能相关的评价指标以及时间相关的评价指标。
- 代码相关的评价指标:最具代表性的是代码覆盖率和检索到的BUG数量,它们最直接的反映了测试覆盖率和漏洞检测能力。
- 性能相关的评价指标:最具代表性的指标是命中率,它是指模糊测试生成的输入针对测试目标的效率。除此之外,突变有效性与突变评分密切相关,是衡量种子突变质量的标准。
- 时间相关的评价指标:最具代表性的指标是执行时间,可以表示模糊测试执行的总体时间。除此之外,平均检测时间用于衡量模糊测试发现测试目标中漏洞的能力。
AI 软件往往具有更复杂的框架,具有自主学习和适应能力,有的甚至具有自然语言处理能力。非 AI 软件往往基于固定的规则和逻辑运行,需要预先编程和配置才能完成任务。因此,针对这两种不同类型软件的基于 LLM 的模糊测试技术也有所不同。在论文收集到的所有论文中,针对 AI 软件的有 5 篇,其余均为针对非 AI 软件的论文。
3.1 AI 软件模糊测试 vs. 非 AI 软件模糊测试(模糊测试对象不同)
AI 软件模糊测试
Yan 于 2023年提出 ParaFuzz(NIPS,CCFA) 技术,该技术用于检测 NLP 模型中受污染的样本,可以增强 NLP 模型的后面防御。其核心思想是通过观察 Paraphraser 转述前后模型预测结果是否改变,来判断样本是否中毒(预测结果改变代表中毒)。通过模糊测试技术获取 Paraphraser 的最佳 prompts。
Ackermna 于 2023 年使用 GPT-4 和文本嵌入模型 text-embeddingada-002 自动解析自然语言格式规范,生成符合这些规范的数据实例(种子生成),进而实现软件对不同格式数据的模糊测试。
Jha 于 2023 年提出 BertRLFuzzer,该技术结合 multi-arm bandit 代理,PPO 代理以及 BERT 模型,对 Web 应用程序中的安全漏洞进行模糊测试(如 SQL 注入、跨站脚本攻击、跨站请求伪造等)。实验表明, BertRLFuzzer 可以自动理解攻击语法片段,并通过强化学习给出的变异算子实现测试样例的自动化生成。
TitanFuzz 是首个面向 AI 软件的 LLM 模糊测试技术,该技术通过 generative LLM(CodeX) 和 padded LLM(CideGen) 设计了一种新颖的种子程序变异机制,并使用启发式算法实现模糊测试。 FuzzGPT 利用 CodeX 和 CodeGen模型根据核心概念(包含漏洞的程序通常包含稀有或有价值的代码组件,这些代码组件在漏洞发现中非常重要)自动生成异常程序。尽管 TitanFuzz 和 FuzzGPT 都基于 CodeX 和 CodeGen 模型,但它们有显着差异。 Titanfuzz 依靠提示词工程以及种子生成和变异策略来直接生成或重写代码片段。然而,FuzzGPT 并不限于 Titanfuzz 使用的策略。它是一个大型语言模型模糊器,使用少样本学习、零样本学习和微调等方法。它通过理解历史错误代码来生成更复杂和更具体的边缘情况代码片段。
非 AI 软件模糊测试
Xia 于 2024年提出一个通用模糊测试系统 Fuzz4Al l,可以自动对不同编程语言编写的项目进行模糊测试。具体来说,该技术使用 GPT-4 和 StarCoder 作为输入生成和变异引擎。由于 LLM 对各种编程语言示例进行了广泛的预训练,因此 LLM 能够理解不同语言的语法和语义。Fuzz4All扩展了这一功能,可以对不同语言编写的项目、程序、编译器甚至 API 库进行模糊测试,大大提高了模糊测试的通用性。