不知不觉就又过去了一年,这一年坚持住了每天两篇博客的分享,算是一个小小的成就。

今年也是LLM持续勃发的一年,回顾博客,很多内容都是和LLM相关,论文阅读兴趣也持续在LLM上。

坚持已经逐渐形成一种习惯,请继续坚持下去吧!

个人工作上,主要集中在LLM漏洞检测领域,以及一些LLM安全和智能体开发,接下来做个小小回顾+总结。

随着物联网(Internet of Things,IoT)的日益发展,物联网设备已经深深地渗透到我们日常生活的方方面面,无论是家庭中冰箱、电视的一次次智能化升级,还是城市中随处可见的照明设备和智能传感器等等,都昭示着物联网的广泛覆盖。与此同时,物联网设备的数量也呈现爆炸式的增长趋势,覆盖了从家庭智能化管理、交通系统智能化改造到工业生产的自动化升级等多个领域。据Statista公司估计,至2025年,通过IoT连接的系统和设备的总量将超过210亿台,相当于每人约3.47台IoT设备[1]。

但是在物联网设备的设计与制造过程中,设计者往往会倾向于使用一些未经严格审核的不可信的第三方代码,这种代码重用虽然一定程度上提高了开发效率,但也带来了安全风险。同时,由于成本等因素,很多物联网设备采用的是一些内存和计算资源有限的廉价组件,这也增加了物联网设备遭受攻击的可能。更为严重的是,许多物联网设备会涉及到一些有关用户隐私的机密信息处理,比如接入物联网的健康设备或者家庭摄像头,一旦遭受攻击,后果不堪设想。

因此,越来越多的攻击者将物联网设备作为自己的攻击目标,从数据泄露、设备被远程操控,到服务中断等等,各种安全事件层出不穷:2019年发生的Ring 智能门铃和安防监控头安全事件,在北美地区引起了轩然大波[2];同年,Mirai变种僵尸网络导致的安全事故也呈现出高速增长的态势[3];2022年12月,哥伦比亚最大的公共能源、水源和天然气供应商之一Empresas Publicas de Medellin(EPM)的IoT系统也未能幸免于难,遭受了黑猫勒索软件的攻击,此次攻击导致公司的计算机基础设施瘫痪,在线服务中断,对大量用户造成了严重的影响[4];Bonaventura 等[5]指出 TP-Link 的畅销产品 Tapo L530E 智能灯泡及其 Tapo 应用程序中存在 4个漏洞,可能导致攻击者窃取目标用户的 WiFi密码等等。

所以,为了有效缩小攻击面、确保物联网设备的安全运行并防范潜在的网络攻击,就迫切需要我们对物联网进行全面的安全漏洞分析。

大语言模型(Large language model,LLM)[6]指基于Transformer[7]架构,在海量数据[8]上进行训练,并由大量参数组成的模型。LLM被认为是走向通用人工智能(Artificial General Intelligent,AGI)[9]的重要途径之一。2022年11月30日,ChatGPT(Chat Generative Pre-trained Transformer)LLM 被提出,2个月内活跃用户达1亿!而近年来,ChatGPT等大语言模型在学术、医学、法律、金融、教育等领域得到了广泛应用。大语言模型已成为自然语言处理(natural language processing,NLP)与人工智能(artificial intelligence,AI)的重要研究方向,并产生了广泛的社会影响[10]。

而在物联网漏洞挖掘技术中,LLM也开始发挥重要作用。事实上,以前基于学习的漏洞检测方法要么依赖于中等规模的预训练模型(如CodeBERT[11]),要么依赖于较小的神经网络(如图神经网络[12])。而现在使用LLM进行漏洞挖掘技术的有很多,同时,可以看到LLM不仅可以应用于安全防御之中也可以应用在恶意攻击之中,如文献[13]中提到的利用LLM进行自动对抗攻击以躲避漏洞挖掘检测。

因此,基于LLM进行跨架构物联网漏洞检测研究具有重要的研究价值和现实意义,也是本文选择该方向主题的原因。

  1. 前沿研究综述

