分享自:

利用大语言模型整合代码变更意图、开发构件和历史漏洞进行漏洞修复检测

期刊:Proceedings of the ACM on Software EngineeringDOI:10.1145/3715738

近日,一篇题为《Code Change Intention, Development Artifact, and History Vulnerability: Putting Them Together for Vulnerability Fix Detection by LLM》的研究论文在《Proceedings of the ACM on Software Engineering》期刊(FSE卷,2025年6月)发表。该研究由Xu Yang(加拿大曼尼托巴大学)、Wenhan Zhu、Michael Pacheco、Jiayuan Zhou(均来自中国深圳华为技术有限公司)、Shaowei Wang(加拿大曼尼托巴大学)、Xing Hu(中国浙江大学)和Kui Liu(华为软件工程应用技术实验室)合作完成。本报告旨在详细解读这项旨在利用大型语言模型(Large Language Model,LLM)提升开源软件漏洞修复提交检测能力的前沿工作。

一、 研究背景与动机 本研究隶属于软件工程安全领域,核心关注点在于如何自动化、准确地从开源软件(Open-Source Software, OSS)的代码提交历史中识别出那些旨在修复安全漏洞的“漏洞修复提交”(Vulnerability Fix Commit)。这项工作对于软件供应链安全至关重要,因为及早发现并应用上游OSS中的安全补丁,能有效缩短攻击者的可利用窗口期,降低下游依赖项目被攻击的风险。

尽管已有多种自动化方法被提出,如VulFixMiner和ColeFunda等基于预训练语言模型(Pre-trained Language Model, PLM)的方法,但这些方法主要聚焦于分析代码变更本身,忽视了来自开发工件(如相关的问题报告、拉取请求)和项目历史的宝贵上下文信息。例如,VulCurator虽然集成了问题报告信息,但未能充分利用不同开发工件之间的语义关联,也无法有效处理混杂了多种意图的“缠结提交”(Tangled Commits,即一个提交中包含了漏洞修复、功能改进、重构等多种代码修改),更缺乏对其预测结果的解释,从而限制了这些方法在真实场景中的实用性。

与此同时,大型语言模型(LLM)在代码理解、自然语言处理及相关任务中展现出的强大能力,为解决上述挑战提供了新的可能性。LLM不仅能理解代码语法和语义,还能关联自然语言描述,并通过链式思维(Chain-of-Thought, CoT)推理和上下文学习(In-Context Learning, ICL)等技术进行复杂推理。因此,研究团队的目标是设计一个新颖的框架,整合多源信息,利用LLM的强大能力来显著提升漏洞修复提交检测的准确性,并能为安全专家提供可理解的决策分析。

二、 研究详细流程与方法 研究团队提出了名为LLM4VFD的创新框架,旨在通过整合LLM对多个信息来源的分析来增强漏洞修复检测。整个研究流程围绕该框架的设计、实现与评估展开,主要包括以下几个关键步骤:

步骤一:构建数据集(BigVulFixes) 为避免LLM训练数据泄露带来的评估偏差,研究团队没有使用包含2023年前数据的旧数据集,而是专门构建了一个名为BigVulFixes的新数据集。该数据集严格收集了2023年之后产生的漏洞修复提交。具体流程如下: 1. 数据来源:从美国国家漏洞数据库(NVD)中获取带有GitHub提交链接的CVE记录。 2. 语言筛选:限定于Java, C, C++, Rust, JavaScript, Python, Go这7种主流编程语言。 3. 漏洞修复提交:通过CVE引用链接,共收集到1,689个漏洞修复提交。 4. 非漏洞修复提交:为了应对现实中漏洞修复提交极度稀缺(如约占总提交的0.1%)导致的数据不平衡问题,研究人员遵循一种采样策略,从产生漏洞修复的相同OSS项目中随机抽取了26,468个非漏洞修复提交,构成约1:16的比例。 5. 关联数据收集:对于所有提交,通过解析提交消息中的引用和调用GitHub API,收集了共计17,791条相关的议题报告(Issue Report, IR)和拉取请求(Pull Request, PR)信息,作为开发工件的上下文。

