探究大语言模型在代码漏洞检测方面的应用:一项实验性研究
探究大语言模型在代码漏洞检测方面的应用:一项实验性研究
近年来,随着软件系统的复杂度增加,代码漏洞的数量也迅速增长。自动化漏洞检测已经成为企业和研究机构关注的重点。传统的漏洞检测方法依赖动态分析技术,如模糊测试(Fuzzing)和符号执行(Symbolic Execution),但这些方法需要执行代码,计算成本较高。相比之下,基于深度学习的静态分析方法仅依赖于代码本身,无需运行代码,因此在CVD领域得到了广泛应用。
研究背景
近年来,随着软件系统的复杂度增加,代码漏洞的数量也迅速增长。自动化漏洞检测已经成为企业和研究机构关注的重点。传统的漏洞检测方法依赖动态分析技术,如模糊测试(Fuzzing)和符号执行(Symbolic Execution),但这些方法需要执行代码,计算成本较高。相比之下,基于深度学习的静态分析方法仅依赖于代码本身,无需运行代码,因此在CVD领域得到了广泛应用。
早期的深度学习方法主要采用图神经网络(GNNs)和基于Transformer的预训练模型:
- 图神经网络(GNNs):如Devign,通过构造代码图(AST、CFG、PDG等)来提取漏洞特征,适用于结构化信息分析。
- 序列模型:如CodeBERT、UniXcoder,将代码视为文本序列,通过Transformer模型学习漏洞模式,适用于大规模代码分析。
近年来,大语言模型(LLMs)在自然语言处理和代码智能任务中取得了巨大成功。然而,它们在CVD任务中的潜力仍未被充分探索。本研究通过微调四种开源LLMs(Llama-2、CodeLlama、Llama-3、Llama-3.1),并在五个常见CVD数据集上进行实验,分析它们的性能表现,并与现有的基准方法进行对比。
相关工作
- 代码漏洞检测(CVD)方法:
- 动态分析方法:如模糊测试、符号执行,通过执行代码来发现漏洞。
- 静态分析方法:基于深度学习的代码漏洞检测方法,主要包括图神经网络(GNNs)和序列模型(Transformer)。
- 预训练模型在代码分析中的应用:
- 中型预训练模型(如CodeBERT、UniXcoder):在代码理解和漏洞检测任务上取得了成功,但受限于最大序列长度(512个Token)。
- 大语言模型(LLMs)(如Llama-2、CodeLlama):具备更强的长序列建模能力,但在CVD任务中的有效性尚未得到充分验证。
- 现有研究的局限性:
- 研究数据集不统一,影响不同方法的可比性。
- 很少有研究关注LLMs在长代码样本中的表现。
- 类别不平衡问题影响CVD模型的检测性能,现有研究较少讨论这一问题。
研究动机
- 统一评测环境:现有研究使用的数据集和实验环境不一致,难以比较不同方法的性能。因此,本研究统一了五个主流CVD数据集,并实现了完整的基准模型。
- 探索LLMs在CVD中的潜力:尽管LLMs在代码生成等任务中取得了成功,但它们在代码漏洞检测任务中的有效性尚未得到充分研究。
- 分析类别不平衡和代码长度的影响:CVD数据集中漏洞样本通常较少,且漏洞模式常见于长代码段。本研究设计实验量化分析这些因素对模型性能的影响。
BENCHMARK 设计
本研究针对代码漏洞检测(CVD)任务,构建了一个完整的基准测试框架,涵盖多种模型、五个广泛使用的数据集以及统一的评测标准,以确保实验的公平性和可复现性。
- 评测模型
研究者选择了三类模型进行评估:
- 图神经网络(GNN)模型:Devign、ReGVD、GraphCodeBERT,这些模型利用代码的图结构进行漏洞检测。
- 中型预训练序列模型:CodeBERT、UniXcoder,这些基于Transformer的编码器在代码分析任务中表现出色,但受限于512个Token的输入长度。
- 大语言模型(LLMs):Llama-2、CodeLlama、Llama-3、Llama-3.1,这些模型具备更强的代码理解能力,并可处理更长的代码片段。
- 数据集
实验采用五个主流CVD数据集(ReVeal、Devign、Draper、BigVul、DiverseVul),涵盖不同类型的代码漏洞,并按代码长度分为短代码(≤512 Token)和长代码(512-1024 Token),以分析代码长度对模型性能的影响。
- 评测指标
使用准确率(Acc)、精确率(Pre)、召回率(Rec)、F1分数、假阳性率(FPR)等指标全面评估模型性能,重点关注F1分数以应对数据集类别不平衡的问题。
研究实验
- 实验设置
实验环境
所有实验在 Ubuntu 20.04 服务器上运行,硬件配置包括 AMD Ryzen 24核处理器 和 NVIDIA L20(48GB)GPU,主要计算框架为 PyTorch 2.1.0,CUDA 版本为 12.1。数据集划分
研究采用ReVeal、Devign、Draper、BigVul、DiverseVul 五个数据集,并按照代码长度分为 短代码(≤512 Token) 和 长代码(512-1024 Token) 两个子集。所有数据集均按 8:1:1 的比例划分为 训练集、验证集和测试集。模型与超参数
图神经网络模型(Devign、ReGVD):输入特征维度设为200,优化器采用 Adam,学习率 1e-4,权重衰减 1e-3。
中型预训练模型(CodeBERT、UniXcoder):块大小512(短代码)/1024(长代码),优化器AdamW,学习率2e-5。
大语言模型(LLMs)(Llama-2、CodeLlama、Llama-3、Llama-3.1):采用 LoRA 低秩适配微调,关键超参数包括:秩 16,缩放因子32,Dropout 0.05,优化器 AdamW,学习率 1e-4,训练 5 轮。
评测指标
采用准确率(Acc)、精确率(Pre)、召回率(Rec)、F1分数、假阳性率(FPR) 作为评测指标,其中F1分数 作为核心评估标准,以应对数据类别不平衡的问题。
- 实验结果
本研究在五个主流代码漏洞检测(CVD)数据集 上,系统评估了三类模型(图神经网络模型、预训练序列模型、大语言模型LLMs),重点分析了类别不平衡和代码长度对模型性能的影响,并得到以下关键结论:
- 类别不平衡影响显著
- 在类别均衡的Devign数据集 上,所有模型的表现均优于其他数据集,而在类别极度不均衡的DiverseVul数据集 上,所有模型的表现均较差。
- 一些模型(如 ReGVD、Llama-2、CodeLlama)在高度不平衡数据集上,甚至出现召回率为0的情况,表明它们无法有效学习漏洞特征。
- 中型预训练模型在短代码数据集上表现优异
- 在短代码数据集上,CodeBERT和UniXcoder普遍优于LLMs,特别是在 ReVeal、Draper 和 DiverseVul 数据集上,它们的F1分数最高。
- 这表明中型Transformer预训练模型在小规模漏洞检测任务上仍具优势,尤其是在类别不均衡的情况下。
- LLMs 在长代码数据集上具有明显优势
- LLMs在长代码样本 上的表现远优于图模型和中型序列模型,主要得益于更强的长序列建模能力。
- 长代码中漏洞样本占比更高,使LLMs能更有效地学习漏洞模式。
- LLMs 假阳性率较低,检测结果更可靠
- 在大多数数据集中,LLMs假阳性率(FPR)较低,比其他模型更具实用性。
- 低FPR代表较少误报,提高了模型在实际应用中的可信度。
本研究进一步通过实验,分析了类别不平衡和代码长度对LLMs的影响,以优化其漏洞检测能力。
论文结论
本研究系统性评估了LLMs在代码漏洞检测任务中的表现,并探讨了类别不平衡和代码长度对模型性能的影响。实验结果表明,LLMs在长代码样本上的检测能力较强,但受类别不平衡问题的影响较大。未来研究可以进一步优化数据集质量,并探索更有效的微调方法来提升LLMs在CVD任务中的检测能力。
本文来自arXiv,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。