在本节中将会对过往的工作做一个总结和介绍,首先会对之前的基于学习的静态检测技术进行一个梳理,接着对于结合LLM的漏洞检测技术展开介绍。

    1. 基于学习的静态检测技术

Rendezvous[14]较早展开了关于二进制代码的代码搜索。但是由于它会使用子图分解,这使得搜索的准确性降低,同时它也无法扩展到更多架构上。Flake等人[15]和 Pewny等人[16]的工作均提出应用控制流图(Control Flow Graph,CFG)来进行漏洞搜索,但是两种方法的图匹配花费较为昂贵。为了进一步提升效率,Eschweiler等人[17]提出了一种更为简洁而迅速的特征提取方法——依靠简单的特征——如指令总数和算术指令数等特征,但是其利用预过滤来促进基于CFG的匹配,这会产生大量的误报阴性结果。

Genius[18]巧妙地借鉴了图像处理领域的技术,应用于跨架构漏洞检测技术。它的主要实现过程为首先将二进制代码转换为属性控制流图(Attribute Control Flow Graph,ACFG),并用二部图匹配的方法提取出固件的原始特征,然后对原始特征进行聚类,生成编码本。第三步利用编码本生成固件的高维特征向量,最后通过位置敏感哈希(Locality Sensitive Hashing,LSH)在漏洞库中搜索进行漏洞匹配,完成漏洞检测。但是,Genius依赖于二分图匹配,这是低效的。

Scarselli等人第一个提出了使用图神经网络来计算图嵌入[19]。Dai等人通过采用有原则的图模型思维,并结合之前的工作,使得可以定义更灵活的嵌入函数[20]。丁等人[21]构建了一种独特的“段落”嵌入,旨在捕获汇编函数及其CFG的深层语义和结构信息。但是他们的方法并不直接依赖于图嵌入模型,无法直接捕获CFG中节点之间的复杂关系。

Gemini[22]使用监督学习技术和深度神经网络来生成嵌入表示,采用了暹罗网络对模型进行端到端的训练。相比于Genius,Gemini在特征提取和向量生成的过程有了很大的优化。Li等人[23]利用扩展图形神经网络(Graph Neural Network,GNN)模型生成用于相似性学习的图嵌入,他们提出了新型的图匹配网络,该网络通过基于跨图注意力的匹配来计算相似性。他们的图相似性学习模型在一系列应用中均表现出良好的性能。然而,值得注意的是,这一方法目前仅支持按对匹配图形,即每次只能将一对图作为输入,并返回相应的相似性得分作为输出。这种处理方式虽然在一定程度上能够保证匹配的精度,但却显著地降低了该方法的可扩展性。

Victor Cochard[24]等人提出了一种基于卷积神经网络生成二元函数图形嵌入的新方法GESS,其可以实现比Gemini更好的准确率和召回率。实验表明,在他们的数据集上进行训练GESS可以比Gemini快8倍。同时他们还进一步评估了其他几种图形嵌入方法,如图形神经网络,并将其性能与GESS进行了比较。不过值得注意的是GESS虽然能提供较高的接受者操作特性(receiver operating characteristic curve,ROC)曲线下与坐标轴围成的面积(Area Under Curve,AUC)以及召回率,却似乎无法避免过拟合的阴霾。Benjamin Steenhoek[25]等人对深度学习漏洞检测模型进行了全面的调查。他们设计了6个研究问题,以理解模型的能力、训练数据以及模型解释性;并构建了研究实验,获得了针对这些研究问题的结果。这是第一个系统研究和比较各种最先进深度学习模型的工作。

    1. 结合LLM的漏洞检测技术

对于大模型在漏洞检测中的应用既有静态检测也有动态监测。在动态监测上,如文献[26] 将LLM融入到Zigbee模糊测试中,并提出了一种名为LLMIF的模糊测试算法。该算法利用LLM的结果来优化模糊测试的不同阶段,包括种子生成、变异、测试用例评估和测试用例丰富化等等。由于本文聚焦于LLM应用在静态分析领域,故对于动态检测不再赘述。