步骤二:LLM4VFD框架设计与实现 LLM4VFD框架包含四个核心组件,每个组件旨在解决一个特定的挑战,并生成结构化的分析信息,最终汇总给决策组件。 1. 代码变更意图组件:该组件用于应对“缠结提交”挑战。输入是原始的代码变更差异和提交消息。利用设计好的链式思维提示模板,引导LLM分三步思考并生成一个“三方面摘要”: * 代码变更摘要:总结代码变更的主要操作。 * 变更目的:推理变更的原因,分类如“修复漏洞”、“功能增强”或“重构”等。 * 变更影响:分析变更可能带来的后果,特别是安全方面的影响。这个结构化的摘要抽象了提交的核心意图,过滤了无关代码变更的噪音。 2. 开发工件组件:用于应对“提交信息不足”的挑战。输入是前面收集到的与目标提交相关的议题报告或拉取请求内容。同样使用特定的提示模板,指导LLM生成另一个“三方面摘要”,用以提取开发工件中的关键上下文信息,理解变更背后的动机和安全关联。 3. 历史漏洞组件:用于应对“缺乏项目特定上下文”的挑战。研究人员首先构建了一个历史漏洞向量数据库。该数据库包含了2023年之前的所有漏洞修复提交及其CVE描述,并对每个提交都应用代码变更意图组件生成了“三方面摘要”。接着,使用句子嵌入模型(如本研究中采用的gte-qwen2-7b-instruct)将这些摘要向量化并存储在向量数据库中。当处理一个新提交时,先使用代码变更意图组件生成其摘要,然后在该数据库中检索编程语言相同且摘要最相似的历史漏洞提交,将其摘要和CVE描述作为补充上下文输出。 4. 综合分析及漏洞修复检测组件:这是框架的决策中枢。它将前三个组件的输出(代码变更的三方面摘要、开发工件的三方面摘要、检索到的历史漏洞信息)与原始的代码变更内容整合到一个精心设计的综合提示中。这个提示不仅提供信息,还引导LLM进行对比和分析任务:首先比较当前提交与检索到的历史漏洞的异同以避免偏见,然后综合分析所有信息来确定当前提交是否为漏洞修复。更重要的是,LLM需要生成一个详细的分析论述来解释其决策逻辑,为安全专家提供可审查的依据。

步骤三:实验评估 研究团队进行了全面的实验来回答四个研究问题(RQ),以验证LLM4VFD的有效性。 1. 模型选择:为了评估框架的通用性,研究选择了来自三大系列的六种不同规模的LLM作为基础模型,包括Llama3.1 (70B/8B)、Qwen2 (72B/7B) 和DeepSeek-Coder-V2 (236B/16B)。 2. 对比方法: * 现有SOTA方法:包括VulFixMiner、ColeFunda(仅Java)和VulCurator。 * 朴素LLM基线:使用相同的综合提示模板,但不包含LLM4VFD三个组件生成的任何额外上下文信息,即LLM仅基于原始代码变更进行零样本链式思维推理。 3. 评估指标:采用精确率、召回率、F1分数和马修斯相关系数(MCC),由于数据高度不平衡,未使用准确率。 4. 主要实验(RQ1 - 有效性):在BigVulFixes数据集上,将LLM4VFD与对比方法进行性能比较。结果表明,无论使用哪种基础LLM,LLM4VFD在所有评估指标上均显著优于现有的基于PLM的最佳方法(VulCurator)。例如,在使用Llama3.1-70B时,LLM4VFD的F1分数(0.54)比VulCurator(0.22)高出145.5%。同时,LLM4VFD也全面超越了其对应的朴素LLM基线,F1分数提升幅度在12.7%到105.6%之间。值得注意的是,较小的模型(如7B、8B、16B)从LLM4VFD框架中获益更多,性能提升百分比远超大模型(70B以上),这表明该框架能有效弥补小模型在复杂上下文理解上的不足,缩小了它们与大模型之间的性能差距。 5. 消融分析(RQ2 - 组件贡献):通过逐一移除LLM4VFD中的某个组件来评估其贡献。实验以Qwen2-72B和Qwen2-7B为对象。结果表明,所有三个组件都对最终性能有积极贡献。其中,代码变更意图组件影响最大,移除后导致精确率和F1分数显著下降,尤其是在较小的Qwen2-7B模型上。这表明意图抽象对于过滤噪声、聚焦安全相关变更至关重要。开发工件组件和历史漏洞组件也各自带来了正向增益。 6. 用户研究(RQ3 - 分析有用性):邀请了10位具有3-5年软件安全经验的专家,评估LLM4VFD生成的决策分析报告。研究提供了40个漏洞修复提交案例及其对应的分析。调查结果显示:95%的案例中,分析有助于专家理解代码变更意图;90%的案例中,分析准确地描述了漏洞特征;80%的案例中,分析提高了专家识别漏洞修复提交的效率。这表明LLM4VFD不仅能预测,其生成的分析确实具备实际应用价值,能辅助安全专家进行人工审查。 7. 失败案例分析(RQ4 - 局限性):研究人员手动分析了误报和漏报案例,以探究框架的失败原因。主要发现是:LLM4VFD最常混淆“漏洞修复”与“非漏洞安全修复”。即,它能正确识别出与安全相关的提交,但有时难以判断该安全修复是否针对一个可被利用的具体“漏洞”。此外,历史漏洞组件检索到不相关的历史漏洞也会导致误导性判断。

