漏洞检测是网络安全的“侦查兵”,而大模型则为这一领域增添了革命性的技术活力。从深度语义理解到精准漏洞定位,大模型正在重新书写检测规则,为安全从业者提供更强大的技术武器,让防线更智慧、更高效。
本节概述了利用大模型进行漏洞检测的关键研究文献。通过分析这些研究成果,我们旨在阐明在利用大模型提升网络安全方面的进展、挑战和未来方向。(在本文中,我们不严格区分漏洞和软件缺陷)
大模型是否具备检测漏洞的能力?
以下几篇文献对这个问题进行了基础研究。尽管由于使用的数据集不同等原因,它们的结论存在差异,但总体上都表明大模型在漏洞检测问题上具有良好的前景。在早期阶段,Anton C等人测试了GPT-3和GPT-3.5在识别Java代码中的已知CWE漏洞方面的表现。结果显示,大模型在漏洞检测任务中的应用效果并不理想,需要进一步优化和研究。另一项研究中,Moumita D等人使用大模型(包括GPT-3.5、CodeGen和GPT-4)分析了几种常见漏洞(如SQL注入、溢出),结果表明尽管大模型确实具有检测漏洞的能力,但误报率较高。
然而,Marwan O通过在各种含有漏洞代码的基准数据集上对GPT进行了微调,取得了良好的表现。类似地的结论,大模型(包括GPT-4和CodeLlama)在漏洞检测方面通常优于现有的静态分析和基于深度学习的工具。精心设计的提示在合成数据集上可获得理想结果,但在更具挑战性的真实数据集上表现下降。
Rasmus I T J等人比较了多种开源和专有模型在Python代码片段上协助漏洞发现的表现,研究表明大模型可以有效提高代码审查的效率和质量,特别是在检测软件代码中的安全问题方面。Alexey S等人对WizardCoder进行了漏洞检测任务的微调,并探讨了性能限制是否因CodeBERT类模型的能力限制所致,结果显示大模型在漏洞检测方面前景广阔。Haonan L等人提出了LLift,一个利用大模型辅助静态程序分析的框架,专门用于检测未初始化使用(UBI)缺陷。LLift与静态分析工具和大模型接口,在实际场景中显示出50%的精确率,并在Linux内核中发现了13个先前未知的UBI漏洞。
通过不同策略提高检测能力
与直接向大模型提供代码并请求答案不同,许多研究采用了不同的策略。一部分研究人员认为,仅提供代码并不足够,即代码需要进一步预处理或提供更多信息来协助大模型进行漏洞推理。Jin W等人未直接将代码提供给模型,而是进行了代码序列嵌入(Code Sequence Embedding, CSE),结合了代码的抽象语法树(AST)、数据流图(DFG)和控制流图(CFG)作为模型的输入,并借助Conformer机制(Transformer的一种改进架构)捕获输入的语义信息。
Chenyuan Z等人不仅向GPT提供了代码,还加入了API调用序列和数据流图。Atieh B等人进行了类似实验,比较了模型在不同信息量条件下的表现(直接询问漏洞位置、在询问前提供部分CWE信息、在告知模型代码中的漏洞类型后再询问位置)。Noble S M等人专注于Android平台漏洞,比较了大模型在三种条件下的表现:直接要求模型寻找漏洞、在询问前提供漏洞摘要、在仅提供APK的核心文件(如AndroidManifest.xml和MainActivity.java)后允许大模型请求所需文件。
除了上述方法外,研究人员还提出了一些创新理念来提升大模型的漏洞检测能力。Sihao H等人提出了一个创新的两阶段框架GPTLENS,包括两个对抗代理角色:审计员和评论员。审计员在生成阶段识别智能合约中的潜在漏洞,评论员在识别阶段评估审计员生成的漏洞。Zhihong L等人使用传统算法(TF-IDF和BM25)将待分析代码与漏洞语料库中的代码匹配相似度。待分析代码与语料库中的相似代码一起被提供给大模型,利用上下文学习(In-Context learning)理念,大模型能够更好地分析其是否属于此类漏洞。专为智能合约漏洞检测设计,Yuqiang S等人提出了GPTScan工具。GPTScan首先解析智能合约项目,确定函数的可达性,仅保留潜在的漏洞函数,然后使用GPT将候选函数与预定义漏洞类型匹配,最后让GPT验证漏洞。
为增强大模型的漏洞推理能力,Yuqiang S等人提出了LLM4Vuln,分离大模型的漏洞推理能力(例如,主动获取附加信息、运用相关漏洞知识、遵循指令输出结构化结果)。他们允许大模型请求目标代码的附加上下文信息,并得出结论,即并非提供的信息越多性能越好。例如,完整的漏洞报告、大量调用上下文等过多信息可能导致分心。Zhenyu M等人提出了一种新方法MuCoLD,该方法模拟漏洞检测中的多角色代码审查过程,通过扮演开发者和测试人员等角色,促使大模型进行讨论,以达成对漏洞的存在和分类的共识。该方法从二进制判断和推理开始,通过迭代对话不断优化评估结果。
目前主流思路是检测特定程序中的漏洞,但也有研究尝试利用大模型从漏洞中推测受影响的库列表。Tianyu C等人发现许多NVD中的漏洞报告未列出或列出不完整、错误的受影响库名称,这增加了第三方库漏洞的风险。为此,他们提出了名为VulLibGen的方法,旨在检测第三方库中的漏洞。VulLibGen仅使用漏洞描述作为输入,利用大模型的先验知识生成受影响库的名称列表。
与前述研究方向不同,Peiyu L等人提出了一种应用ChatGPT进行漏洞管理的方法,评估其在预测安全漏洞、评估严重性、修复漏洞和验证补丁正确性方面的能力。研究表明,虽然ChatGPT可辅助识别和缓解软件安全威胁,但在漏洞优先级排序和补丁验证等任务上仍有改进空间。
数据集准备
除了重新训练或微调模型的方法外,数据集的构建也是关键环节之一。Yizheng C等人提出了一个新型漏洞源代码数据集DiverseVul,包含18,945个漏洞函数(涵盖150个CWE)和330,492个正常函数,所有样本均为C/C++代码。
此外,他们讨论了11种不同的深度学习架构,并得出结论,尽管大模型取得了一定的成功,但模型在漏洞检测方面仍面临高误报率、低F1分数和难以检测复杂CWE等挑战。Norbert T等人生成了一个包含112,000个含漏洞的C代码的数据集,详细标注了漏洞信息(CWE编号、位置和函数名称),该数据集中的所有代码均由GPT-3.5生成。Zeyu G等人提出了一个综合性漏洞基准数据集VulBench,包含来自CTF挑战和实际应用的高质量数据,并为每个漏洞函数提供详细的漏洞类型和成因注释。
责任编辑:kj005