VulFewShot: 利用对比学习改进少样本漏洞分类

吴月明 张笑睿 李志 刘恺麟 邹德清 金海

吴月明, 张笑睿, 李志, 等. VulFewShot: 利用对比学习改进少样本漏洞分类 [J]. 软件学报, 2025, 36(12): 5495-5511. doi: 10.13328/j.cnki.jos.007433
引用本文: 吴月明, 张笑睿, 李志, 等. VulFewShot: 利用对比学习改进少样本漏洞分类 [J]. 软件学报, 2025, 36(12): 5495-5511. doi: 10.13328/j.cnki.jos.007433
WU Yue-Ming, ZHANG Xiao-Rui, LI Zhi, et al. VulFewShot: Improving Few-shot Vulnerability Classification by Contrastive Learning [J]. Journal of Software, 2025, 36(12): 5495-5511. doi: 10.13328/j.cnki.jos.007433
Citation: WU Yue-Ming, ZHANG Xiao-Rui, LI Zhi, et al. VulFewShot: Improving Few-shot Vulnerability Classification by Contrastive Learning [J]. Journal of Software, 2025, 36(12): 5495-5511. doi: 10.13328/j.cnki.jos.007433

VulFewShot: 利用对比学习改进少样本漏洞分类

doi: 10.13328/j.cnki.jos.007433
基金项目: 国家自然科学基金(62202191).
详细信息
    作者简介:

    吴月明(1993-), 男, 博士, 主要研究领域为移动安全, 软件供应链安全, 人工智能安全, 恶意软件分析, 漏洞分析, 克隆代码审计;

    张笑睿(2000-), 男, 博士生, 主要研究领域为软件安全, 物联网安全, 协议安全;

    李志(1994-), 男, 博士, 副教授, CCF专业会员, 主要研究领域为云原生安全, 系统安全, 容器安全, 云黑产;

    刘恺麟(2000-), 男, 博士生, 主要研究领域为软件安全, 系统安全, 协议安全;

    邹德清(1975-), 男, 博士, 教授, 博士生导师, 主要研究领域为云计算安全, 网络攻防与漏洞检测, 软件定义安全与主动防御, 大数据安全与人工智能安全, 容错计算;

    金海(1966-), 男, 博士, 教授, 博士生导师, CCF会士, 主要研究领域为计算机系统结构, 虚拟化技术, 集群计算, 网格计算, 并行与分布式计算, 对等计算普适计算, 语义网, 存储与安全.

    通讯作者:

    李志, E-mail: lizhi16@hust.edu.cn.

  • 中图分类号: TP311