根据文献[27]的统计,目前对于应用LLM的静态漏洞检测技术主要包括三种:微调(约占73%)、prompt工程(约占17%)和检索增强(约占10%)。而迄今为止,在漏洞检测使用LLM类型方面,仅编码器型大型语言模型占据主导地位。同时,基于LLM的漏洞检测研究所使用的数据集主要集中在函数级或行级输入上,对于类或仓库级的探索则相对有限。许多漏洞检测数据集采用基于启发式的标注方法。此外,当前的方法并不强调与开发者工作流的集成,或者开发者与基于LLM的模型之间的互动和协作。

接下来将会从微调、prompt工程和检索增强三方面进行梳理。

    1. 微调

微调是适配LLM进行漏洞检测的常用技术。在此过程中,需提供带有标签的代码样本(标注是否包含漏洞)作为训练数据,随后通过监督学习对模型进行微调,根据这些标记示例调整模型参数。多项漏洞检测研究直接采用了这种默认微调方法,未引入额外设计。

微调过程通常包含多个步骤/阶段,例如数据准备、模型变量与函数处理等。其中,为增强模型对抗攻击的鲁棒性,研究者会将变量和函数重命名为符号名称(如VAR_1、VAR_2和FUNC_1)。Weng等人[28]基于程序依赖图屏蔽无关注意力分数,将语句间数据和控制依赖信息融入LLM,从而改进了代码表征。

根据主要干预阶段,将微调技术创新分为五类:以数据为中心的创新(数据准备)、与程序分析结合(数据准备)、LLM+其他深度学习模块(模型设计)、领域特定预训练(模型训练)和因果学习(训练优化)。

以数据为中心的创新

此类创新聚焦于优化用于LLM微调的漏洞检测数据。既有研究指出,现有漏洞检测数据存在标签分布失衡、噪声标签或标注错误、标记数据稀缺等问题。研究者探索了以下解决方案:

(1)不平衡学习:针对数据集中非漏洞样本多于漏洞样本的标签失衡问题,Yang等人[29]采用多种数据采样技术;Ding等人[30]则对稀有类别(漏洞样本)的损失值加权,使模型对漏洞样本和干净样本给予同等关注。他们发现,对原始代码数据进行随机过采样可增强LLM漏洞检测模型学习真实漏洞模式的能力。

(2)正例与无标签学习:为解决噪声标签问题,Wen等人[31]提出PILOT框架,仅利用正例(漏洞样本)和无标签数据进行漏洞检测。具体而言,PILOT为选定的无标签数据生成伪标签,并通过混合监督损失缓解数据噪声。

(3)反事实训练:为提升标记数据多样性,Kuang等人[32]提出扰动源代码中的用户定义标识符,同时保持语法和语义结构。该方法生成多样化的反事实训练数据(如扰动标识符后的假设数据),与原始数据(未扰动)形成对比,有助于分析特定因素的影响。融入此类反事实数据可丰富LLM的训练数据。

LLM与程序分析的结合

许多LLM通过掩码语言建模[33]或下一token预测[34]等无监督目标在海量数据上预训练。这类模型可能更关注序列特征,而忽视对代码理解至关重要的结构信息。为解决此问题,多项研究提出将程序分析技术与LLM结合:通过程序分析提取代码的结构特征/关系,再融入LLM以增强其理解能力。例如,Liu等人[35]利用Joern构建函数的抽象语法树(Abstract Syntax Tree,AST)和程序依赖图(Program Dependence Graph,PDG),并基于这些数据预训练LLM,以预测函数内的语句级控制依赖和token级数据依赖;Peng等人[36]通过程序切片提取控制与数据依赖信息,辅助LLM进行漏洞检测;Wang等人[37]提出结合静态源代码信息和动态程序执行轨迹来学习程序表征;Zhang等人[38]将基于语法的CFG分解为多条执行路径,并输入LLM进行漏洞检测;Tran等人[39]则利用程序分析工具规范化用户定义名称(如变量和函数)。

