Page 117 - 《软件学报》2025年第12期
P. 117
5498 软件学报 2025 年第 36 卷第 12 期
2.1 深度学习的模型选择
为了完成漏洞检测或分类任务, 各种深度学习架构被用于在漏洞特征的不同表示中进行学习. 我们主要考虑
使用卷积神经网络 (CNN) [12−15,22] 和循环神经网络 (RNN), 包括长短期记忆 (LSTM) 及其一些变体 [16,20,23,54,55] . 现有
相关工作绝大多数是二分类工具, 多分类工具很少. 在二分类工具当中, 绝大多数模型都采用了 CNN (如 VulCNN )、
[22]
BiLSTM (如 VulDeePecker [16] ) 或 BiGRU (如 SySeVR [20] ); 而多分类工具同样如此, 如经典的多分类工具µVulDee-
Pecker 就采用了 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
节). 从整体性能和不同规模的漏洞类型上比较了两个数据集的性能.
2.2 数据集
我们在µVulDeePecker 的开源数据集 MVD 上进行实验, 该数据集共收集了 43 119 个漏洞样本, 涵盖了国家漏
洞数据库 (NVD) [59] 和软件保障参考数据集 (SARD) [60] 中的 40 种漏洞类型. MVD 数据集包含了处理过的代码片段
及其对应的标签. 虽然数据预处理已经在图 1 的步骤 2 中进行, 我们仍然需要对代码进行规范化. 规范化过程主要
包括 3 个步骤: 步骤 1 是从代码片段文本中删除非 ASCII 字符和注释, 因为它们与漏洞无关. 第 2 步是在符号名称
(例如“VAR1”“VAR2”) 和用户定义变量之间应用一对一的映射. 第 3 步是在符号名称 (如“FUN1”“FUN2”) 和用户
定义函数之间应用一对一的映射. 之后, 对数据集进行合并和去重, 得到一个包含 41 660 个漏洞样本的 MVD 数据
集, 涵盖 40 种漏洞类型.
我们对 MVD 中的漏洞类型标签进行了统计分析. 不同类型漏洞样本数量的分布情况, 从大到小排序, 如图 2
所示. 图中横轴表示不同的漏洞类型 (未标记), 纵轴表示对应类型的漏洞样本数量. 可以看到, 不同漏洞类型的大
小符合长尾幂律分布, 这表明数据集中漏洞类型的样本数量之间存在严重的数据不平衡. 具体来说, 缓冲区溢出是
数量最大的漏洞类型 (包含了 CWE122, CWE121, CWE124, CWE127, CWE680, CWE126, CWE416 和 CWE123),
它有 17 872 个漏洞样本, 而最小的是由于调用方不正确的遵循规范导致的共享资源同步错误 (包含了 CWE662
和 CWE573), 它只有 6 个漏洞样本.
为了更全面地研究少样本漏洞类型所造成的影响, 我们在 MVD 的基础上构建了一个 MVD-part 数据集, 该数

