分享自:

大型语言模型在漏洞检测中的比较评估:从大型到巨型的演进

期刊:Network and Distributed System Security (NDSS) SymposiumDOI:10.14722/ndss.2025.241491

大型语言模型在漏洞检测中的比较评估:从大型到巨型

由Jie Lin与David Mohaisen共同完成,两人均来自University of Central Florida。这项研究预计将于2025年2月24日至28日在美国加州圣地亚哥举行的网络与分布式系统安全(NDSS)研讨会上发表,相关论文已被该研讨会接收。NDSS是网络安全领域的顶级会议之一,这标志着此项工作在该领域的重要性和前沿性。

学术背景

本研究属于软件安全与人工智能的交叉领域,具体聚焦于利用大型语言模型进行自动化漏洞检测。随着深度学习(DL)和自然语言处理(NLP)技术的进步,尤其是基于Transformer架构的大语言模型(LLMs)在代码理解和生成方面展现出强大能力,为自动化漏洞检测提供了新的可能。然而,尽管已有研究探索LLMs在漏洞分类或特定代码片段检测上的应用,但对于LLMs在真实世界场景下(如完整源文件级别的检测)、跨语言泛化能力以及不同模型参数(如模型大小、量化、上下文窗口)如何影响其检测性能,仍缺乏系统性和深入的理解。现有研究往往存在局限,例如只关注C/C++代码、评估模型范围有限、依赖外部知识库或仅使用孤立代码片段进行评估。

为此,本研究旨在填补这一研究空白,对多种先进的、主要是开源的大语言模型进行全面评估,以探究它们在Java和C/C++代码漏洞检测任务上的真实效能。研究目标包括:评估LLMs跨语言的漏洞检测与类型识别能力;量化上下文窗口大小对性能的影响;分析模型量化在效率与精度之间的权衡;考察先进模型架构是否带来性能提升;以及测试少样本学习是否能改善检测准确性。通过回答这些研究问题,本研究旨在为研究社区和开发者提供关于如何选择和配置LLMs用于漏洞检测任务的实证依据和深入见解。

详细工作流程

本研究的工作流程系统而严谨,主要包含以下几个核心步骤:

  1. 数据收集与预处理: 研究使用了两个基准数据集。对于Java语言,主要使用Vul4J数据集。该数据集源自51个开源项目的912个Java漏洞修复提交。经过自动化检索(使用OpenCVE API获取CVE/CWE描述,使用GitHub API获取源代码)、数据清理(移除空白符、换行符、注释)、人工检查和过滤(排除非Java文件)后,最终构建了包含280个Java文件的最终数据集,涵盖140对漏洞(补丁前)和非漏洞(补丁后)版本,对应74种不同的漏洞。对于C/C++语言,研究使用Big-Vul数据集来评估模型的泛化能力。经过相同的数据处理流水线后,从庞大的数据集中随机抽样出200个代码文件(100个漏洞,100个非漏洞),以保持与Java数据集规模的一致性和可比性。

  2. 模型选择与配置: 研究精心选择了来自不同家族的10种先进LLMs进行评估,包括Llama-2、CodeLlama、Llama-3、Mistral、Mixtral、Gemma、CodeGemma、Phi-2、Phi-3以及作为基准的GPT-4。选择标准基于模型的知名度、架构创新性和在NLP任务中的表现。重点评估经过指令微调(“chat”或“instruct”版本)的模型,以贴合实际交互式应用场景。研究构建了包含21种不同参数规模、38种不同配置的模型集合。关键配置变量包括:模型参数规模(从2B到70B不等)、量化方法(主要对比Q5_K_M和FP16)、上下文窗口(CW,从2048到32768 tokens)。对于GPT-4,则使用其默认配置作为参考。

  3. 实验流水线设计: 研究设计了一套标准化的实验流水线以确保评估的一致性和可重复性。核心是系统提示词,其设计为模拟一位专家Java/C++程序员,要求模型分析提供的代码并判断其是否包含漏洞,回答需简洁(“是”或“否”)并附上简要推理。研究主要采用零样本学习策略,以评估模型在不依赖任务特定微调或外部知识情况下的内在能力。在用户提示词中,会直接提供待分析的源代码。对于开源模型,统一设置温度为0.5、随机种子为42、输出令牌限制为2048,以平衡输出的确定性与灵活性,并确保结果可复现。为防止数据泄露,每次新提示前都会完全卸载并重新加载模型。

  4. 评估配置与指标: 实验主要围绕两个上下文窗口配置展开:受限CW(所有模型统一限制输入为2048 tokens,以确保公平比较)和最大CW(允许每个模型使用其最大支持的CW容量,以评估其真实潜力)。评估指标分为两大类。定制指标:由于LLM回答格式自由,研究采用人工评估,将回答分类为正确(标记为漏洞,权重1)、错误(标记为非漏洞,权重0)或不相关(未回答问题,权重-1)。由此衍生出文件级别的准确响应百分比(AP)和显式响应百分比(EP),以及漏洞ID级别的准确响应百分比(VAP)和显式响应百分比(VEP)。标准指标:在引入负样本(非漏洞代码)的评估中,使用精确率(Precision)、召回率(Recall)和F1分数(F1 Score)来全面衡量模型区分漏洞与非漏洞代码的能力。

  5. 系统性评估阶段: 整个评估按照图1所示的框架进行,主要包括:

    • 核心评估:在仅有正样本(漏洞代码)的Java数据集上,测试所有模型配置,分析模型大小、量化、CW和架构对AP/VAP、EP/VEP的影响。
    • 泛化评估
      • 正负样本检测:在包含成对漏洞/非漏洞代码的完整Java数据集上,使用零样本学习评估模型的判别能力,计算P/R/F1。
      • 跨语言评估:在C/C++数据集上重复上述过程,测试模型跨语言泛化能力。
      • 少样本学习:在系统提示词中加入少量示例(一正一负),测试其对Java和C/C++漏洞检测性能的影响。
      • 漏洞类型识别:修改提示词要求模型提供CVE ID和描述,在零样本和少样本设置下评估模型识别具体漏洞类型的能力。
      • 时间开销分析:记录不同CW和配置下的提示词评估时间和响应生成时间。

