分享自:

CLNX:连接代码与自然语言用于C/C++漏洞贡献提交识别

期刊:AAAI Conference on Artificial Intelligence (AAAI-25)

关于《clnx: bridging code and natural language for c/c++ vulnerability-contributing commits identification》一文的学术研究报告

本文旨在向中国学术同行介绍一篇近期发表于人工智能领域顶级会议AAAI (The Thirty-Ninth AAAI Conference on Artificial Intelligence, AAAI-25) 的原创性研究论文。该工作由华中科技大学网络空间安全学院的覃泽青、吴一玮和韩兰星*(通讯作者)等人合作完成。论文标题为《CLNx:为C/C++漏洞贡献性提交识别架起代码与自然语言之间的桥梁》,提出了一种轻量级方法,显著提升了基于BERT的大型语言模型(Large Language Models, LLMs)识别C/C++项目中引入漏洞的代码提交(Vulnerability-Contributing Commits, VCCs)的能力。

一、 研究的学术背景

本研究的核心领域是软件安全与人工智能的交叉学科,具体聚焦于利用大型语言模型进行自动化的软件漏洞识别。近年来,开源软件(Open-Source Software, OSS)的应用日益广泛,其蕴含的安全漏洞数量也随之激增。根据2023年OSSRA报告,在分析的1703个代码库中,高达84%的代码库包含至少一个已知的开源漏洞。尤为值得注意的是,在过去十年中,超过一半(52.13%)的已报告OSS漏洞存在于C/C++代码中。在OSS开发中,代码的更新主要通过“提交”(commits)进行,而其中一些提交(被称为漏洞贡献性提交)会无意中引入新的安全漏洞。因此,高效、准确地识别VCCs对于从源头预防漏洞、保障软件安全具有重大意义。

大型语言模型,特别是基于BERT架构的模型,在代码理解与漏洞识别任务中展现出巨大潜力。这类模型通过其双向编码器架构,能够有效学习代码的依赖关系和上下文语义。然而,现有研究主要依赖于在海量代码数据集上对LLMs进行进一步的预训练(further pre-training)来提升其在特定编程语言(如C/C++)上的性能。这种方法存在显著局限性:首先,它需要消耗巨大的计算资源;其次,即便进行了大量额外预训练,性能提升也可能非常有限。例如,CodeBERT-CPP在C/C++漏洞识别任务上仅带来了2.03%的准确率提升。这表明,单纯依赖进一步的预训练可能是一种低效甚至有时无效的策略。

基于此背景,本研究旨在解决一个关键挑战:如何在保证轻量级实现的前提下,有效提升LLMs在C/C++ VCCs识别任务中的性能? 为此,研究者们提出了一种创新的思路,不再仅仅依赖于消耗资源的模型预训练,而是转向设计一种能够将复杂的C/C++代码“翻译”或“适配”为LLMs更易理解形式的中间件。

二、 研究的详细工作流程与方法论

为了解决上述挑战,本研究提出了一个名为CodeLinguaNexus (CLNx) 的框架,它充当了C/C++程序代码与大型语言模型之间的“桥梁”。CLNx的核心思想是通过两个阶段的“自然化”(Naturalization)处理,将源代码及其对应的补丁提交信息,转化为一种保留关键细节但更接近自然语言表达的形式,从而降低LLMs的理解难度。其工作流程主要包含以下几个关键步骤:

研究对象与数据集: 研究构建了一个包含25,872个C/C++函数及其对应提交的数据集,这些数据源自两个大型开源项目FFmpeg和Qemu。其中,包含10,894个被标记为漏洞贡献性提交(VCCs)的样本。数据被按照8:1:1的比例随机划分为训练集、验证集和测试集,用于模型的训练与评估。