LLM与其他深度学习模块结合

LLM存在固有局限性:首先,多数LLM基于Transformer架构,主要建模序列关系和特征;其次,部分LLM对输入代码片段长度有限制(例如漏洞检测领域最常用的CodeBERT仅能处理512个token)。为突破这些限制,研究者尝试将LLM与其他深度学习模块结合:

(1)LLM+GNN:为更有效利用代码结构特征,Tang等人[40]提出CSGVD,通过GNN提取代码图特征,并与CodeBERT提取的特征融合。Jiang等人[41]从输入代码解析数据流图(Data Flow Diagram,DFG),以变量数据类型作为节点特征,再通过GNN将DFG信息嵌入图表示,并与LLM结合。此外,Yang等人[42]结合LLM与GNN模型:他们首先利用数据流分析(Data Flow Analysis,DFA)嵌入构建GNN模型,然后将GNN学习到的嵌入与LLM的隐藏状态拼接,在每次前向传播中同步训练LLM和GNN。

(2)LLM+Bi-LSTM:为解决LLM的长度限制,Ziems等人[43]将输入代码分割为多个固定长度片段,用BERT编码各片段后,通过双向长短期记忆网络(Bidirectional Long Short-Term Memory Network,Bi-LSTM)处理BERT的输出,最终对Bi-LSTM的最后一个隐藏状态应用softmax分类器生成最终分类得分。

领域特定预训练

领域特定预训练是指在针对特定领域任务(如漏洞检测)进行微调之前,先在特定领域数据(如漏洞数据)上对LLM进行预训练。这一过程使LLM能够更好地理解与该领域相关的数据。多项漏洞检测领域的研究已采用此技术。这些研究通常采用以下三种预训练目标之一:

(1)掩码语言建模:该预训练目标要求LLM预测被掩码的代码片段中的缺失标记。Hanif和Mahmood[44]提出了VulBERTa,其基于RoBERTa[45]模型,在开源C/C++项目上采用掩码语言建模目标进行预训练。由于C/C++是评估VulBERTa时所使用的漏洞检测数据的编程语言,因此该预训练增强了VulBERTa理解C/C++代码的能力。

(2)对比学习:该预训练目标旨在最小化相似函数之间的距离,同时最大化不相似函数之间的距离。通过对比学习,LLM可学习捕获代码的独特特征。具体而言,Ni等人[46]和Wang等人[37]利用不同的隐藏层掩码将同一输入函数转换为正样本(即与输入函数相似的样本),同时将其他不同函数视为负样本。随后,他们基于对比学习目标对LLM进行预训练。此外,Ding等人[30]提出了类别感知对比学习(Category-Aware Contrastive Learning,CA-CLR),以最大化每个样本与其扰动版本之间的表征相似性,并最小化两个随机选择样本之间的表征相似性。

(3)预测程序依赖:该预训练目标旨在通过引导模型学习分析程序依赖关系所需的知识来增强LLM。具体而言,Liu等人[35]在开源C/C++项目的代码上对仅编码器结构的LLM进行预训练,以预测语句级控制依赖和标记级数据依赖。

(4)标注漏洞语句:该预训练目标假设通过增强对潜在漏洞语句(Potential Vulnerability Statement,PVS)的对齐可提升模型性能。例如,Steenhoek等人[47]提出了两种标注方法(即“标记”和“前置”),为模型提供指导或额外信息。“标记”方法在PVS内的每个标记前后插入特殊“标记”符号,而“前置”方法则将PVS内的标记添加到代码开头。这可视为将领域知识注入模型的输入中。

预训练完成后,这些领域特定预训练的LLM会在漏洞检测数据集上进行微调,以执行漏洞检测任务。

因果学习