主要结果

  1. 模型对比与性能基准(仅正样本,Java): 在零样本、最大CW设置下,不同模型家族表现差异显著。Gemma家族表现最佳,特别是Gemma 2B(FP16, CW 8192)取得了最高的AP(78.57%)和VAP(93.24%)。Llama-2 70B也表现出色(AP 70.00%, VAP 82.43%)。令人意外的是,一些后续版本或专门化模型并未超越前代或基础模型,例如Llama-3的整体表现低于Llama-2;CodeLlama(专为代码设计)的AP/VAP低于Llama-2;Mixtral(Mistral的先进版本)和Phi-3的表现分别差于Mistral和Phi-2。GPT-4在此项任务中表现平庸(AP 37.86%, VAP 51.35%),排名靠后,表明某些开源模型在特定任务上可与之竞争甚至超越。在响应显式性(EP/VEP)上,GPT-4、Mixtral、CodeLlama和Llama-3等模型能达到接近100%的水平。

  2. 模型参数的影响分析:

    • 上下文窗口(CW):增大CW几乎总是能提升模型性能(AP/VAP, EP/VEP)。例如,Gemma 7B将CW从2048增至8192时,AP从32.86%大幅提升至69.29%。这验证了CW对于理解长代码上下文的重要性。
    • 量化:影响因模型而异。对于Gemma,使用更高精度的FP16量化通常比Q5_K_M获得更好的AP(例如Gemma 7B FP16 AP 77.86% > Q5_K_M 69.29%)。但对于CodeGemma和Phi家族,量化带来的性能变化不明显或呈负面。这表明需要在效率(量化)和精度之间进行针对性权衡。
    • 模型大小(参数数量):更大的模型并不总是更好。在Llama-2家族中,70B模型优于7B和13B;但在CodeLlama家族中,7B模型有时优于34B模型;Gemma 2B模型甚至经常超越更大的7B模型。这凸显了架构、训练数据等因素与参数规模存在复杂相互作用。
    • 先进架构:专为代码优化的模型(如CodeLlama, CodeGemma)并未在漏洞检测上 consistently 超越其通用基础模型(Llama-2, Gemma)。所谓的“先进”版本(如Llama-3对Llama-2,Mixtral对Mistral,Phi-3对Phi-2)在本任务中也未展现出预期的性能提升。
  3. 正负样本检测与跨语言泛化:

    • Java正负样本:在区分漏洞与非漏洞代码的任务中,Gemma 7B(FP16)取得了最佳平衡,F1分数为57.98%(精确率46.19%,召回率77.86%)。CodeGemma 7B(Q5_K_M)则具有最高的精确率(65.38%),但召回率较低(48.57%)。模型表现依然参差不齐。
    • C/C++泛化:所有模型在C/C++上的性能均显著下降。最佳模型Gemma 7B(FP16)的F1分数降至34.71%。一些模型如Llama-3 70B甚至完全失败(F1为0%)。这揭示了LLMs在跨编程语言漏洞检测方面存在重大挑战。
  4. 少样本学习的影响:结果出乎意料,少样本学习并未改善性能,反而常常导致性能显著下降。在Java任务中,Gemma 7B的F1从57.98%降至44.60%;在C/C++任务中,所有测试模型的F1均降至0%,模型表现出严重的判断偏倚或混乱。这表明对于本任务,提供的示例可能引入了噪声或挤占了本应用于分析目标代码的上下文空间,少样本学习并非有效策略。

  5. 漏洞类型识别:LLMs在识别具体漏洞类型(如提供CVE ID)方面的能力极其有限。即使在零样本设置下,表现最好的模型(如Llama-2 70B, Llama-3 8B)也仅能正确识别出140个样本中的1个漏洞类型。少样本设置也仅有微小改善。这明确了当前LLMs在细粒度安全分析方面的能力边界。

  6. 时间开销:分析显示,更大的CW会延长提示词处理时间,但会因上下文更丰富而缩短响应生成时间。更大的模型参数和更高精度的量化(如FP16)会显著增加总体处理时间。这为在实际部署中权衡速度与精度提供了参考。

