Page 215 - 《软件学报》2025年第7期
P. 215

3136                                                       软件学报  2025  年第  36  卷第  7  期


                 用该关联特征构建漏洞检测模型. 本文在             FFmpeg、Qemu  和  Chrome+Debian  这  3  个广泛使用的软件漏洞数据集
                 上评估了   CSFF-VD, 以验证其有效性. 实验结果表明, 与          5  种先进的漏洞检测方法相比, CSFF-VD        在 F-measure、
                 Precision、Recall 和  FNR  这  4  个指标上, 均能获得更优异的结果.
                    本文的贡献总结如下. (1) 本文提出了一种基于函数间结构特征关联的软件漏洞检测方法                            CSFF-VD. 在提取
                 函数内独立结构特征的基础上增加了函数间结构关联的信息, 以此提升漏洞检测的性能. 本文在                               3  个漏洞检测数
                 据集上评估了提出方法和基线方案的性能, 结果表明, 本文所提出的                    CSFF-VD  在指标性能上超过了其他先进方法
                 的水平. (2) 本文提出的函数间关联挖掘方法, 能即插即用于各类函数内独立特征提取方法上, 用于提升漏洞检测
                 模型的性能. 对此, 第    4  节中研究问题    2  的实验结果表明了集成函数间关联特征提取方法的有效性.
                    本文第   1  节介绍漏洞检测的研究现状. 第         2  节介绍相关技术背景. 第      3  节介绍本文构建的基于函数间结构特
                 征关联的软件漏洞检测方法模型. 第           4  节阐述我们的实验设计. 第       5  节展示实验结果并进行分析. 第        6  节根据实验
                 结果进行进一步讨论. 最后在第         7  节总结全文.

                 1   漏洞检测研究现状

                    软件漏洞检测的目标是通过对源代码进行分析, 判断软件代码是否存在漏洞, 指导开发人员进行修复从而保
                 障软件的安全性和可靠性. 软件漏洞检测的传统方法主要依赖于专家制定的规则进行模式匹配, 通过检测代码的
                 编码方式进而判断代码是否存在某一漏洞               [13,14] . 但基于规则和模式匹配的方法容易产生误报和漏报, 且预定义的
                 规则和专家知识难以快速响应新出现的漏洞类型. 此外, 传统的软件漏洞检测也普遍使用自动化测试工具, 针对特
                 定软件代码模块进行渗透测试, 但该方法需要测试人员具有充足经验, 且所需人力较多, 耗时过长                              [15,16] . 随着人工
                 智能的发展, 特别是深度学习的兴起, 近年来出现了许多使用深度神经网络模型提取源代码特征, 用于漏洞检测的
                 研究. 现阶段, 按照代码表示方式划分, 基于深度学习的漏洞检测方法主要包含两类: 基于代码文本表示的漏洞检
                 测和基于代码图结构表示的漏洞检测             [11] .
                    基于代码文本表示的漏洞检测将代码视作文本序列输入至深度网络中. Louati 等人                        [17] 使用  Word2Vec 对软件
                 源码进行嵌入, 并使用双向        LSTM  进行特征提取和检测. 文献       [18] 先对代码文本中库和       API 调用部分进行切片并
                 拼合, 随后对片段进行清洗和嵌入, 最后使用双向              LSTM  进行特征提取. Lin   等人  [19] 使用多种词嵌入模型和多种主
                 流神经网络    (如  TextCNN、LSTM  等) 进行搭配, 对漏洞代码进行检测并对比不同方式的优劣. 文献                  [20] 先对代码
                 中函数调用相关代码进行切片, 随后使用             BERT  模型对代码进行嵌入, 最后使用结合了自注意力的                LSTM  进行特
                 征提取. 上述基于代码文本表示的漏洞检测方法主要对文本词义特征进行提取, 代码语义信息和依赖信息会有损
                 失, 导致模型无法做出准确判断          [11] . 基于代码图结构表示的漏洞检测方法近年来受到广泛关注, 其将代码转换为
                 抽象语法树、控制流图、数据流图、代码属性图                 [21] 等形式作为神经网络的输入, 从而进行特征提取和漏洞检测.
                 该方法相较于基于代码文本表示的方法可更完全地保留代码语义信息, 同时可突出展现如控制流、数据流、代码
                 依赖等信息. 在基于图结构表示的漏洞检测研究中, Zhang               等人  [22] 使用数据流图对源代码表示后通过遍历数据流
                 图多条路径获得该路径的节点序列, 使用预训练模型和卷积神经网络对路径节点序列提取特征, 最终结合多条路
                 径特征进行漏洞检测. 文献        [23] 先提取源代码行级文本词义特征, 后用该词义特征对代码依赖图中各行对应的节
                 点进行初始化, 最后使用带特征注意力的图卷积模型提取特征进行漏洞检测. Wen 等人                         [24] 使用代码属性图对程序
                 进行表示后, 根据自定义规则进行图结构的简化, 减少图内漏洞无关信息, 从而降低噪声带来的干扰, 最后使用不
                 同尺寸的卷积核进行特征提取. Steenhoek        等人  [25] 为控制流图的节点赋予自定义向量, 表示每个节点的抽象数据流
                 信息, 并使用门控图序列网络的消息聚合和更新函数模拟数据流分析中信息传播过程, 获得图的向量表示用于漏
                 洞检测. Cheng  等人  [26]  使用代码结构图对源代码进行表示, 并将其解构为执行路径. 随后使用启发式路径选择策
                 略识别固定数量的关键路径以排除无关代码, 最后融合两种深度神经网络提取的增强特征表示, 用于检测漏洞.
                    上述基于深度学习的漏洞检测方法主要关注于代码实例                     (如某个函数) 本身的特征, 忽略了不同代码实例之
                 间可能存在的结构相似性关联. 实际上, 不同函数实例间可能存在结构相似性, 即不同代码会因相似的实现方式,
                 产生类似的漏洞. 基于此, 本文以代码函数作为漏洞检测的粒度, 提出了一种基于函数间结构特征关联的软件漏洞
   210   211   212   213   214   215   216   217   218   219   220