尽管LLM展现出巨大潜力,但研究发现其在面对扰动或分布外(Out-of-Distribution,OOD)数据时缺乏鲁棒性[48]。Rahman等人[48]指出,这种弱鲁棒性可能源于LLM学习了与标签存在虚假相关的非鲁棒特征(如变量名)。为解决此问题,Rahman等人提出了CausalVul框架,其首先设计扰动以识别虚假特征,随后在LLM上应用因果学习算法,以促进基于因果关系的预测,从而增强LLM在漏洞检测中的鲁棒性。

    1. Prompt工程

应用prompt工程使得LLM赋能漏洞检测的方法非常多,主要分为零样本提示和小样本提示两种。

零样本提示

研究人员已尝试设计有效的提示词,以引导LLM以零样本提示方式执行漏洞检测。其提示工程设计通常包含以下一个或多个组件:

(1)任务描述:该部分提示旨在为LLM提供与漏洞检测相关的有价值任务特定信息,明确模型应实现的目标(例如,识别提供代码中的漏洞)。不同研究采用的任务描述各异,且尚未就最优方法达成共识。具体而言,Zhou等人[49]使用的任务描述为:“若存在任何潜在漏洞,输出:‘此代码存在漏洞’。否则,输出:‘此代码无漏洞’。代码为[code]。开始回复:”。Fu等人[50]提出的任务描述为:“预测以下C/C++函数是否存在漏洞。仅返回1(存在漏洞)或0(无漏洞),无需进一步解释。”Xin Yin[52]采用的任务描述为:“我将提供一段C代码片段,请你判断其是否存在漏洞。请先输出‘是’或‘否’(不确定时输出‘否’),然后解释原因。”Zhou等人[51]使用的描述为:“若以下代码片段存在任何漏洞,输出‘是’;否则,输出‘否’”。

(2)角色描述:该部分旨在帮助LLM从通用语言模型切换至漏洞检测器角色。例如,Zhou等人[49]定义的角色描述为:“你是一名经验丰富的开发者,对安全漏洞有深入了解。”Fu等人[50]使用的角色描述为:“我希望你扮演漏洞检测系统。”Khare等人[53]采用的角色描述为:“你是一名安全研究员。”Xin Yin[52]使用的角色描述为:“我希望你扮演漏洞扫描工具。”

(3)漏洞相关辅助信息:部分研究将漏洞相关辅助信息融入提示设计,以提升LLM性能。例如,Zhou等人[49]建议在提示中加入代表2022年最危险的前25种常见弱点枚举(Common Weakness Enumeration ,CWE)的漏洞代码示例,以帮助LLM更好地理解严重漏洞的特征。此外,Khare等人[53]在询问LLM关于提供代码的潜在漏洞时,会明确指定漏洞类型。

(4)程序分析辅助信息:部分研究利用程序分析工具从输入代码中提取代码依赖关系,以增强LLM对输入代码的理解。例如,Khare等人[53]设计了一种基于数据流分析的提示,引导模型在预测目标代码片段是否存在漏洞前,模拟基于源-汇-净化器的数据流分析。Zhang等人[54]设计的提示则融入了数据流或API调用的辅助信息。

(5)链式思考(Chain-of-Thought,CoT)提示:该方法由Kojima等人[55]提出,旨在通过添加“让我们一步一步思考”到原始提示中,提升模型的推理能力。具体而言,Zhou等人[51]和Ni等人[56]在提示中加入了“让我们一步一步思考”以引导模型进行逐步推理。

小样本提示

在该方法中,将少量输入与真实标签对的示例作为额外指导提供给LLM。具体而言,Ni等人[56]使用1到6个小样本学习示例来填充固定的上下文窗口(即4096个标记)。周等人[51]使用了两个小样本示例。

    1. 检索增强

检索增强(Retrieval augmentation,RAG)是一种用于提升小样本提示效果的技术。其核心思想是:当给定一个测试样本时,从训练集中检索与之相似的带标签数据样本,并将这些检索到的数据作为示例,引导LLM对测试样本进行预测。