三、 主要研究结果与结论 本研究通过系统性的实验和评估,得出了多项重要结果,并有力地支撑了其核心结论。 首先,实验数据明确证实了LLM4VFD框架在漏洞修复检测任务上的优越性。无论是与现有的、基于预训练语言模型的先进方法相比,还是与仅依赖原始代码信息的朴素大型语言模型相比,LLM4VFD均展现出显著且全面的性能提升。其F1分数、MCC等关键指标的优势,直接证明了整合代码变更意图、开发工件上下文和历史漏洞信息这一多源信息融合策略的有效性。 其次,消融分析的结果揭示了框架内部各组件的作用机制。代码变更意图组件的核心作用在于其“降噪”和“聚焦”能力,它将原始、可能杂乱的代码变更转化为结构化的意图摘要,这是提升模型精确率和整体性能的关键。开发工件组件为决策提供了必要的背景动机,而历史漏洞组件则引入了项目特定的模式参考。这三个组件相辅相成,共同构成了一个鲁棒的上下文理解体系。 再者,用户研究的正面反馈为LLM4VFD的实际应用价值提供了强有力的佐证。安全专家普遍认为,框架生成的分析报告不仅有助于快速理解复杂提交的意图,还能提高审查效率。这一结果超越了单纯的性能指标,将研究的价值延伸到了实际工作流程的改进层面。 最后,失败案例分析揭示了当前方法的边界。混淆“漏洞修复”与“一般安全修复”是主要挑战,这说明LLM在理解“漏洞”的严格定义和严重性方面仍有提升空间。这为未来的研究指明了方向。

综合以上结果,本研究得出结论:通过精心设计一个整合了代码变更意图抽象、开发工件上下文利用和历史漏洞相似性检索的框架,并利用大型语言模型的链式思维推理和上下文学习能力,可以显著提升自动化检测开源软件中漏洞修复提交的准确性和实用性。该框架不仅输出预测结果,还能提供可解释的分析,有效辅助安全专家的工作。LLM4VFD代表了利用LLM解决复杂软件工程安全任务(特别是需要多源、上下文关联理解的任务)的一次成功探索。

四、 研究亮点与价值 本研究的亮点与创新之处体现在多个层面: 1. 方法首创性:据作者所述,这是首个系统性研究如何利用大型语言模型进行漏洞修复提交检测的工作,开辟了LLM应用于该特定安全任务的研究方向。 2. 框架设计新颖:提出的LLM4VFD框架创造性地将多源信息(代码变更、开发工件、历史漏洞)通过LLM进行统一的知识蒸馏和融合,并巧妙地结合了链式思维推理和上下文学习,为解决现有方法的三大核心痛点提供了系统性方案。 3. 注重可解释性与实用性:研究没有停留在提升预测准确率,而是将生成详细、可理解的决策分析作为核心目标之一,并通过用户研究验证了其在实际工作流程中的辅助价值,体现了从研究到应用的紧密结合。 4. 严谨的数据处理:为规避LLM预训练数据泄露问题,专门构建了包含2023年后数据的新数据集BigVulFixes,并公开了复现包,确保了实验的可靠性和结果的可复现性,为后续研究提供了基准。 5. 广泛而深入的评估:研究不仅进行了与SOTA方法的横向对比,还通过消融分析深入探究了各组件的作用,通过用户研究评估了产出价值,并通过失败分析反思了局限性,形成了一个完整的评估闭环,结论扎实可信。

该研究的价值在于,它不仅提供了一种性能更优的漏洞修复检测工具,更重要的是展示了一种如何利用现代大语言模型技术,通过结构化提示工程整合软件工程中多模态、多来源上下文信息以解决复杂分析任务的范式。这对于软件供应链安全监控、漏洞管理自动化以及更广泛的智能软件工程辅助工具开发都具有重要的参考意义和推动价值。同时,其公开的数据集和框架也为学术界和工业界进一步探索相关领域奠定了基础。

上述解读依据用户上传的学术文献,如有不准确或可能侵权之处请联系本站站长:admin@fmread.com