工作流程详述:

  1. 结构层面的自然化(Structure-Level Naturalization): 此阶段的目标是处理C/C++代码固有的结构复杂性和长度过载问题。具体步骤如下:

    • 代码分析器(Code Analyzer): CLNx首先利用Joern工具分析输入的源代码函数,生成其抽象语法树(Abstract Syntax Tree, AST)。基于AST和控制流分析,代码被分解为一系列“基本块”(Basic Blocks)。每个基本块是一个顺序执行、单入口单出口的指令序列,内部没有分支。
    • 构建执行路径图: 这些基本块被组织成一个图结构 G = (V, E),其中顶点V代表基本块,边E代表基本块之间的控制流。程序的入口基本块和出口基本块分别对应图中的源点(Ventry)和汇点(Vexit)。
    • 关键执行路径识别(Critical Path Identification): 这是CLNx的核心创新步骤。研究者并非将所有执行路径都提供给模型,而是基于补丁提交信息,智能地选择一条“关键路径”。首先,确定与提交相关的污染块:基于污点分析(Taint Analysis)思想,将补丁中删除的代码行及其前后三行区域定义为“污染区域”。任何与污染区域存在交集的基本块被标记为“提交相关基本块”(bb_tainted)。其次,设计关键路径选择算法:该算法基于动态规划,旨在从源点Ventry到汇点Vexit的所有可能路径中,选择一条能够最大化覆盖提交相关基本块(bb_tainted)数量同时路径长度最短的路径。若存在多条路径满足前两个条件,则选择信息熵最高的一条。这一步骤极大地压缩了输入长度,并突出了与漏洞最可能相关的代码逻辑。
  2. 符号层面的自然化(Token-Level Naturalization): 此阶段旨在解决C/C++语言中大量存在的、对LLMs不友好的低级符号(如指针、位操作、预处理器指令等)。

    • 反向映射(Reverse Mapping): 将上一步选取的关键路径(由一系列基本块组成)映射回对应的原始源代码片段。
    • 关键符号转换(Key Symbols Transformation): 对映射得到的源代码中的特定符号类型进行解释和重写,将其转换为易于理解的自然语言等价描述。例如:
      • 指针解引用操作 *p 转换为 dereference p
      • 取地址操作 &var 转换为 address of var
      • 位左移操作 a << b 转换为 a left shift by b
      • 预处理器指令 #include <h> 转换为 include header file <h>。 研究者首先根据C++参考文档的词汇规则提取所有关键词和符号,并为它们提供自然语言等价描述,随后应用最长公共子序列算法去除重复,以增强不同等价描述之间的区分度。

系统集成与模型训练: CLNx作为一个预处理模块,其输入是原始的C/C++函数代码及其补丁提交信息,输出是经过两阶段自然化处理后的“自然化代码”。在模型训练阶段,使用已知的VCCs数据集,将原始代码对通过CLNx处理后,再输入给选定的BERT基LLMs(如BERT、CodeBERT)进行微调(Fine-tuning)。在预测阶段,对于未知的代码提交对,同样先经过CLNx处理,再将结果送入已微调的LLM进行分类(是否为VCC)。整个流程如图1所示,体现了CLNx作为中间件的角色。

三、 研究的主要结果与分析

研究者进行了详尽的实验来回答三个研究问题(RQ),实验结果有力地支持了CLNx的有效性和先进性。

RQ1:CLNx如何增强LLMs在C/C++ VCCs识别任务中的表现? 实验选取了包括GPT系列(GPT-3.5 Turbo, GPT-4.0)、CodeLlama-7B以及多种BERT基模型(BERT, DistilBERT, RoBERTa, ContraBERT, CodeBERT, CodeBERT-CPP)作为基线。评估指标包括精确率(Precision)、准确率(Accuracy)、召回率(Recall)和F1分数。 * 整体提升: 在完整应用CLNx的两阶段自然化后(模型标记为CLNx-<模型名>),所有BERT基模型的性能均得到显著提升。例如,基础的BERT模型精确率提升了14.48%(从58.60%升至73.08%),CodeBERT模型的精确率提升了8.27%(从66.89%升至75.16%)。配备了CLNx的CodeBERT(CLNx-CodeBERT)在所有评估指标上均超越了所有对比的LLMs,达到了最佳性能。 * 分阶段效果(消融研究): 实验设置了仅应用结构层面自然化的模型(CLNx_s-<模型名>)。结果显示,仅使用结构自然化,BERT的精确率就达到了70.33%,超越了所有经过额外代码预训练的基线模型(如CodeBERT、RoBERTa)。这直接证明了CLNx的自然化策略比传统的预训练策略更为有效。研究者也观察到,单独使用结构自然化时,召回率略有下降,这可能是由于过度追求路径长度最短而遗漏了部分漏洞相关信息。然而,当结合符号层面自然化后,召回率得到恢复并最终达到最高值,表明符号自然化有效增强了模型对保留信息语义的理解。

RQ2:配备CLNx的LLM与其他漏洞识别方法相比表现如何? 为了全面评估,研究者将CLNx-CodeBERT与多种先进方法进行比较,包括:传统静态分析工具(Cppcheck)、基于深度学习的漏洞检测方法(VulDeePecker, SySeVR, Devign, REVEAL)、以及专门针对漏洞提交的识别方法(VulFixMiner, GraphSPD)。 * 结果: CLNx-CodeBERT在精确率(75.16%)上显著优于所有对比方法(提升至少10.59%),并且在准确率和F1分数上也达到了最优,创造了该任务的新state-of-the-art(SOTA)性能。这证明了CLNx的轻量级代码嵌入方法(基于AST和CFG的简单图表示)能够比复杂的图嵌入方法(如结合PDG、CDG、DDG的GraphSPD)更有效地让LLMs捕捉关键语义信息,同时避免了图模型常见的冗余信息问题。 * 召回率分析: 尽管CLNx-CodeBERT在所有LLM中召回率最高,但低于REVEAL等方法。论文指出,这可能源于BERT类模型的预训练目标更侧重于精确性任务而非全面的召回覆盖。然而,综合考虑平衡精确率与召回率的F1分数,CLNx-CodeBERT表现最佳,验证了其整体有效性。

