今天分享的论文是《Learning-based Models for Vulnerability Detection: An Extensive Study》
原文链接:[2408.07526] Learning-based Models for Vulnerability Detection: An Extensive Study
开源代码:https://ffgshare.com/s/bde8e41890e8179fbe5f
这是一篇关于学习(深度学习、LLM)模型对于漏洞检测的实验探索,实验做得比较全面。
尽管许多基于深度学习的模型在漏洞检测方面取得了显著进展,但本文对这些模型的理解尚不充分,这限制了模型能力的进一步提升、对模型检测机制的理解以及模型实际应用的效率和安全性。在本文中,本文通过在最近构建的大规模数据集上进行实验,对两种最先进的基于学习的方法(基于序列的和基于图的)进行了广泛而全面的研究。本文从五个维度(即模型能力、模型可解释性、模型稳定性、模型易用性和模型经济性)研究了七个研究问题。实验表明,基于序列的模型具有优势,而LLM(ChatGPT)和基于图的模型能力有限。本文探索了基于学习的模型擅长检测的漏洞类型,并揭示了即使输入发生细微的语义等效变化,模型也存在不稳定性。本文从经验上解释了模型学到了什么,总结了预处理以及轻松使用模型的要求,最后初步归纳了经济安全地实际使用这些模型的关键信息。
自动化漏洞检测是系统安全的基本问题,近年来基于学习的漏洞检测方法取得了可喜的成果。值得注意的是,多项研究表明,基于深度学习(DL)的方法在检测漏洞时既能达到高精度(高达95%)[25,28,29,36,44,49,63],又能达到高F1分数(高达90%)[20,47]。
尽管DL模型在漏洞检测方面取得了显著成功,但本文对模型本身的了解似乎很少。例如,它们是否能有效且可靠地检测现实世界或最危险的漏洞,模型擅长检测哪种类型的漏洞,这些模型学到了什么样的特征,模型在语义等效的函数上是否能稳定执行,使用DL模型的复杂性和成本是多少,是否会损害本文的隐私。弄清这些问题的答案可以帮助本文更好地开发和实际应用这些模型,尤其是在大型语言模型时代。
一些工作[12,48]也旨在研究基于深度学习的模型的特性或能力,但在指导实际使用方面仍存在一些局限性。例如:
(1)不同工作得出的结论可能不一致。一些工作[56,58]得出结论,基于图的DL模型优于基于序列的模型,而一些工作[20,41]则观察到相反的结果。
(2)现有研究仅包括基于图或基于序列的模型,但当前引人注目的大型语言模型(如ChatGPT[2])尚未被全面研究,这可能导致结论有偏差。
(3)以往的研究只考虑了DL模型的能力和解释,而没有考虑对用户的影响:模型的易用性和使用模型的成本。
本文系统全面地研究了几种最先进的基于深度学习的漏洞检测模型的特性[12,20,26,41,63],并构建研究问题来理解这些模型,旨在提炼经验教训和指导方针,以实现更好的实际应用。本文主要关注函数粒度的基于图和基于序列的漏洞检测模型。据本文所知,这是在LLM时代首次系统地从广泛的方面研究最先进的基于学习的模型的论文。
特别是,本文提出了七个研究问题,并将其分类为以下维度:D1:模型能力,D2:模型可解释性,D3:模型稳定性,D4:模型易用性和D5:模型经济性。更准确地说,本文的第一个目标是了解用于漏洞检测任务的学习模型的能力,特别是针对以下研究问题:
RQ-1:基于学习的方法在漏洞检测上的表现如何?不同模型之间的差异是什么?
RQ-2:基于学习的方法擅长检测哪些类型的漏洞?
RQ-3:大型语言模型有能力检测漏洞吗?
本文的第二项研究旨在模型解释。本文采用最先进的解释工具来研究模型学到了什么,如下所示:
RQ-4:基于学习的模型关注哪些源代码信息?不同类型的基于学习的模型是否关注相似的重要代码特征?
本文的第三项研究针对所研究的基于学习的模型的稳定性,通过研究输入的语义等效细微修改对其的影响。
RQ-5:当输入发生微不足道的变化时,基于学习的模型是否与自身的漏洞检测结果一致?
本文的第四项研究侧重于易用性,通过研究构建有效模型的各种努力。
RQ-6:使用模型之前需要付出哪些类型的努力?基于学习的模型可以在哪些场景中应用?
最后,本文的研究侧重于经济性。本文想调查采用这些模型检测漏洞时的成本。
RQ-7:从时间和经济方面来看,模型会带来哪些成本?
为了回答上述研究问题,本文研究了两种最先进的基于学习的模型。这些模型使用了不同的深度学习架构(如Transformer[53]或图[62])。此外,为了广泛全面地分析模型的能力,本文在最近构建的名为MegaVul[38]的数据集上进行了实验,该数据集通过爬取更多新发现的漏洞,包含了真实项目的漏洞。然后,本文精心设计实验,通过回答七个RQ来发现结果,主要发现如下表所示。
本文的主要贡献如下:
本文对包括ChatGPT在内的基于学习的漏洞检测方法进行了广泛的比较。
本文设计了七个RQ,分为五个重要维度,以全面理解基于学习的方法。
本文发布了用于进一步研究的重现包[7]。
研究的数据集
尽管已经提出了许多与漏洞相关的数据集,但仍有一些限制影响了所提出模型的验证,包括:
(1)不真实的漏洞(即SARD[1]是人工合成的)
(2)不真实的数据分布(即Devign[63]中的平衡分布)
(3)有限的多样性(即ReVeal[12]中的项目和漏洞类型有限)
(4)新披露的漏洞有限(即Big-Vul[17]仅涵盖2003年至2019年的时间段,没有更新)
(5)数据集质量低(即Big-Vul[17]中函数不完整、函数错误合并、提交消息缺失)。
为了解决上述问题,最近,Ni等人[38]构建了一个大规模、高质量、数据丰富、多维的C/C++和Java数据集,名为MegaVul,该数据集通过从更多开源存储库爬取数据,采用复杂的过滤策略来提高质量,并采用先进技术提取完整的函数。除了收集原始函数外,MegaVul还提供了关于函数的更多维度信息,包括函数的九种粒度抽象(即FUNC、VAR、STRING等)、各种类型的函数表示(即AST、PDG)以及函数修改的细节(即diff)。总之,MageVul从349个网站的17个基于Git的代码托管平台收集了引用CVE超过100次的数据。基于Web的代码托管平台可分为五大类:GitHub、GitLab、GitWeb、CGit和Gitiles。考虑到MegaVul的定期更新(即每六个月更新一次)和稳定性,本文考虑2023年10月发布的C/C++数据集进行实验。即对于C/C++版本,MegaVul包含来自198,994个CVE的8,334个提交。下表呈现了MegaVul的统计信息,更多细节可参考其原始工作[38]。
基线。为了全面比较现有工作的性能,在本文中,本文考虑了五种最先进的基于学习的软件漏洞检测方法,这些方法可以进一步分为两个更细的类别:基于图的和基于序列的。前一组包含三种方法(即Devign[63]、ReVeal[12]和IVDetect[26]),它们将源代码转换为图以复杂地表示其语义。后一组包含两种方法(即LineVul[20]和SVulD[41]),它们将源代码视为标记序列以简单地表示其语义。在这里,简要介绍这些方法,以使论文自成一体。
实现细节
数据分割。与现有工作[20,26]类似,本文采用相同的数据分割方法:80%:10%:10%。更准确地说,整个数据集被分割为80%的训练数据、10%的验证数据和10%的测试数据。同时,本文在训练数据、验证数据和测试数据中保持与原始数据相同的类分布。
模型实现。对于ReVeal、IVDetect、LineVul和SVulD,本文利用它们的公开可用源代码,并使用其原始代码中提供的默认参数进行微调。考虑到Devign的代码不是公开可用的,本文尽一切努力复制其功能,并在原始论文的数据集上取得类似的结果。所有这些模型都是使用PyTorch[43]框架实现的,完全采用Huggingface[5]上托管的预训练模型。此外,本文将可解释性纳入所有研究的模型中。微调过程在NVIDIA RTX 3090显卡上进行。对于LLM,本文使用最先进的ChatGPT[42]模型,并将少样本学习示例的数量设置为1到6之间,以填充上下文窗口(即4,096个标记)。本文还指示ChatGPT以JSON格式输出结果,以便于数据的自动组织。
上图展示了三种不同提示设置下的提示模板示例。这些提示模板以指令“I want you to act as a vulnerability detector. Your objective is to detect... Output ‘yes’ if the function is vulnerable...”开头,明确说明LLM要完成的任务和预期的输出格式。如果提示包含额外的演示(即少样本设置),“I will give you several examples...”也将插入到指令中,以向LLM明确提示中存在多个函数及其漏洞检测结果。在少样本设置中,本文采用上述有效且高效的选择策略从训练集中选择尽可能多的演示,直到达到LLM的最大输入窗口标记限制(即4,096)。通过输入和输出之间的相关性,在提示中包含更多演示可以向LLM传达特定任务的知识[37],从而提高LLM的性能。更具体地说,在ICL设置中,本文采用五种选择策略。对于CoT,本文为每个演示手动制作推理过程,手动制作的推理优于LLM生成的推理[24]。因此,本文只考虑结合两种选择策略(即固定选择和基于多样性的选择)的少样本设置。在零样本CoT设置中,本文使用“Let’s think by think”来提示LLM生成自己的推理过程。这些演示和推理以特定格式纳入提示中,如图中灰色背景所示。随后,将需要检测漏洞的函数添加到模板末尾,形成最终的提示,指示LLM生成最终的检测结果。
发现1:(1)基于序列的漏洞检测模型比基于图的模型表现更好。(2)ChatGPT尚未具备软件漏洞检测能力,有必要构建针对漏洞检测的序列模型。
发现2:(1)不同的模型在检测不同类型的漏洞方面有各自的优势。特别是,基于序列的模型擅长“输入验证”,而基于图的模型擅长范围更广(“API滥用”、“输入验证”和“安全功能”)。(2)一般来说,基于序列的模型,尤其是SVulD表现更好,并且SVulD在检测最危险漏洞时显示出其在实际使用中的巨大潜力。
发现3:(1)ChatGPT直接用于检测漏洞的能力有限,不同的提示设计会高度影响其性能。(2)总体而言,使用上下文中学习和Randomrepo选择策略提示的ChatGPT在精确率和F1分数方面表现最佳,在召回率方面也取得了相对较好的性能。
发现4:(1)基于图和基于序列的方法在技术上都关注两种类型的语句:函数调用和字段表达式,这可能涉及对功能易受攻击或不可靠的操作。(2)现有的基于学习的模型在区分易受攻击函数和非易受攻击函数方面的能力仍然有限。基于序列的模型比基于图的模型表现更好。(3)向基于序列的方法提供外部调用的函数信息可以进一步提高基于序列的模型的能力。
发现5:所有基于学习的模型对输入变化都不稳定,即使这些变化是语义等效的。基于序列的模型比基于图的模型对细微的输入变化更稳定。
发现6:基于图的模型需要完整的输入程序和复杂的配置来构建代码图,而基于序列的模型更易于部署。除了ChatGPT之外,所有当前模型都相对受输入大小的限制,需要微调以实现增强的性能,并且是开源和隐私安全的。ChatGPT在输入要求和模型配置方面是最用户友好的选项,但存在隐私泄露的潜在风险。
发现7:基于图的模型需要大量时间进行数据预处理,但它们通常训练和推理速度快。相比之下,基于序列的模型不涉及数据预处理,训练时间相当,但推理时间更长。总体而言,ChatGPT是最经济的解决方案。
讨论与分析
内部有效性来自两方面:一是LLM输出的不确定性,LLM对提示敏感,本文通过固定指令和随机种子减轻影响;二是闭源LLM的可重复性问题,结果可能与特定版本相关。基于图模型的实现威胁通过开源代码和结对编程缓解。
外部有效性威胁包括:专注于C/C++语言,未考虑其他语言漏洞;数据集选择影响,MegaVul覆盖多数C/C++漏洞以确保代表性。
漏洞检测领域已提出许多基于学习的方法,分为基于图和基于序列两类。近期有研究关注模型特性,但本文首次在LLM时代从多维度全面研究,尤其关注ChatGPT能力、模型易用性、经济性及擅长的漏洞类型。
做个总结:
本文全面研究了基于图和序列的漏洞检测模型,构建大规模数据集,从模型能力、解释性、稳定性、易用性和经济性五个维度开展实验。结果表明序列模型优于图模型和LLM(ChatGPT),两类模型均擅长“输入验证”类漏洞,图模型还擅长“API滥用”和“安全功能”类。所有模型稳定性不足,本文总结了模型使用的预处理和要求,为经济安全地实际应用提供了关键信息。