Liu等人[57]提出使用BM-25和TF-IDF等高效检索工具实现这一过程。Zhou等人[49]则建议使用CodeBERT作为检索工具。该方法首先将代码片段转换为语义向量,然后通过计算两个代码片段语义向量的余弦相似度来量化它们之间的相似性,最终根据相似度得分返回最相似的代码片段。

Du等人[58]提出了一种基于知识级检索增强的三阶段漏洞检测框架:首先,利用LLM从现有通用漏洞披露(Common Vulnerabilities & Exposures,CVE)实例中提取多维知识,构建漏洞知识库;其次,针对给定的代码片段,基于功能语义从知识库中检索相关漏洞知识;最后,通过LLM推理代码中是否存在漏洞诱因,并结合检索到的知识提出潜在修复方案,从而评估代码的漏洞风险。

Wen等人[59]则提出了一种基于调用图的依赖检索方法:首先根据输入代码检索最相关的依赖关系,然后将这些依赖与输入代码一并输入LLM,以实现更精准的漏洞检测。

  1. 未来拟研究方向介绍

本文首先陈述当前研究的局限性,接着给出未来拟研究方向的相关科学问题和可能创新点。

    1. 当前研究的局限性

局限1:输入粒度小。

目前,基于LLM的漏洞检测方案主要针对函数级(或更细粒度地,针对行级)。然而,这种小的输入粒度表明,当面对更广泛的程序范围(如类或整个代码库)时,这些方法可能无法发挥最佳性能。函数级的漏洞检测方法可能会忽略跨多个函数或类的漏洞。除了函数之外,未来的研究可以提出能够处理更广泛程序范围的基于LLM的检测方法。

局限2:缺乏高质量的漏洞数据集。

当前研究的一个主要挑战是缺乏高质量的漏洞数据集。先前的研究已经指出了现有漏洞数据存在的问题,包括标签嘈杂或错误(例如,将干净的代码标记为存在漏洞)。这一数据质量问题主要归因于自动漏洞收集的使用,虽然它可以收集足够大的数据来训练包括LLM在内的基于深度学习的模型,但无法保证标签的完全正确性。虽然手动检查每个数据样本可以确保高质量,但这是一个非常繁琐且成本高昂的过程,尤其是在目标为大型数据集时。构建高质量的漏洞检测基准至今仍是一个未解决的挑战。

局限3:漏洞数据的复杂性导致性能不佳。

漏洞本身可能非常复杂,这给使用LLM进行漏洞检测带来了挑战。例如,漏洞数据中普遍存在跨过程漏洞,而检测跨过程漏洞比检测过程内漏洞更具挑战性。此外,漏洞包含多种常见CWE类型,但相较于常见类型,LLM在处理较少见的CWE类型时可能会遇到困难。另外,漏洞通常以代码单元(如代码行、函数或程序片段)的形式表示,这些单元内存在漏洞。当检测跨越多个代码单元(如跨越多个函数)的漏洞时,准确率会显著下降。未来在设计基于LLM的解决方案时,应考虑漏洞的复杂性质。

局限4:依赖轻量级LLM

大多数研究使用轻量级LLM(参数数量<10亿)进行漏洞检测和修复。对于像CodeBERT这样的轻量级LLM,研究人员已探索了各种策略来提高其性能,包括以数据为中心的增强、以模型为中心的创新、与程序分析的结合、将LLM与其他深度学习方法结合、特定领域的预训练、因果学习和强化学习。在某些情况下,结合了多种技术以实现更高的性能,这凸显了轻量级模型的多功能性和潜力。相比之下,与轻量级LLM相比,大型LLM(参数数量超过10亿)的使用仍然相对有限,仍有很大的探索空间。

局限5:缺乏部署考虑。

在此考察部署的两个关键方面:1)与开发者的互动;2)集成到开发者当前的工作流中。目前,没有一项研究被纳入开发者的工作流中;相反,它们主要依赖静态和历史数据来评估其有效性。此外,很少有研究涉及与开发者的互动,如通过反馈或解释漏洞检测背后的理由来与开发者互动。开发者与基于LLM的解决方案之间有限的互动可能会阻碍在实际应用中建立信任和协作。这种缺乏交互功能限制了这些模型在实际场景中的实用性,因为在这些场景中,有效的漏洞管理依赖于自动化工具和开发者之间的协作。