VulFewShot: Improving Few-shot Vulnerability Classification by Contrastive Learning

  • 摘要: 为了对漏洞进行细粒度检测, 理想的模型必须确定软件是否包含漏洞, 并确定漏洞的类型(即进行漏洞分类). 一系列深度学习模型在漏洞分类任务中取得了良好的整体性能. 然而, 观察到不同漏洞类型之间存在严重的数据不平衡. 许多漏洞类型只有少量的漏洞样本(称为少样本类型), 这导致了对少样本类型的分类性能和泛化能力较差. 为了提高少样本漏洞类型的分类性能, 实现VulFewShot. 这种基于对比学习的漏洞分类框架通过使相同类型的漏洞样本“接近”, 同时使不同类型的漏洞样本彼此“远离”, 从而为仅有少数漏洞样本类型赋予了更多的权重. 实验结果表明, VulFewShot可以提高对所有类型漏洞的分类性能. 类型包含的漏洞样本数量越少, 改进就越显著. 因此, VulFewShot可以提高样本不足的漏洞的分类性能, 并减少样本量对学习过程的影响.

     

    Abstract: To perform fine-grained vulnerability detection, an ideal model must determine whether software contains vulnerabilities and identify the type of vulnerability (i.e., perform vulnerability classification). A series of deep learning models have demonstrated strong overall performance in vulnerability classification tasks. However, a severe data imbalance exists across different vulnerability types. Many vulnerability types are represented by only a small number of samples (referred to as few-shot types in this study), resulting in poor classification performance and generalization for these few-shot types. To enhance classification performance for these types, VulFewShot is proposed. This contrastive learning-based vulnerability classification framework assigns more weight to few-shot types by bringing samples of the same type closer together while keeping samples from different types further apart. Experimental results show that VulFewShot improves classification performance across all vulnerability types. The smaller the number of samples for a given type, the more significant the improvement. Therefore, VulFewShot improves classification performance for vulnerabilities with limited samples and mitigates the impact of sample size on the learning process.

     

  • 如今各种网络攻击层出不穷, 一系列事件表明漏洞是大多数的网络攻击主要原因[1,2]. 在实践中, 软件的设计缺陷使得漏洞在软件变得更加复杂的同时也更难以预防[3]. 因此, 以自动化、高效且准确的方式检测出软件漏洞是至关重要的. 目前已有多种方法被用于检测软件漏洞. 传统的检测方法基于人工定义的规则或特征对漏洞的描述[48], 这些方法对许多类型的漏洞都很有效但高度依赖人类专家的经验, 并不可避免地可能遇到大量的误报和漏报[9]. 为了减少专家工作量, 基于机器学习的检测方法被提出来自动学习和识别漏洞的特征[10,11]. 深度学习是相对于机器学习的突破性技术, 它在漏洞检测中得到了广泛应用, 这些应用包括利用卷积神经网络(CNN)[1215]、长短期记忆网络(LSTM)[1618]等模型来提取漏洞的特征.

    目前基于深度学习的漏洞检测方法更多的是采用二分类的方法检测一段代码是否包含漏洞[14,16,17,1922]. 但在实际操作中, 识别漏洞类型也是调查漏洞产生原因并修复漏洞的必要手段. 在这种情况下漏洞检测自然会利用多分类方法对漏洞进行分类. µVulDeePecker是一种最先进的多分类系统, 它使用由3个BiLSTM网络块组成的神经网络对漏洞进行分类[23]. 根据他们论文的结果, 它在漏洞类型分类方面可以取得理想的性能.

    但是根据我们的统计显示, 这些数据集中不同类型漏洞的数量是严重不平衡的. 在重新评估µVulDeePecker之后我们发现随着漏洞样本数量的减少, 不同漏洞类型的分类性能会随之下降使得预防工作无效[24,25]. 在此结果上继续评估了CNN、BiGRU、BiLSTM和Atten-BiLSTM等多个其他深度学习模型在漏洞分类任务上的效果, 发现漏洞样本数量不平衡问题使得这些模型的分类性能依旧较差. 为了进一步研究性能较差的背后是否有其他的因素存在, 我们在MVD数据集的基础上构建了一个更平衡且更符合少样本特征的数据集MVD-part. 实验表明在少样本数据集中分类性能较差的问题依然存在.

    为了缓解分类性能较差的问题, 少样本漏洞类型中该问题尤为明显, 我们将对比学习引入到漏洞分类任务中. 具体来说, 利用有监督的对比学习设计了一个新颖的训练过程, 该过程使得同一类型的漏洞样本之间相互“接近”, 同时使得不同类型的漏洞样本彼此“远离”, 从而更好地从少样本中提取出漏洞特征. 基于此训练过程, 我们实现了基于对比学习的漏洞分类框架VulFewShot, 并在MVD[23]和MVD-part数据上对该框架进行评估. 实验结果表明, 使用对比学习可以提升不同样本规模的各类漏洞的分类性能, 该提升在少样本的漏洞分类上提升尤为明显. 因此VulFewShot在分类性能方面弥合了大规模和小规模样本数量漏洞类型之间的差距.

    综上所述, 本文做出了以下贡献.

    (1) 全面分析了漏洞数据集中样本不平衡问题以及该问题对漏洞分类性能, 特别是少样本学习场景下的影响.

    (2) 用对比学习提高了不同样本规模的漏洞分类性能, 尤其是少样本漏洞类型的分类性能.

    (3) 设计并实现了VulFewShot (代码已发布在https://github.com/VulFewShot/VulFewShot), 这是一个基于对比学习的漏洞分类框架. 同时对4种深度学习模型(CNN、BiGRU、BiLSTM和Atten-BiLSTM)进行了广泛实验, 证明了对比学习确实带来了改进.

    本文第1节介绍相关工作. 第2节描述漏洞分类的过程. 第3节介绍传统深度学习模型的分类性能. 第4节介绍使用对比学习框架后模型的分类性能. 第5节讨论关键的潜在威胁. 第6节对本文总结并展望未来的工作.

    目前基于深度学习的漏洞分类研究主要有两类, 分别是: 二分类[14,16,17,1922]和多分类[23,2628]. 我们的研究集中在后者上.

    深度学习模型以向量作为输入, 因此在使用这些模型时首先需要提取漏洞程序的特征向量表示. 提取特征向量的过程主要包括两个步骤: 第1步是对漏洞程序的数据进行静态处理(例如删除注释、提取片段、归一化等), 第2步是生成代码嵌入(即将第1步获得的数据转换为向量表示). 研究人员提出了不同的方法来处理第1步中的数据, 一种简单的方法是直接删除注释并规范化[22,29,30]. 也有方法专注于使用抽象语法树[31]或函数调用[32]来提取特定特征. 一些其他方法可能在代码分析工具如Joern[33]的帮助下构建程序依赖图(PDG)[34]或系统依赖图(SDG)[35]. 在第2步中, 除了有使用包括Word2Vec、GloVe和FastText[16,20,23]在内的一些主流嵌入方法, 也出现了一些新的具有不同特长方法. 例如基于图像的嵌入方法可以辅助对漏洞的视觉识别[22], 而基于CodeBERT的嵌入方法更适合下游任务[29]以及基于图的嵌入可以更好地描述代码连接[30,36]. μVulDeePecker[23]是一个使用最先进技术的多分类漏洞分类系统, 它为数据处理和开源数据集提供了一种经过验证的方法论. 因此我们遵循了μVulDeePecker的数据处理和向量表示方法, 并在其构建的数据集上进行了实验.

    受不同漏洞类型之间严重的数据不平衡的启发, 我们引入对比学习来增强当前在少样本类型的漏洞上的分类性能. 自Mikolov等人[37]将对比学习引入自然语言处理(NLP)以来, 对比学习已逐步应用于图像、语音和视频等其他领域[3850]. 例如, SimCLR[50]是将对比学习应用于图像分类任务的典型工作. 在之前的大多数研究中, 对比学习主要用于自监督学习. Khosla等人[51]将对比学习方法扩展到监督学习, 他们通过对比训练数据的标签信息来提高分类性能. Wu等人 [52]将对比学习引入到Android恶意软件分类中, 这有助于减少混淆性差异, 同时增大了恶意软件和良性应用程序之间的区别. Gunel等人[53]将监督对比学习应用于文本分类任务, 在交叉熵损失的基础上增加了一个额外的监督对比学习损失函数(SCL). 新设计的损失函数使同一类样本更靠近, 同时使得不同类别的样本之间距离更远. 他们还通过实验证实了对比学习可以带来少样本学习场景的巨大改进, 这给了我们一些启示. 我们的实验结果表明, 对比学习方法可以提高整体性能和在不同规模的漏洞类型上的表现, 尤其是在少样本类型上.

    图1展示了漏洞分类的一般过程, 该过程一般包含3个步骤: 数据预处理、向量提取和模型训练/预测. 在数据预处理中, 漏洞样本会被提取为代码片段并根据预先定义的代码标签进一步提取为标准化函数片段. 在向量提取中, 标准化的函数片段会被转化为向量表示. 最后在模型训练/预测阶段, 一部分漏洞样本对应的特征向量将被用作输入训练用于分类任务的深度学习模型, 深度学习模型使用训练阶段未使用的漏洞样本进行测试, 并根据第2.3节中的评估指标进行评估.

    图  1  漏洞分类的一般过程
    下载: 全尺寸图片

    为了完成漏洞检测或分类任务, 各种深度学习架构被用于在漏洞特征的不同表示中进行学习. 我们主要考虑使用卷积神经网络(CNN)[1215,22]和循环神经网络(RNN), 包括长短期记忆(LSTM)及其一些变体[16,20,23,54,55]. 现有相关工作绝大多数是二分类工具, 多分类工具很少. 在二分类工具当中, 绝大多数模型都采用了CNN (如VulCNN[22])、BiLSTM (如VulDeePecker[16])或BiGRU (如SySeVR[20]); 而多分类工具同样如此, 如经典的多分类工具µVulDeePecker就采用了BiLSTM模型[23]. 因此, 我们选择CNN、双向长短期记忆(BiLSTM)[16,23]、双向门循环单元(BiGRU[20])和基于注意力的双向长短期记忆(Atten-BiLSTM[56])作为实验模型.

    CNN是一种具有人工神经元的前馈神经网络, 包括卷积层、全连接层、关联权值层和池化层, 这使得CNN可以利用输入数据的二维结构. CNN在计算机视觉领域取得了很好的效果, 也可以应用于文本分类. 在这个实验中, CNN将Word2Vec标记的代码片段作为输入, 然后将标记向量在一个层中进行卷积. 在另一层进行最大池化后, 最终输出会连接到Softmax函数来完成分类任务. VulCNN采用这种模型用于二分类漏洞检测[22].

    RNN模型由于其自身的结构特点, 可以有效地学习历史和位置信息, 解决了远程依赖问题. LSTM是RNN的一种改进模型, 通过引入遗忘门、更新门和输出门来控制信息流, 有效地缓解了梯度消失问题. 它使用单元状态来表示每个时间节点的信息. 作为文本分类器使用时, LSTM可以有效地捕捉文本上下文词之间的关联属性, 并利用遗忘门结构过滤无效信息. 然而, LSTM是单向的[57]. 由于在漏洞分类任务中需要同时考虑上文和下文的影响, 所以采用BiLSTM作为实验模型之一, VulDeePecker和µVulDeePecker也采用了这种模型[16,23].

    RNN的另一个变体是GRU, 它比LSTM具有更少的内部门控和更少的参数, 但可以实现类似的功能. GRU也被安排在未来VulDeePecker的实验比较工作中. BiGRU是SySeVR所采用的模型[20], 同时基于前面提到的同样原因, 我们将BiGRU作为实验模型之一.

    此外, 传统的RNN模型倾向于截取或扩展向量表示的输入序列到固定长度, 这限制了解码过程, 特别是对于相对较长的输入序列[58]. 注意力机制通过保留BiLSTM编码器的中间输出, 在模型训练过程中选择性地从输入中学习, 并将它们与输出相关联. 使用注意力机制打破了传统模型中编码器和解码器的固定长度限制, 从而提高了实验性能. 因此, 我们也选择了基于注意力的双向长-短时记忆(Atten-BiLSTM)作为实验模型之一.

    传统的深度学习模型以一批向量表示作为输入, 输出漏洞样本的类型标签. 在本文中, 使用两种方法训练的模型进行实验: 通过交叉熵微调的传统深度学习模型(参见第3.1节)与使用对比学习框架训练的模型(参见第4.1节). 从整体性能和不同规模的漏洞类型上比较了两个数据集的性能.

    我们在µVulDeePecker的开源数据集MVD上进行实验, 该数据集共收集了43119个漏洞样本, 涵盖了国家漏洞数据库(NVD)[59]和软件保障参考数据集(SARD)[60]中的40种漏洞类型. MVD数据集包含了处理过的代码片段及其对应的标签. 虽然数据预处理已经在图1的步骤2中进行, 我们仍然需要对代码进行规范化. 规范化过程主要包括3个步骤: 步骤1是从代码片段文本中删除非ASCII字符和注释, 因为它们与漏洞无关. 第2步是在符号名称(例如“VAR1”“VAR2”)和用户定义变量之间应用一对一的映射. 第3步是在符号名称(如“FUN1”“FUN2”)和用户定义函数之间应用一对一的映射. 之后, 对数据集进行合并和去重, 得到一个包含41660个漏洞样本的MVD数据集, 涵盖40种漏洞类型.

    我们对MVD中的漏洞类型标签进行了统计分析. 不同类型漏洞样本数量的分布情况, 从大到小排序, 如图2所示. 图中横轴表示不同的漏洞类型(未标记), 纵轴表示对应类型的漏洞样本数量. 可以看到, 不同漏洞类型的大小符合长尾幂律分布, 这表明数据集中漏洞类型的样本数量之间存在严重的数据不平衡. 具体来说, 缓冲区溢出是数量最大的漏洞类型(包含了CWE122, CWE121, CWE124, CWE127, CWE680, CWE126, CWE416和CWE123), 它有17872个漏洞样本, 而最小的是由于调用方不正确的遵循规范导致的共享资源同步错误(包含了CWE662和CWE573), 它只有6个漏洞样本.

    图  2  不同类型漏洞的数量分布
    下载: 全尺寸图片

    为了更全面地研究少样本漏洞类型所造成的影响, 我们在MVD的基础上构建了一个MVD-part数据集, 该数据集更加平衡, 更符合传统的少样本特征. 在构建该数据集时不能简单地将所有漏洞类型样本数量降采样到和原始数据集中样本最少的漏洞类型数量一样, 因为这样新数据集将会丢失原始样本数量大小关系. 相反, 对于不同的类型大小, 我们采用分层的降采样策略[61,62]. 具体来说, 由于漏洞类型的第1个1/3区域的样本数量均在400以上, 第2个1/3区域的均在80以上, 因此将样本数量在400以上的漏洞类型视为大规模类型, 样本数量在80–400之间的漏洞类型视为中等规模类型, 样本数量小于80的漏洞类型视为小规模类型. 基于这些定义, 我们将40种漏洞类型相对平均地划分为大、中、小规模类型, 不同的规模类型分别包括13、13、14种不同的漏洞类型.

    在MVD数据集中, 不同漏洞类型样本数量的不平衡会影响传统深度学习模型中的学习过程. 因此在MVD-part中采用了上述划分方式通过控制变量法减少了样本数量对学习过程的影响, 使我们更容易探索不同模型对不同漏洞类型的分类性能. 然后将每个大规模的漏洞类型样本数量降采样到400个, 每个中等规模的漏洞类型样本数量降采样到80个而小规模漏洞类型的样本在被完整保留的同时, 若样本总数不足10个, 则会通过随机复制样本的方法将样本数量补足为10个. 最终获得的MVD-part数据集中样本总数占MVD样本总数的16.16%, 其中大规模样本占77.00%, 中等规模样本占15.40%而小规模样本占7.59%. MVD-part相较于小规模样本仅占据1.23%的MVD数据集平衡得多.

    我们没有按漏洞样本数量的固定百分比进行降采样, 因为这样会使得一些大规模类型转换为中等规模类型, 一些中等规模类型转换为小规模类型. 这会导致我们虽然能比较整体性能, 但是由于这种降采样会使得MVD-part与MVD数据集的大/中/小规模漏洞类型集合不同而无法在同一漏洞类型的尺度上比较MVD和MVD-part的结果.

    本文参考了μVulDeePecker[23]中使用的评价指标以及针对不同规模类型的几个指标来评估模型的分类性能. 请注意, 所有的指标均为值的百分比. 本文用N表示样本总数, $ {\mathit{FP{R}}_i} $$ {W_i} $$ FN{R_i} $$ F{1 _i} $$ {\mathit{ST{D}}_i} $分别表示第i个漏洞类型的M_F1的假阳性率、权重、假阴性率、F1分数和标准差值. 其中$ {W_i} $范围为0–1, 由样本数量决定, 其总和为1. 度量标准如下.

    M_FPR (根据10路交叉验证的漏洞类型总数得到的假阳性率的多分类对应值的平均值). M_FPR的计算公式如公式(1)所示:

    $$ M\_{\mathit{FPR}} = (1/N) \times \sum\limits_{i = 1}^N {{\mathit{FP{R}}_i}} $$ (1)

    W_FPR (根据10路交叉验证的每个漏洞类型数量计算的权重得到的假阳性率的多分类对应值的平均值). W_FPR的计算公式如公式(2)所示:

    $$ W\_{\mathit{FPR}} = \sum\limits_{i = 1}^N {({W_i} \times {\mathit{FP{R}}_i})} $$ (2)

    M_FNR (根据10路交叉验证的漏洞类型总数得到的假阴性率的多分类对应值的平均值). M_FNR的计算公式如公式(3)所示:

    $$ M\_{\mathit{FNR}} = (1/N) \times \sum\limits_{i = 1}^N {{\mathit{FN{R}}_i}} $$ (3)

    W_FNR (根据10路交叉验证的每个漏洞类型数量计算的权重得到的假阴性率的多分类对应值的平均值). W_FNR的计算公式如公式(4)所示:

    $$ W\_{\mathit{FNR}} = \sum\limits_{i = 1}^N {({W_i} \times {\mathit{FN{R}}_i})} $$ (4)

    M_F1 (根据10路交叉验证的漏洞类型总数得到的F1度量的多分类对应值的平均值). M_F1的计算公式如公式(5)所示:

    $$ M\_F1 = (1/N) \times \sum\limits_{i = 1}^N {F{1_i}} $$ (5)

    W_F1 (根据10路交叉验证的每个漏洞类型数量计算的权重得到的F1度量的多分类对应值的平均值). W_F1的计算公式如公式(6)所示:

    $$ W\_F1 = \sum\limits_{i = 1}^N {({W_i} \times F{1_i})} $$ (6)

    Mean_L (M_F1值在10路交叉验证里大规模漏洞类型上的平均值).

    Mean_M (M_F1值在10路交叉验证里中规模漏洞类型上的平均值).

    Mean_S (M_F1值在10路交叉验证里小规模漏洞类型上的平均值). 我们用Mean来表示Mean_LMean_MMean_S, Mean的计算公式如公式(7)所示:

    $$ Mean = (1/N) \times \sum\limits_{i = 1}^N {M\_F{1_i}} $$ (7)

    STD_L (M_F1值在10路交叉验证里大规模漏洞类型上的标准偏差值的平均值).

    STD_M (M_F1值在10路交叉验证里中规模漏洞类型上的标准偏差值的平均值).

    STD_S (M_F1值在10路交叉验证里小规模漏洞类型上的标准偏差值的平均值). 我们用STD来表示STD_L, STD_MSTD_S, STD的计算公式如公式(8)所示:

    $$ {\mathit{STD}} = (1/N) \times \sum\limits_{i = 1}^N {\sqrt {\sum\limits_{j = 1}^{10} {{{(F{1_{ij}} - Mean)}^2}/9} } } $$ (8)

    在本节中, 分别使用4种传统的深度学习模型(CNN、BiGRU、BiLSTM和Atten-BiLSTM)在MVD和MVD-part数据集上进行了实验. 研究了它们的整体性能以及在大、中、小规模的漏洞类型上的性能. 结果表明, 尽管模型在MVD和MVD-part数据集上的总体性能令人满意, 但其性能从大到小依次下降.

    实验中使用了10路交叉验证方法. N个样本(N≥10)的漏洞类型被随机分成10个大小相同的子集. 而切分剩余的样本则随机分散到10个子集中(每个子集1个). 对于具有N个漏洞样本(N<10)的小规模类型, 首先利用留一法获得只有N路的交叉验证数据, 然后从这N路中随机选择10–N次并每次进行复制. 通过这样的方式得到了小规模漏洞类型的10路交叉验证数据. 这样可以保证测试数据中的每个漏洞类型至少包含一个样本. 在10路交叉验证数据中, 9个子集将用于训练, 1个子集将用于整个实验的测试.

    在10路交叉验证的实验中, 我们使用了网格探索策略[63]对模型超参数进行优化. 之后根据这些不同超参数组合在前3组实验中的平均表现选择了最佳的组合, 并将该超参数组合应用到了后续实验中. 表1展示了本文在CNN模型中所使用的参数.

    表  1  CNN使用的参数
    参数名 配置
    损失函数
    滤波器尺寸
    滤波器数量
    激活函数
    池化层策略
    优化策略
    批量大小
    学习率
    交叉熵损失函数
    (2, 3, 4)
    256
    ReLU
    最大池化
    Adam
    32
    0.00002

    表2则展示了本文在包括BiGRU、BiLSTM和Atten-BiLSTM等在内的RNN模型中所使用的参数. 使用Adam优化算法以及0.00002的学习率训练所有的4种传统深度学习模型[64]. 在模型训练好后, 不再修改这些模型的参数, 并使用这些模型进行漏洞分类任务.

    表  2  BiGRU, BiLSTM和Atten-BiLSTM使用的参数
    参数名配置
    损失函数
    激活函数
    层数
    优化策略
    批量大小
    学习率
    交叉熵损失函数
    tanh
    2
    Adam
    32
    0.00002

    为了评估传统深度学习模型在少样本漏洞类型上的分类性能, 本文研究了以下两个问题.

    • RQ1: 传统深度学习模型在MVD和MVD-part数据集上的整体性能如何?

    • RQ2: 4种传统模型在MVD和MVD-part数据集上的大、中、小规模漏洞类型上的表现如何?

    3.3.1   RQ1

    4种传统深度学习模型在MVD和MVD-part数据集上的实验结果总结如表3所示.

    表  3  传统深度学习模型在MVD和MVD-part数据集上各性能指标表现
    数据集 模型 M_FPR M_FNR M_F1 W_FPR W_FNR W_F1 Mean_L Mean_M Mean_S STD_L STD_M STD_S
    MVD CNN 0.015 3.020 97.582 0.113 0.494 99.493 99.182 98.982 94.797 1.466 2.330 16.824
    BiGRU 0.018 4.046 96.694 0.090 0.638 99.348 99.006 99.463 92.904 1.476 2.138 17.153
    BiLSTM 0.020 4.775 95.957 0.115 0.662 99.317 99.026 98.528 90.721 1.520 2.233 19.086
    Atten-BiLSTM 0.014 2.824 97.621 0.066 0.503 99.487 99.169 98.797 95.092 1.338 2.137 16.281
    MVD-part CNN 0.054 2.959 96.818 0.104 2.058 97.910 97.920 98.594 94.145 2.291 4.161 17.402
    BiGRU 0.119 6.751 92.579 0.191 4.557 95.410 96.090 94.412 87.616 3.619 7.120 23.217
    BiLSTM 0.141 8.555 91.493 0.242 5.390 94.572 95.380 93.739 85.797 4.622 7.903 23.602
    Atten-BiLSTM 0.117 5.786 93.960 0.201 4.460 95.537 95.925 96.329 89.936 4.186 6.656 17.895

    数据显示, CNN的综合性能最好, 其次是Atten-BiLSTM, 再次是BiGRU, BiLSTM表现最差. 为了更好地展示模型在MVD和MVD-part上的性能, 我们以M_F1作为主要评价标准, 并在图3中绘制了箱型图以便更直观地表示.

    图  3  传统深度学习模型在MVD和MVD-part上的总体性能
    下载: 全尺寸图片

    图3所示, 4种模型在MVD上的表现都优于MVD-part, 这证明传统的深度学习模型依赖于具有足够样本的训练集, 因此在少样本漏洞类型的分类上表现不佳. CNN的diff最小, 而BiLSTM的diff最大, 这进一步证实了我们对模型的评估. BiLSTM的最差表现符合我们的预期, 因为BiGRU和Atten-BiLSTM都是基于BiLSTM的改进模型.

    综上所述, 对于漏洞分类任务, 4种传统深度学习模型在MVD和MVD-part数据集上都取得了较好的性能, 但是他们在MVD-part的表现较差.

    3.3.2   RQ2

    图4分别展示了4种深度学习模型在MVD和MVD-part数据集上对大、中、小规模漏洞类型的性能. 我们以M_F1分数作为评价标准, 代表模型在所有类型上的性能的平均值. 图4显示每个模型的M_F1分数从大型到小型漏洞类型均在稳步下降. 由表3可知, 4个模型的平均M_F1分数在MVD上由大到中型下降0.40%, 由中到小型下降5.31%. MVD-part下降幅度更大, 大到中型下降0.56%, 中到小型下降6.40%. 可以观察到, 对于大规模漏洞类型, 在10个交叉验证集中, M_F1值的下降幅度较小. 同时, 中小规模的漏洞类型下降幅度更大. 这一现象表明, 模型在大规模类型上具有较好的泛化能力, 但在少样本漏洞类型进行分类时表现不佳.

    图  4  MVD和MVD-part数据集上传统深度学习模型在不同漏洞类型规模上的性能
    下载: 全尺寸图片

    通过进一步的比较, 我们发现这4个模型在两个数据集上的大规模漏洞类型上具有非常相似的M_F1值, 这意味着MVD-part数据集的降采样对大规模漏洞类型的检测性能几乎没有影响. 但对于中等规模的漏洞类型, 4个模型中的3个在MVD-part数据集上的表现更差. 而对于小规模的漏洞类型, 4个模型中的两个在MVD部分数据集上表现较差, 而其他两个则有所改善.

    理论上, 在MVD-part数据集中, 小规模类型的样本受到大规模和中等规模类型的影响更小, 这使我们更容易捕捉它们的特征, 从而提高性能. 然而通过图4可以观察到在大规模漏洞类型的10组交叉验证中, M_F1值的变化较小, 而在小规模和中等规模的漏洞类型中, 变化较大. 这一现象表明传统模型只在较大的类型尺度上具有较好的泛化能力. 通过查看具体数据, 可以发现MVD和MVD-part的标准偏差(STD)值从大型到中型分别增长0.76%和2.78%, 从中型到小型分别增长15.13%和14.07%. 且中小规模类型上许多M_F1值的STD大于0.3, 最低的M_F1值为0, 最高的为1, 这进一步表明在更平衡的数据集上, 传统模型在少样本类型上的较差性能并没有改善.

    综上所述, 在漏洞分类任务上, 4种传统深度学习模型在不同规模的漏洞类型上表现不一致, 且在MVD和MVD-part数据集上其性能表现从大规模到小规模类型上均依次下降.

    为了解决第3节中暴露的对少样本漏洞类型分类性能差的挑战, 在本节中提出了基于对比学习的漏洞分类框架VulFewShot. 比较了传统模型和使用VulFewShot框架在MVD和MVD-part数据集上训练的模型的整体性能. 还分别比较了它们在大、中、小规模漏洞类型上的性能. 实验结果表明, 使用VulFewShot框架训练的模型在少样本漏洞类型上优于传统深度学习模型, 从而进一步提高了整体分类性能. 通过比较MVD-part的性能, 本文展示了对比学习在漏洞分类任务中对少样本学习的巨大改进.

    在本节中, 将介绍基于对比学习的漏洞分类框架VulFewShot.

    4.1.1   概 述

    图5所示, VulFewShot由两个主要阶段组成: 训练和分类阶段. 训练阶段的目的是训练出一个性能良好的分类模型. 这个阶段由以下3个步骤组成. (1)代码静态分析: 该步骤旨在从漏洞样本中提取代码片段, 对代码片段进行标注和归一化. (2)向量提取: 该步骤旨在将规范化的代码片段转化为向量表示. (3)基于对比学习的模型训练: 这一步使用上一步的向量表示, 通过对比学习的方式对传统深度学习模型进行微调, 训练出准确的分类模型. 其中, 对比学习旨在最大化相似数据之间的相似度并最小化不相似数据的相似度. 这里我们并未使用数据增强来生成新样本与原始样本对比, 而是将训练中不同轮次中的相同漏洞样本类型作为对比, 具体的方法将在第4.1.3节进行介绍.

    图  5  VulFewShot的系统概述
    下载: 全尺寸图片

    分类阶段的目标是将未标记的漏洞分类为相应的类型. 该阶段包括以下3个步骤: (1)代码静态分析, (2)向量提取, (3)漏洞分类. 前两步的执行方式与训练阶段完全相同. 第3步应用从对比学习框架中训练出来已固定参数的模型对漏洞进行分类, 然后将一批未标记漏洞样本的向量表示作为输入, 输出相应的类型标签.

    4.1.2   代码静态分析&向量提取

    正如第2.2节和图1所示, 在µVulDeePecker中按照代码静态分析和向量提取的步骤处理数据. 首先, 从代码片段文本中删除无关的非ASCII字符和注释. 其次, 在符号名称和代码之间应用一对一的映射, 包括“VAR”到变量, “FUN”到函数, “STR”或“NUM”到常量等. 最后, 我们生成一个序列化文件, 该文件包含3类信息: 代码片段、代码标签和规范化后的代码片段. 其中代码标签来自µVulDeePecker.

    在向量提取的步骤中, 将规范化的代码片段转换为固定长度的向量. 转换是通过在µVulDeePecker中使用的一个简单的词嵌入实现的. 这些向量是训练模型的输入.

    4.1.3   基于对比学习的模型训练

    在日常生活中, 孩子们只需要几张动物图片就能识别出动物之间的差异[65]. 人类在只提供少量样本的情况下, 往往会在比较不同类别样本的同时寻求同一类别样本之间的相似性, 这使我们能够捕捉到物体的高级特征, 从而将其与其他物体区分开来.

    在这种学习策略的启发下, 我们假设基于对比学习的损失可以驱动模型提取样本的更高级特征. 这样, 模型可以通过更少的样本实现更好的性能, 这可能有助于改善在少样本的漏洞类型上较差的分类性能以及在保证良好的性能的同时最小化时间和计算资源的投入. 因此, 本文提出了一种基于监督对比学习的模型训练框架, 使相同类型的漏洞样本更紧密地聚集在一起, 同时使不同类型的漏洞样本彼此远离.

    对比学习已经在许多方面得到了应用, 包括图像、语音和视频[3850]. 它们倾向于用不同的增强方法扩展样本, 并将增强样本作为与原始样本的比较项. 然而, 与这些方法不同的是, 我们并不进行数据增强. 相反, 如图6所示, 我们将漏洞类型相同但位于不同训练轮次中的样本作为比较对象.

    图  6  VulFewShot中的监督对比学习
    下载: 全尺寸图片

    具体来说, 对于具有T类对象和批量大小为N的漏洞分类任务, 将一个批量大小的训练示例$ {\left\{ {{v_i}, {l_i}} \right\}_{i = 1, \ldots, N}} $称为$ \mathfrak{B} $, 其中$ {v_i} $表示$ \mathfrak{B} $中第i个漏洞样本的输入向量表示, $ {l_i} $表示对应的标签. $ {l_{i, t}} $表示标签类型, $ {\hat l_{i, t}} $表示第i个漏洞样本的模型输出属于类型t的概率. 交叉熵(CE)损失$ {\mathcal{L}_{{\mathrm{CE}}}} $可以定义为公式(9):

    $$ {\mathcal{L}_{{\mathrm{CE}}}} = - \frac{1}{N}\sum\limits_{i = 1}^N {\sum\limits_{t = 1}^T {{l_{i, t}}} } \cdot \log {\hat l_{i, t}} $$ (9)

    然后本文生成了一个比较数据集$ {\left\{ {{v'_i}, {l_i}} \right\}_{i = 1, \ldots, N}} $称为$ {\mathfrak{B}^\mathfrak{c}} $, 其中$ {v'_i} $表示训练数据集中与$ {v'_i} $标签相同但在$ \mathfrak{B} $中不相同的漏洞样本的向量表示. 将两个数据集合并在一起, 得到$ {\mathfrak{B}^\mathfrak{a}} = \mathfrak{B} \cup {\mathfrak{B}^\mathfrak{c}} $作为训练批次.

    图6所示, 本文的对比学习框架的目标是最大化具有相同类型标签的漏洞样本之间的相似性, 最小化不同类型样本之间的相似性. 对于$ {\mathfrak{B}^\mathfrak{a}} $中的$ {v'_i} $, 我们借鉴了SimCLR的思路[50], 尝试通过最小化公式(10)所表示的标准化温度范围交叉熵损失${\mathcal{L}_i}$来使其与相同标签项的距离更近, 与不同标签项的距离更远. 然后对$ {\mathfrak{B}^\mathfrak{a}} $中所有样本的监督对比学习(SupCon)损失$ {\mathcal{L}_{{\mathrm{SupCon}}}} $进行加权平均, 其定义为公式(11), $ {N_{{l_i}}} $表示批次中与$ {l_i} $具有相同标签的样本总数:

    $$ {\mathcal{L}_i} = - \sum\limits_{j = 1}^{2N} {{{\mathbf{1}}_{i \ne j}}} {{\mathbf{1}}_{{l_i} = {l_j}}}\log \frac{{\exp \left( {\Phi \left( {{v_i}} \right) \cdot \Phi \left( {{v_j}} \right)/\tau } \right)}}{{\displaystyle\sum\limits_{k = 1}^{2N} {{{\mathbf{1}}_{i \ne k}}} \exp \left( {\Phi \left( {{v_i}} \right) \cdot \Phi \left( {{v_k}} \right)/\tau } \right)}} $$ (10)

    其中, $ \Phi \left( \cdot \right) $表示由深度学习构建的编码器, 输出在最终的Softmax操作之前已经过L2范数归一化的最后一个密集层, $ \tau $表示控制类分离的温度参数.

    $$ {\mathcal{L}_{{\mathrm{SupCon}}}} = \sum\limits_{i = 1}^{2N} {\frac{1}{{{N_{{l_i}}} - 1}}} {\mathcal{L}_i} $$ (11)

    综上所述, 总体客观损失$ {\mathcal{L}_{{\mathrm{All}}}} $的定义为公式(12):

    $$ {\mathcal{L}_{{\mathrm{All}}}} = \eta {\mathcal{L}_{{\mathrm{CE}}}} + \left( {1 - \eta } \right){\mathcal{L}_{{\mathrm{SupCon}}}} $$ (12)

    $ {\mathcal{L}_{{\mathrm{CE}}}} $在公式(9)中定义, $ {\mathcal{L}_{{\mathrm{SupCon}}}} $在公式(11)中定义, 我们使用$ \eta $作为标量加权超参数, 以保持交叉熵损失和监督对比损失的平衡.

    4.1.4   漏洞类型分类

    在训练阶段结束后, 可以获得经过训练的带有固定参数的深度学习分类模型, 对新的未标记的漏洞样本进行分类. 具体来说, 给定一个新的漏洞样本, 首先进行静态分析, 以提取代码片段. 然后片段中的每一个单词都会被转换成一个768维的向量, 并组合成漏洞样本的向量表示. 最后, 模型将向量表示作为输入, 输出相应的类型标签, 完成漏洞分类任务.

    由于本文使用与第3节相同的深度学习模型, 因此大多数超参数与第3.2节相同. 然后在对比学习中引入了两个新的超参数$ \tau $$ \eta $. 对于使用对比学习框架的每个实验, 使用$ \tau \in \left\{ {0.1, 0.3, 0.5, 0.7} \right\} $$ \eta \in \{ 0.1, 0.3, 0.5, 0.7, 0.9 \} $进行基于网格的超参数扫描. 最后, 根据当$ \tau $= 0.1和$ \eta $= 0.3的情况在前3组实验中的平均表现, 选择$ \tau $= 0.1和$ \eta $= 0.3作为最佳的超参数组合.

    为了评估VulFewShot是否能有效解决对少样本类型分类差的问题, 我们研究了以下两个问题.

    • RQ3: 与传统深度学习模型相比, 使用VulFewShot框架训练的模型在整体性能方面表现如何?

    • RQ4: 在MVD和MVD-part数据集上, 与传统深度学习模型相比, 使用VulFewShot框架训练的模型在大、中、小规模漏洞类型上的表现如何?

    4.3.1   RQ3

    图7比较了传统深度学习模型和使用VulFewShot框架训练的模型在MVD和MVD-part上的性能. 其中, CE表示采用交叉熵损失而CE+SupCon表示结合交叉熵损失和对比学习损失. 可以看到, 使用VulFewShot框架训练的模型在MVD和MVD-part上都比传统模型获得了更高的分数. 由于页面限制, 只在表4中展示了整体性能评估指标的M_F1和W_F1分数. 本文的框架与CNN、BiGRU、BiLSTM和Atten-BiLSTM这4种模型相比在MVD上分别提高了0.205%、0.964%、1.627%和0.535%的M_F1分数, 在MVD-part上分别提高了0.478%、2.769%、2.853%和3.336%的M_F1分数.

    图  7  MVD和MVD-part数据集上使用传统深度学习模型和使用VulFewShot框架训练的模型的总体性能
    下载: 全尺寸图片
    表  4  传统深度学习模型和使用VulFewShot框架训练的模型在MVD和MVD-part数据集上各项性能指标表现 (%)
    模型框架 模型名称 MVD MVD-part
    M_F1 W_F1 Mean_L Mean_M Mean_S M_F1 W_F1 Mean_L Mean_M Mean_S
    传统模型 CNN 97.582 99.493 99.182 98.982 94.797 96.818 97.910 97.920 98.594 94.145
    BiGRU 96.694 99.348 99.006 98.463 92.904 92.579 95.410 96.090 94.412 87.616
    BiLSTM 95.957 99.317 99.026 98.528 90.721 91.493 94.572 95.380 93.739 85.797
    Atten-BiLSTM 97.621 99.487 99.169 98.797 95.092 93.960 95.537 95.925 96.329 89.936
    VulFewShot CNN 97.788 99.512 99.121 99.262 95.180 97.296 97.920 97.760 99.336 94.970
    BiGRU 97.658 99.335 98.955 98.589 95.590 95.348 96.411 96.745 95.561 93.853
    BiLSTM 97.585 99.395 98.977 98.856 95.111 94.346 95.142 95.360 95.344 92.478
    Atten-BiLSTM 98.156 99.520 99.175 99.315 96.133 97.296 97.815 97.763 98.372 95.863

    一方面, 虽然与CNN模型相比整体性能提升并不明显, 但与其他3种模型相比性能提升的表现则较为突出. 通过表4中的性能指标, 我们可以发现CNN在所有4种传统模型中的平均得分是最好的, 并且得分非常高, 所以即使是轻微的改进也可以证明VulFewShot的优秀.

    另一方面, 传统深度学习模型在MVD-part上的平均性能比MVD差3.25%, VulFewShot将这一差距缩小到1.73%. 从第2.2节可知, MVD-part在少样本漏洞类型的评价标准上优于MVD, 因为MVD中不同漏洞类型样本数量的不平衡会影响传统深度学习模型的学习过程, 与控制变量的原则相悖. 因此, 我们可以得出结论, VulFewShot在少样本漏洞类型的分类上比传统的深度学习模型表现得更好.

    从交叉实验结果中的数据分布也可以看出, 使用VulFewShot框架训练的模型具有更好的泛化能力, 这意味着它们在多个实验中具有更稳定的性能.

    综上所述, 根据评估指标的结果, 使用VulFewShot框架训练的模型优于传统深度学习模型, 在MVD-part数据集上的优势更为明显.

    4.3.2   RQ4

    为了更好地展示传统深度学习模型和使用VulFewShot框架训练的模型在不同漏洞类型尺度上的性能比较, 用箱形图展示了每个模型在MVD和MVD-part上的性能, 如图8所示. 其中, CE表示采用交叉熵损失而CE+SupCon表示结合交叉熵损失和对比学习损失. 我们在图8中可以看到的是本文的框架带来的不同漏洞类型规模上的性能提升, 尤其是在少样本类型的漏洞上的提升是不可否认的. 同时, 本文的框架减少了从大规模漏洞类型到小规模漏洞类型的性能下降程度.

    图  8  MVD和MVD-part数据集中, 传统深度学习模型和使用VulFewShot框架训练的模型在不同漏洞类型规模上的性能
    下载: 全尺寸图片

    具体而言, 对于小规模类型的平均M_F1分数, VulFewShot相比于CNN、BiGRU、BiLSTM和Atten-BiLSTM在MVD上提高分别为0.383%、2.686%、4.390%和1.041%, 在MVD-part上分别提高0.825%、6.237%、6.681%和5.927%. 对于中等规模类型的平均M_F1分数, VulFewShot相比于CNN、BiGRU、BiLSTM和Atten-BiLSTM在MVD上提高了0.126%–0.518%, 在MVD-part上提高了0.742%–2.043%. 对于大规模类型的平均M_F1分数, VulFewShot与4种传统模型在两个数据集上的比较实验中, 8例中有5例性能略有下降(0.020%–0.160%). 在其他3个案例中, 性能略有提升(0.006%–1.838%). 在CNN上的改善效果比在其他模型上的改善效果少得多的原因是CNN的分数很高, 一点点的增加都是有价值的. 可以看到在MVD和MVD-part上CNN和VulFewShot的结果差异在大规模到小规模漏洞类型上是稳定增加的, 符合结果预期, 因此可以认为在排除错误的影响下, VulFewShot在对少样本漏洞类型的分类上确实优于CNN. 此外, 部分案例在大规模类型上略有下降的原因可能有两个: 一是模型在大规模类型上已经取得了很好的结果(MVD为99.006%–99.182%, MVD-part为95.380%–97.920%), 改进空间有限. 另一个原因是实验中的随机性和偶然性.

    图9显示了MVD和MVD-part上模型的平均标准偏差(STD)值. 从图9中可以看出, 本文的框架提高了模型的泛化能力, 并且在MVD-part数据集中的改进更为明显. 在比较不同规模的漏洞类型时, 从大规模到小规模类型, 改进程度依次增加.

    图  9  MVD和MVD-part数据集上传统深度学习模型和使用VulFewShot框架训练的模型的STD性能
    下载: 全尺寸图片

    综上所述, VulFewShot可以显著提高传统深度学习模型在中小规模漏洞类型上的性能, 从而缓解了在少数漏洞类型上的性能下降. 这种改进从大尺度到小尺度依次增加, 在MVD-part数据集上尤为明显.

    本文的实验方法和结论可能在内部和外部有效性方面受到以下描述的某些方面的潜在威胁.

    一种可能的内部威胁是以特定库/API函数调用为起点的代码片段漏洞. 我们没有使用整个程序代码, 而是使用这些代码片段来提取特征, 这些特征在多项研究中被证明对漏洞的检测和分类是有效的[16,20,23]. 并且提取的代码片段不仅是原始漏洞代码的一部分而且是可解释的. 相关研究正试图基于代码片段检测并以图片的形式直观地表示漏洞.

    另一个潜在的内部威胁可能是我们对类型尺度的定义. 由于不同漏洞类型之间的严重数据不平衡(最大的有17872个漏洞样本, 最小的只有6个), 不能将所有漏洞类型降采样到最小的大小, 因为大多数样本将会丢失. 因此, 本文采用了分层的下采样策略, 以保持不同规模的漏洞数量相对均匀. 明确地说, 将样本量在400以上的类型设置为大规模类型, 样本量在80–400之间的为中等规模类型, 样本量小于80的为小规模类型. 这样一来, 数据相对比较均衡, 从而便于考察模型在各种规模的漏洞类型上的表现.

    最后, 数据集的质量和代表性可能是我们研究的外部威胁. 我们相信MVD的质量, 因为它是由专门从事安全工作的研究人员构建的并且已经在各种现有的研究中使用. 与此同时, 数据集中漏洞片段的提取是基于相应的CWE ID, 我们已经观察到具有相同类型标签的代码片段的数据特征有相似之处. 未来, 可以在更多的漏洞分类数据集上进一步验证我们的发现.

    在本文工作中, 我们发现漏洞类型之间存在严重的数据不平衡. 然后本文评估了多个传统深度学习模型, 包括CNN、BiGRU、BiLSTM和Atten-BiLSTM, 来对漏洞进行分类. 结果表明, 不同漏洞类型的分类性能随着漏洞样本数量的减少而下降, 导致在少样本类型上的分类性能较差. 为了应对这一挑战, 本文实现了VulFewShot, 这是一个基于对比学习的漏洞分类框架, 以提高当前的分类性能. VulFewShot显著提高了整体水平和不同样本规模下所有类型漏洞的分类性能, 并且在少样本类型上的提升是不可否认的, 这进一步提升了整体性能.

    MVD和MVD-part数据集的评估结果表明, VulFewShot不仅在总体水平上, 而且在具有不同样本规模的所有类型的漏洞上, 都显著提高了分类性能. 这种改进在少样本类型上尤其明显, 这进一步提高了整体性能.未来, 我们有兴趣应用更多的特征提取方法来探索其他编程语言(如Python、Java等)中的漏洞分类任务, 并在3种不同规模的漏洞大小(大、中、小)上进一步实验这4种传统的深度学习模型.

  • 图  1   漏洞分类的一般过程

    下载: 全尺寸图片

    图  2   不同类型漏洞的数量分布

    下载: 全尺寸图片

    图  3   传统深度学习模型在MVD和MVD-part上的总体性能

    下载: 全尺寸图片

    图  4   MVD和MVD-part数据集上传统深度学习模型在不同漏洞类型规模上的性能

    下载: 全尺寸图片

    图  5   VulFewShot的系统概述

    下载: 全尺寸图片

    图  6   VulFewShot中的监督对比学习

    下载: 全尺寸图片

    图  7   MVD和MVD-part数据集上使用传统深度学习模型和使用VulFewShot框架训练的模型的总体性能

    下载: 全尺寸图片

    图  8   MVD和MVD-part数据集中, 传统深度学习模型和使用VulFewShot框架训练的模型在不同漏洞类型规模上的性能

    下载: 全尺寸图片

    图  9   MVD和MVD-part数据集上传统深度学习模型和使用VulFewShot框架训练的模型的STD性能

    下载: 全尺寸图片

    表  1   CNN使用的参数

    参数名 配置
    损失函数
    滤波器尺寸
    滤波器数量
    激活函数
    池化层策略
    优化策略
    批量大小
    学习率
    交叉熵损失函数
    (2, 3, 4)
    256
    ReLU
    最大池化
    Adam
    32
    0.00002

    表  2   BiGRU, BiLSTM和Atten-BiLSTM使用的参数

    参数名配置
    损失函数
    激活函数
    层数
    优化策略
    批量大小
    学习率
    交叉熵损失函数
    tanh
    2
    Adam
    32
    0.00002

    表  3   传统深度学习模型在MVD和MVD-part数据集上各性能指标表现

    数据集 模型 M_FPR M_FNR M_F1 W_FPR W_FNR W_F1 Mean_L Mean_M Mean_S STD_L STD_M STD_S
    MVD CNN 0.015 3.020 97.582 0.113 0.494 99.493 99.182 98.982 94.797 1.466 2.330 16.824
    BiGRU 0.018 4.046 96.694 0.090 0.638 99.348 99.006 99.463 92.904 1.476 2.138 17.153
    BiLSTM 0.020 4.775 95.957 0.115 0.662 99.317 99.026 98.528 90.721 1.520 2.233 19.086
    Atten-BiLSTM 0.014 2.824 97.621 0.066 0.503 99.487 99.169 98.797 95.092 1.338 2.137 16.281
    MVD-part CNN 0.054 2.959 96.818 0.104 2.058 97.910 97.920 98.594 94.145 2.291 4.161 17.402
    BiGRU 0.119 6.751 92.579 0.191 4.557 95.410 96.090 94.412 87.616 3.619 7.120 23.217
    BiLSTM 0.141 8.555 91.493 0.242 5.390 94.572 95.380 93.739 85.797 4.622 7.903 23.602
    Atten-BiLSTM 0.117 5.786 93.960 0.201 4.460 95.537 95.925 96.329 89.936 4.186 6.656 17.895

    表  4   传统深度学习模型和使用VulFewShot框架训练的模型在MVD和MVD-part数据集上各项性能指标表现 (%)

    模型框架 模型名称 MVD MVD-part
    M_F1 W_F1 Mean_L Mean_M Mean_S M_F1 W_F1 Mean_L Mean_M Mean_S
    传统模型 CNN 97.582 99.493 99.182 98.982 94.797 96.818 97.910 97.920 98.594 94.145
    BiGRU 96.694 99.348 99.006 98.463 92.904 92.579 95.410 96.090 94.412 87.616
    BiLSTM 95.957 99.317 99.026 98.528 90.721 91.493 94.572 95.380 93.739 85.797
    Atten-BiLSTM 97.621 99.487 99.169 98.797 95.092 93.960 95.537 95.925 96.329 89.936
    VulFewShot CNN 97.788 99.512 99.121 99.262 95.180 97.296 97.920 97.760 99.336 94.970
    BiGRU 97.658 99.335 98.955 98.589 95.590 95.348 96.411 96.745 95.561 93.853
    BiLSTM 97.585 99.395 98.977 98.856 95.111 94.346 95.142 95.360 95.344 92.478
    Atten-BiLSTM 98.156 99.520 99.175 99.315 96.133 97.296 97.815 97.763 98.372 95.863
  • [1] Sun N, Zhang J, Rimba P, Gao S, Zhang LY, Xiang Y. Data-driven cybersecurity incident prediction: A survey. IEEE Communications Surveys & Tutorials, 2019, 21(2): 1744–1772. [doi: 10.1109/COMST.2018.2885561]
    [2] Liu L, De Vel O, Han QL, Zhang J, Xiang Y. Detecting and preventing cyber insider threats: A survey. IEEE Communications Surveys & Tutorials, 2018, 20(2): 1397–1417. [doi: 10.1109/COMST.2018.2800740]
    [3] Rajeh W, Jin H, Zou DQ. Saudi cloud infrastructure: A security analysis. Science China Information Sciences, 2017, 60(12): 122102. [doi: 10.1007/s11432-016-0322-7]
    [4] Cherem S, Princehouse L, Rugina R. Practical memory leak detection using guarded value-flow analysis. In: Proc. of the 28th ACM SIGPLAN Conf. on Programming Language Design and Implementation. San Diego: ACM, 2007. 480–491. [doi: 10.1145/1250734.1250789]
    [5] Fan G, Wu RX, Shi QK, Xiao X, Zhou JG, Zhang C. SMOKE: Scalable path-sensitive memory leak detection for millions of lines of code. In: Proc. of the 41st IEEE/ACM Int’l Conf. on Software Engineering (ICSE). Montreal: IEEE, 2019. 72–82. [doi: 10.1109/ICSE.2019.00025]
    [6] Li W, Cai HP, Sui YL, Manz D. PCA: Memory leak detection using partial call-path analysis. In: Proc. of the 28th ACM Joint Meeting on European Software Engineering Conf. and Symp. on the Foundations of Software Engineering. ACM, 2020. 1621–1625. [doi: 10.1145/3368089.3417923]
    [7] Shi QK, Xiao X, Wu RX, Zhou JG, Fan G, Zhang C. Pinpoint: Fast and precise sparse value flow analysis for million lines of code. In: Proc. of the 39th ACM SIGPLAN Conf. on Programming Language Design and Implementation. Philadelphia: ACM, 2018. 693–706. [doi: 10.1145/3192366.3192418]
    [8] Smith J, Johnson B, Murphy-Hill E, Chu B, Lipford HR. How developers diagnose potential security vulnerabilities with a static analysis tool. IEEE Trans. on Software Engineering, 2019, 45(9): 877–897. [doi: 10.1109/TSE.2018.2810116]
    [9] Aloraini B, Nagappan M, German DM, Hayashi S, Higo Y. An empirical study of security warnings from static application security testing tools. Journal of Systems and Software, 2019, 158: 110427. [doi: 10.1016/j.jss.2019.110427]
    [10] Yamaguchi F, Lindner F, Rieck K. Vulnerability extrapolation: Assisted discovery of vulnerabilities using machine learning. In: Proc. of the 5th USENIX Workshop on Offensive Technologies. San Francisco: USENIX Association, 2011.
    [11] Walden J, Stuckman J, Scandariato R. Predicting vulnerable components: Software metrics vs. text mining. In: Proc. of the 25th IEEE Int’l Symp. on Software Reliability Engineering. IEEE, 2014. 23–33.
    [12] Harer JA, Kim LY, Russell RL, Ozdemir O, Kosta LR, Rangamani A, Hamilton LH, Centeno GI, Key JR, Ellingwood PM, Antelman E, Mackay A, McConley MW, Opper JM, Chin P, Lazovich T. Automated software vulnerability detection with machine learning. arXiv:1803.04497, 2018.
    [13] Lee YJ, Choi SH, Kim C, Lim SH, Park KW. Learning binary code with deep learning to detect software weakness. 2017. http://syscore.sejong.ac.kr/~woongbak/publications/C37.pdf
    [14] Russell R, Kim L, Hamilton L, Lazovich T, Harer J, Ozdemir O, Ellingwood P, McConley M. Automated vulnerability detection in source code using deep representation learning. In: Proc. of the 17th IEEE Int’l Conf. on Machine Learning and Applications (ICMLA). Orlando: IEEE, 2018. 757–762. [doi: 10.1109/ICMLA.2018.00120]
    [15] Shar LK, Tan HBK. Predicting common Web application vulnerabilities from input validation and sanitization code patterns. In: Proc. of the 27th IEEE/ACM Int’l Conf. on Automated Software Engineering. Essen: IEEE, 2012. 310–313. [doi: 10.1145/2351676.2351733]
    [16] Li Z, Zou DQ, Xu SH, Ou XY, Jin H, Wang SJ, Deng ZJ, Zhong YY. VulDeePecker: A deep learning-based system for vulnerability detection. arXiv:1801.01681, 2018.
    [17] Lin GJ, Zhang J, Luo W, Pan L, Xiang Y. POSTER: Vulnerability discovery with function representation learning from unlabeled projects. In: Proc. of the 2017 ACM SIGSAC Conf. on Computer and Communications Security. Dallas: ACM, 2017. 2539–2541. [doi: 10.1145/3133956.3138840]
    [18] Lin GJ, Zhang J, Luo W, Pan L, Xiang Y, De Vel O, Montague P. Cross-project transfer representation learning for vulnerable function discovery. IEEE Trans. on Industrial Informatics, 2018, 14(7): 3289–3297. [doi: 10.1109/TII.2018.2821768]
    [19] Duan X, Wu JZ, Ji SL, Rui ZQ, Luo TY, Yang MT, Wu YJ. VulSniper: Focus your attention to shoot fine-grained vulnerabilities. In: Proc. of the 28th Int’l Joint Conf. on Artificial Intelligence. Macao: AAAI, 2019. 4665–4671.
    [20] Li Z, Zou DQ, Xu SH, Jin H, Zhu YW, Chen ZX. SySeVR: A framework for using deep learning to detect software vulnerabilities. IEEE Trans. on Dependable and Secure Computing, 2022, 19(4): 2244–2258. [doi: 10.1109/TDSC.2021.3051525]
    [21] Zhou YQ, Liu SQ, Siow J, Du XN, Liu Y. Devign: Effective vulnerability identification by learning comprehensive program semantics via graph neural networks. In: Proc. of the 33rd Int’l Conf. on Neural Information Processing Systems. Vancouver: Curran Associates Inc., 2019. 10197–10207.
    [22] Wu YM, Zou DQ, Dou SH, Yang W, Xu D, Jin H. VulCNN: An image-inspired scalable vulnerability detection system. In: Proc. of the 44th IEEE/ACM Int’l Conf. on Software Engineering (ICSE). Pittsburgh: IEEE, 2022. 2365–2376. [doi: 10.1145/3510003.3510229]
    [23] Zou DQ, Wang SJ, Xu SH, Li Z, Jin H. µVulDeePecker: A deep learning-based system for multiclass vulnerability detection. IEEE Trans. on Dependable and Secure Computing, 2021, 18(5): 2224–2236. [doi: 10.1109/TDSC.2019.2942930]
    [24] Fan LL, Su T, Chen S, Meng GZ, Liu Y, Xu LH, Pu GG, Su ZD. Large-scale analysis of framework-specific exceptions in Android APPs. In: Proc. of the 40th IEEE/ACM Int’l Conf. on Software Engineering (ICSE). Gothenburg: IEEE, 2018. 408–419. [doi: 10.1145/3180155.3180222]
    [25] Tang CB, Chen S, Fan LL, Xu LH, Liu Y, Tang ZS, Dou L. A large-scale empirical study on industrial fake APPs. In: Proc. of the 41st IEEE/ACM Int’l Conf. on Software Engineering: Software Engineering in Practice (ICSE-SEIP). Montreal: IEEE, 2019. 183–192. [doi: 10.1109/ICSE-SEIP.2019.00028]
    [26] Evangelista JF. Cybersecurity vulnerability classification utilizing natural language processing methods [Ph.D. Thesis]. Washington: The George Washington University, 2021.
    [27] Siewruk G, Mazurczyk W. Context-aware software vulnerability classification using machine learning. IEEE Access, 2021, 9: 88852–88867. [doi: 10.1109/ACCESS.2021.3075385]
    [28] Wang Q, Li YZ, Wang Y, Ren JD. An automatic algorithm for software vulnerability classification based on CNN and GRU. Multimedia Tools and Applications, 2022, 81(5): 7103–7124. [doi: 10.1007/s11042-022-12049-1]
    [29] Yuan X, Lin GJ, Tai YH, Zhang J. Deep neural embedding for software vulnerability discovery: Comparison and optimization. Security and Communication Networks, 2022, 2022: 5203217. [doi: 10.1155/2022/5203217]
    [30] Hin D, Kan A, Chen HM, Babar MA. LineVD: Statement-level vulnerability detection using graph neural networks. arXiv:2203.05181, 2022.
    [31] Yamaguchi F, Lottmann M, Rieck K. Generalized vulnerability extrapolation using abstract syntax trees. In: Proc. of the 28th Annual Computer Security Applications Conf. Orlando: ACM, 2012. 359–368. [doi: 10.1145/2420950.2421003]
    [32] Neuhaus S, Zimmermann T, Holler C, Zeller A. Predicting vulnerable software components. In: Proc. of the 14th ACM Conf. on Computer and Communications Security. Alexandria: ACM, 2007. 529–540. [doi: 10.1145/1315245.1315311]
    [33] Joern. 2019. https://github.com/ShiftLeftSecurity/
    [34] Ferrante J, Ottenstein KJ, Warren JD. The program dependence graph and its use in optimization. ACM Trans. on Programming Languages and Systems, 1987, 9(3): 319–349. [doi: 10.1145/24039.24041]
    [35] Sinha S, Harrold MJ, Rothermel G. System-dependence-graph-based slicing of programs with arbitrary interprocedural control flow. In: Proc. of the 21st Int’l Conf. on Software Engineering. Los Angeles: ACM, 1999. 432–441. [doi: 10.1145/302405.302675]
    [36] Wang HT, Ye GX, Tang ZY, Tan SH, Huang SF, Fang DY, Feng YS, Bian LZ, Wang Z. Combining graph-based learning with automated data collection for code vulnerability detection. IEEE Trans. on Information Forensics and Security, 2020, 16: 1943–1958. [doi: 10.1109/TIFS.2020.3044773]
    [37] Mikolov T, Sutskever I, Chen K, Corrado GS, Dean J. Distributed representations of words and phrases and their compositionality. In: Proc. of the 27th Int’l Conf. on Neural Information Processing Systems. Lake Tahoe: Curran Associates Inc., 2013. 3111–3119.
    [38] Sohn K. Improved deep metric learning with multi-class N-pair loss objective. In: Proc. of the 30th Int’l Conf. on Neural Information Processing Systems. Barcelona: Curran Associates Inc., 2016. 1857–1865.
    [39] van den Oord A, Li YZ, Vinyals O. Representation learning with contrastive predictive coding. arXiv:1807.03748, 2019.
    [40] Wu ZR, Xiong YJ, Yu SX, Lin DH. Unsupervised feature learning via non-parametric instance discrimination. In: Proc. of the 2018 IEEE/CVF Conf. on Computer Vision and Pattern Recognition. Salt Lake City: IEEE, 2018. 3733–3742. [doi: 10.1109/CVPR.2018.00393]
    [41] Bachman P, Hjelm RD, Buchwalter W. Learning representations by maximizing mutual information across views. In: Proc. of the 33rd Int’l Conf. on Neural Information Processing Systems. Vancouver: Curran Associates Inc., 2019. 15535–15545.
    [42] Hénaff OJ, Srinivas A, De Fauw J, Razavi A, Doersch C, Ali Eslami SM, van den Oord A. Data-efficient image recognition with contrastive predictive coding. In: Proc. of the 37th Int’l Conf. on Machine Learning. JMLR.org, 2020. 4182–4192.
    [43] Baevski A, Zhou H, Mohamed A, Auli M. Wav2vec 2.0: A framework for self-supervised learning of speech representations. In: Proc. of the 34th Int’l Conf. on Neural Information Processing Systems. Vancouver: Curran Associates Inc., 2020. 12449–12460.
    [44] Conneau A, Baevski A, Collobert R, Mohamed A, Auli M. Unsupervised cross-lingual representation learning for speech recognition. arXiv:2006.13979, 2020.
    [45] Tian YL, Krishnan D, Isola P. Contrastive multiview coding. In: Proc. of the 16th European Conf. on Computer Vision. Glasgow: Springer, 2020. 776–794. [doi: 10.1007/978-3-030-58621-8_45]
    [46] Hjelm RD, Fedorov A, Lavoie-Marchildon S, Grewal K, Bachman P, Trischler A, Bengio Y. Learning deep representations by mutual information estimation and maximization. arXiv:1808.06670, 2019.
    [47] Han TD, Xie WD, Zisserman A. Video representation learning by dense predictive coding. In: Proc. of the 2019 IEEE/CVF Int’l Conf. on Computer Vision Workshop. Seoul: IEEE, 2019. 1483–1492. [doi: 10.1109/ICCVW.2019.00186]
    [48] He KM, Fan HQ, Wu YX, Xie SN, Girshick R. Momentum contrast for unsupervised visual representation learning. In: Proc. of the 2020 IEEE/CVF Conf. on Computer Vision and Pattern Recognition. Seattle: IEEE, 2020. 9726–9735. [doi: 10.1109/CVPR42600.2020.00975]
    [49] Misra I, van der Maaten L. Self-supervised learning of pretext-invariant representations. In: Proc. of the 2020 IEEE/CVF Conf. on Computer Vision and Pattern Recognition. Seattle: IEEE, 2020. 6706–6716. [doi: 10.1109/CVPR42600.2020.00674]
    [50] Chen T, Kornblith S, Norouzi M, Hinton G. A simple framework for contrastive learning of visual representations. In: Proc. of the 37th Int’l Conf. on Machine Learning. JMLR.org, 2020. 1597–1607.
    [51] Khosla P, Teterwak P, Wang C, Sarna A, Tian YL, Isola P, Maschinot A, Liu C, Krishnan D. Supervised contrastive learning. In: Proc. of the 34th Int’l Conf. on Neural Information Processing Systems. Vancouver: Curran Associates Inc., 2020. 18661–18673.
    [52] Wu YM, Dou SH, Zou DQ, Yang W, Qiang WZ, Jin H. Obfuscation-resilient Android malware analysis based on contrastive learning. arXiv:2107.03799, 2022.
    [53] Gunel B, Du JF, Conneau A, Stoyanov V. Supervised contrastive learning for pre-trained language model fine-tuning. arXiv:2011.01403, 2021.
    [54] Lin GJ, Zhang J, Luo W, Pan L, De Vel O, Montague P, Xiang Y. Software vulnerability discovery via learning multi-domain knowledge bases. IEEE Trans. on Dependable and Secure Computing, 2021, 18(5): 2469–2485. [doi: 10.1109/TDSC.2019.2954088]
    [55] Lin GJ, Wen S, Han QL, Zhang J, Xiang Y. Software vulnerability detection using deep neural networks: A survey. Proc. of the IEEE, 2020, 108(10): 1825–1848. [doi: 10.1109/JPROC.2020.2993293]
    [56] Zhou P, Shi W, Tian J, Qi ZY, Li BC, Hao HW, Xu B. Attention-based bidirectional long short-term memory networks for relation classification. In: Proc. of the 54th Annual Meeting of the Association for Computational Linguistics (Vol. 2: Short Papers). Berlin: Association for Computational Linguistics, 2016. 207–212. [doi: 10.18653/v1/P16-2034]
    [57] Hochreiter S, Schmidhuber J. Long short-term memory. Neural Computation, 1997, 9(8): 1735–1780. [doi: 10.1162/neco.1997.9.8.1735]
    [58] Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate. arXiv:1409.0473, 2016.
    [59] nvd. 2019. https://nvd.nist.gov/
    [60] sard. 2019. https://samate.nist.gov/SRD/
    [61] ElRafey A, Wojtusiak J. Recent advances in scaling-down sampling methods in machine learning. WIREs Computational Statistics, 2017, 9(6): e1414. [doi: 10.1002/wics.1414]
    [62] Sun AX, Lim EP, Liu Y. On strategies for imbalanced text classification using SVM: A comparative study. Decision Support Systems, 2009, 48(1): 191–201. [doi: 10.1016/j.dss.2009.07.011]
    [63] Ndiaye E, Le T, Fercoq O, Salmon J, Takeuchi I. Safe grid search with optimal complexity. In: Proc. of the 36th Int’l Conf. on Machine Learning. Long Beach: PMLR, 2019. 4771–4780.
    [64] Kingma DP, Ba J. Adam: A method for stochastic optimization. arXiv:1412.6980, 2017.
    [65] Meta-learning: Learning to learn fast. 2018. https://lilianweng.github.io/posts/2018-11-30-meta-learning/
WeChat 点击查看大图
图(9)  /  表(4)
出版历程
  • 收稿日期:  2024-05-30
  • 录用日期:  2025-03-25
  • 修回日期:  2024-10-10
  • 网络出版日期:  2025-07-23

目录

    /

    返回文章
    返回