RQ3:配备CLNx的LLM在识别现实世界OSS漏洞中的表现如何? 为验证其实用价值,研究者将微调后的CLNx-CodeBERT部署用于扫描35个C/C++开源项目的代码仓库。 * 结果: 模型报告了106个可疑的漏洞提交,经人工验证,其中38个被确认为真实有效的漏洞。这些漏洞覆盖了广泛的CWE(Common Weakness Enumeration)类型,包括缓冲区错误、空指针解引用、权限分配不当、资源管理错误、竞态条件等12类。特别是,模型在缓冲区错误(CWE-119)和空指针解引用(CWE-476)等模式相对清晰的漏洞类型上表现突出,分别检测出9个和6个。这归功于CLNx能够从漏洞函数中提炼出关键信息,减少了无关信息对LLMs的干扰。对于密码学问题(CWE-310)这类逻辑复杂、模式不统一的漏洞,检测数量较少(仅1个)。

四、 研究的结论与价值

本研究的主要结论是,提出的CLNx框架能够以轻量级、高效率的方式,显著提升大型语言模型(尤其是BERT基模型)识别C/C++漏洞贡献性提交的能力。CLNx通过“结构自然化”和“符号自然化”两个阶段,将复杂的C/C++代码转化为更贴近自然语言、更利于LLMs理解的表示形式,从而绕过了对海量计算资源依赖的进一步预训练范式。

科学价值与应用价值: * 科学价值: 本研究为提升LLMs在特定领域(如特定编程语言的漏洞检测)的性能提供了一种新颖且高效的范式。它证明,通过设计针对性的数据预处理和表示学习方法(即“架桥”),可以比单纯增加模型预训练数据更有效地解决领域适配问题。这为后续研究如何更好地让LLMs理解结构化、符号化的专业领域数据(如代码、公式)提供了重要思路。 * 应用价值: CLNx-CodeBERT在公开基准测试和真实世界扫描中均表现出色,展示了其作为自动化软件安全审计工具的潜力。开发者和安全团队可以借助此类工具,更早、更准地发现代码提交中引入的安全隐患,从而在软件开发生命周期(SDLC)的早期阶段阻止漏洞流入产品。这有助于降低软件安全维护成本,提升开源软件生态的整体安全性。

五、 研究亮点

  1. 创新性的方法论: 提出了首个旨在“桥接”代码与自然语言以提升LLMs漏洞识别性能的框架CLNx。其核心创新在于“关键路径选择”算法和“符号自然化”转换,能够智能地压缩和解释代码,直击LLMs理解C/C++代码的痛点。
  2. 显著的性能提升与效率优势: 实验证明,CLNx能够以远低于进一步预训练的计算开销,带来更大幅度的性能提升。仅使用结构自然化的基础BERT模型,其性能即可超越经过额外代码预训练的专门模型,这极具说服力。
  3. 轻量级与通用性: CLNx作为模型无关的中间件,不改变LLM本身架构,可以方便地与其他BERT基模型结合。其设计不要求代码可编译,适用于函数级别的漏洞分析场景,具有较好的实用性。
  4. 实证驱动的验证: 研究不仅通过严格的基准测试证明了CLNx的SOTA性能,还通过真实世界的大规模开源项目扫描,验证了其发现零日漏洞的潜力,增强了研究成果的可信度和实用价值。

六、 其他有价值的讨论

论文也坦诚地讨论了CLNx的局限性及未来工作方向。主要局限性在于其结构自然化阶段,为了最小化路径长度,在选择覆盖相同数量污染块的多条路径时,可能因选择了最短路径而丢失某些重要细节。未来的改进方向包括在关键路径选择中更深入地结合数据流分析。此外,论文也指出了外部效度的威胁,即主要关注CLNx对BERT基模型的提升,因为原始GPT类模型在此任务上表现较差。

这项由华中科技大学团队完成的研究,为解决LLMs在C/C++漏洞识别任务中的效率与效果瓶颈提供了一个优雅且高效的解决方案。CLNx框架不仅在学术上具有创新性,也为工业界的软件安全实践提供了有力的新工具,有望在软件供应链安全、DevSecOps等领域产生积极影响。

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