局限6:缺乏高精度和鲁棒性。

通常更倾向于使用高精度的漏洞检测方案,因为这能增强开发者对检测可靠性的信心。然而,当前最先进的方法在准确性方面尚未达到令人满意的水平,漏洞检测的准确率为67.6%。此外,解决方案应保持对数据扰动或对抗性攻击的鲁棒性,以确保其韧性。然而,LLM对数据扰动并不鲁棒。未来的研究应探索提高基于LLM的解决方案的准确性和鲁棒性的方法。

    1. 未来拟研究方向

在本节将会根据现有研究进行分析,探寻尚未被广泛探索但值得进一步研究的领域,为未来研究提供有前景方向的研究路径。

现有方法通常采用轻量级LLM或通过微调和prompt工程等技术适配的大型LLM。这些方法多聚焦于方法级或代码行级的分析,使用的数据集通常来自启发式漏洞检测方法收集的数据,或是缺乏测试用例的真实世界漏洞修复数据。最后,这些方法往往忽视部署层面的考量,例如与开发人员实现有效交互的机制。

现在在该领域存在多个具有潜力但尚未充分探索的模块和路径。展望未来,可规划三个逐步深入的阶段以探索新方向:第一阶段,研究者可对单个尚未充分探索的模块展开独立研究;第二阶段,可深入探索包含未充分探索模块与成熟模块组合,或完全由多个未充分探索模块构成的研究路径;第三阶段,通过将所有未充分探索模块转化为成熟组件,并研究各类未充分探索的路径与组合方式,研究者可系统总结发现成果,分析优化基于LLM的解决方案的发展策略,最终推动新一代高性能基于LLM的漏洞检测方案的诞生。

阶段一:独立探索未充分研究模块。

创新一:构建高质量漏洞检测测试集。高质量漏洞数据集的缺失严重阻碍了漏洞检测技术的发展。尽管为大型数据集标注完全正确的标签成本高昂,但一个可行的解决方案是策划一个高质量的小型测试集(远小于完整数据集规模),以准确评估漏洞检测技术的进展。未来的一个研究方向是将分散在多篇独立研究工作中的、经过人工校验的漏洞数据样本进行整合,从而构建一个高质量的测试集。在此基础上,后续研究可借助该测试集开展实证研究,以客观评估漏洞检测领域的实际进展。此外,学术界可通过持续纳入新的人工验证数据,维护一个动态更新的高质量测试集,使其成为漏洞检测领域可靠的基准工具。

创新二:代码库级漏洞检测。当前漏洞检测技术主要聚焦于函数或代码行级别,这主要受限于小型LLM(如CodeBERT和CodeT5)的输入长度限制(512个子词单元),此类模型在现有研究中占据主导地位。512个子词单元的长度限制与函数级数据处理需求相契合,但在扩展至类或代码库级别时则面临挑战。然而,随着近期大型LLM(如GPT-4,可处理128k个子词单元)的出现,其显著提升的输入长度处理能力为代码库级数据处理提供了可能,也为未来研究探索代码库级漏洞检测带来了机遇。针对这一方向,近期一项研究[51]已初步探索了代码库级漏洞检测任务,具体而言,该研究比较了静态分析(Static Application Security Testing,SAST)工具(如CodeQL)与主流或前沿开源LLM(如Code Llama)在软件仓库漏洞检测方面的表现。实验结果显示,SAST工具的漏洞检出率较低,但误报率也相对较低;而LLM虽然能检测到更多漏洞,但往往伴随着较高的误报率。在这一初步探索的基础上,该领域仍存在巨大的研究潜力与机遇。