结论与价值

本研究通过大规模系统性实验,得出了关于LLMs用于漏洞检测的若干重要结论:1) 潜力与变异性:LLMs确实具有用于自动化漏洞检测的潜力,特别是在Java代码上,以Gemma和Llama-2为代表的部分开源模型表现突出。然而,这种性能高度可变,没有单一模型在所有设置下都表现最佳。2) 关键影响因素上下文窗口大小是 consistently 提升性能的最关键因素。量化、模型大小和先进架构的影响则因模型家族而异,不存在普适规律。3) 当前局限性:LLMs在C/C++上的泛化能力较弱;它们难以准确识别具体漏洞类型;少样本学习在本任务中无效,甚至有害;某些新版或专门化模型并未带来预期提升。4) 开源模型的竞争力:研究表明,精心选择和配置的开源LLMs可以达到甚至超越GPT-4等顶级闭源模型在特定漏洞检测任务上的性能,这为注重数据隐私、透明度和定制化的实际应用提供了可行且强大的替代方案。

本研究的科学价值在于首次对LLMs在漏洞检测任务中的表现进行了如此全面、细致和可控的实证分析,揭示了模型各种内在特性与性能之间的复杂关系,填补了该领域的知识空白。其应用价值在于为安全研究人员和软件开发者提供了基于证据的模型选型与配置指南(例如优先选择大CW的Gemma模型,并谨慎评估量化方案),并指出了当前技术的局限性和未来需要重点改进的方向(如提升跨语言能力、探索更有效的提示策略而非简单少样本)。

研究亮点

  1. 全面性与系统性:评估涵盖5大模型家族、10种架构、21个不同参数规模的模型、38种配置,并在文件级别、跨语言(Java/C++)、正负样本、少样本、类型识别等多个维度进行测试,规模与深度前所未有。
  2. 严谨的方法论:强调零样本评估以测试模型内在能力;采用固定种子、温度、卸载重载模型等严格控制变量;结合定制指标与标准指标,并采用人工评估确保准确性。
  3. 反直觉的发现:研究揭示了多个反直觉或与常规认知不符的结果,如少样本学习效果负向、新版或专用模型不一定更好、GPT-4并非始终领先等,这些发现对领域认知具有重要修正意义。
  4. 强调开源与可复现:研究主体聚焦开源模型,并详细说明了所有配置和流程,极大地促进了结果的验证、复现和后续研究。
  5. 明确的实践指导:研究结论并非泛泛而谈,而是给出了具体、可操作的发现,例如明确指出“上下文窗口大小是性能提升的关键”,以及部分开源模型组合能达到实用水平,对工业界具有直接参考价值。

其他有价值内容

研究还讨论了使用开源模型而非闭源API的安全优势,包括数据隐私保护、模型透明度和可审计性,以及本地微调的可能性。这呼应了企业级安全应用中对数据保密性和控制权的严格要求。此外,论文的结构完整,包含了详尽的背景介绍、相关工作综述(指出了现有研究的局限性)、附录(包含数据集、指标细节、示例等),体现了高度的学术规范性。最后,研究提出的统一评估框架(设定性能阈值,将模型分类为“不可用”、“部分可用”、“可用”)为后续研究提供了一个清晰的性能 benchmarking 方法。

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