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 数据集, 该数
   112   113   114   115   116   117   118   119   120   121   122