创新三:面向漏洞领域的定制化LLM。目前,广泛用于漏洞检测的LLM是通用模型(如CodeBERT、CodeT5和GPT-3.5),未能充分利用丰富的开源漏洞数据。一个有前景的发展方向是开发专门针对漏洞数据定制的LLM。目前,已有一些初步尝试,如vulnGPT和微软安全副驾驶。然而,由于这些解决方案是专有的,其定制化LLM的细节可能未完全公开。本文倡导开展协作,共同开发开源且有效的漏洞定制化LLM。

创新四:LLM的高级用法与适配。除了现有研究所采用的微调、prompt工程和检索增强等技术外,在漏洞检测领域,还有两种更高级的LLM用法尚未被探索:1)LLM智能体:LLM可充当智能体,将复杂任务分解为更小的组成部分,并调用多个LLM协同处理[60];2)外部工具的使用:LLM可利用搜索引擎、外部数据库等工具增强自身能力[61]。在LLM适配技术方面,该领域提出的大多数适配技术都是针对微调和提示工程设计的,而众多先进的检索增强适配技术(如迭代检索增强[62]、递归检索增强[63]和自适应检索增强[64])仍有待探索。研究人员可在未来研究中考虑采用这些尚未探索的高级LLM用法/适配技术。

创新五:支持部署就绪功能。可重点增强基于LLM的解决方案的部署就绪功能,如用户交互能力和与现有开发者工作流的无缝集成。这包括开发直观的界面,使开发者能够对LLM提出的建议提供实时反馈,从而构建一个更具协作性的环境。此外,实现解释模型推荐背后逻辑的功能,有助于揭开决策过程的神秘面纱,培养开发者的信任,并促进他们更好地采用这些解决方案。再者,将这些解决方案集成到流行的集成开发环境(Integrated Development Environment,IDE)或版本控制系统中,可以简化工作流程,使开发者更轻松地将LLM纳入日常实践。通过优先考虑这些增强功能,基于LLM的工具可以显著提升其在现实场景中的可用性和有效性,最终为更稳健的漏洞检测流程做出贡献。

阶段二:探索未充分研究的路径。

未充分探索的路径包含未充分探索模块与成熟模块的组合,或完全由多个未充分探索模块构成。这一阶段蕴含着大量研究机遇。以下重点列举几个结合未充分探索模块与成熟模块展开组合研究的案例:

(1)一旦学术界开发出定制化LLM,研究人员即可应用经过充分研究的微调或基于prompt工程的适配技术,来提升函数级或代码行级漏洞检测的效果。这些增强型模型可进一步扩展以支持开发者交互,从而构建出更具实用性和集成性的解决方案。

(2)一旦新数据集(例如包含人工验证漏洞及其关联测试用例的数据集)建立,研究人员即可重新评估现有LLM方法,以检验其在漏洞检测任务中的有效性。探索未充分探索领域与成熟方法的各种组合,可带来极具价值的洞见与技术突破。

(3)研究人员可利用通用LLM(如CodeBERT、CodeT5和GPT-3.5)开发代码库级漏洞检测工具,同时促进与开发者的交互。

在完全由多个未充分探索模块构成的路径方向上,同样存在大量研究机遇。例如,研究人员可设计一种基于定制化漏洞领域LLM的代码库级漏洞检测方法,并通过引入LLM智能体技术来提升其效能。最终,该工具可集成至IDE中,借助LLM来增强交互能力。

阶段三:总结研究成果并推动新一代基于LLM的解决方案。

在这一最高阶段,研究人员需将各类未充分探索的领域转化为成熟研究方向,并系统探究多样化的未探索路径。在此阶段,可系统总结研究成果,深入分析优化基于LLM的解决方案开发策略。通过充分运用这些经验与知识,有望突破LLM在漏洞检测领域的能力边界,实现新的技术突破。

未来可研发一种高效方法,能够执行代码行级、函数级、类级以及代码库级的多层次漏洞检测任务,并借助专家标注的基准数据集确保评估的准确性。此外,这种解决方案还应支持与开发者的无缝沟通协作,在提供值得信赖的专家级漏洞洞察的同时,实现高精度、强鲁棒性的现实漏洞检测能力。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