Page 196 - 《软件学报》2025年第10期
P. 196

郑炜 等: 基于抽象语法树变异的漏洞样本生成方法                                                        4593


                    代码相似性检测是一种主要用于检测代码克隆                 [11] 导致的漏洞的方法, 即认为相似的程序可能存在相同的漏
                 洞  [12] . 相关研究采用了不同的方法来识别漏洞, 如基于词令牌           [13] 、代码文件行标记   [14] 、代码中的函数名和类型名       [15]
                 进行向量比较或近似匹配, 或利用抽象语法树               [16] 、图  [17] 、子图同构匹配  [18] 来表示和查找漏洞代码段中的语法结
                 构或语义特征. 总之, 代码相似性检测是一种主要用于检测由代码克隆导致的漏洞的方法, 它基于代码的结构或语
                 义特征来查找和比较相似的代码段. 尽管代码相似性检测在某些场景下有效, 但它的适用范围有限. 对于高难度克
                 隆, 如函数名称改变或代码结构不同但语义相似的情况, 其检测准确率较低.
                    规则检测是一种能够对非克隆代码进行漏洞检测的方法, 通过安全知识领域专家手工定义漏洞规则, 利用数
                 据流分析和静态污点分析         [19] 等技术标记程序状态, 分析跟踪的数据信息            [20] 是否会影响某些程序操作, 进而检测
                 到程序漏洞. 早期出现的       Flawfinder、RATS、ITS4  [21] 、Clang  等开源工具使用了较为简单的漏洞规则和解析器,
                 在实际使用时导致误报率和漏报率过高. 基于规则的商业检测产品也陆续出现, 包括                              Checkmarx、Fortify、
                 Coverity [22] 等. 总之, 规则检测是一种通过专家定义的漏洞规则来检测非克隆代码中的漏洞的方法, 它结合了数据
                 流分析和静态污点分析等技术来标记和分析程序状态. 尽管基于规则的检测方法可以精确地定位到漏洞行, 但它
                 仍然存在一些问题. 首先, 它高度依赖于专家的主观判断来定义检测规则, 这可能导致一些误报和漏报. 其次, 由于
                 规则的固定性, 它可能难以检测出新出现的或未知的零日漏洞.
                  1.2   基于深度学习的软件漏洞检测方法
                    随着神经网络技术的成熟和运算能力的提升, 基于深度学习的软件漏洞检测成为研究热点                               [23−29] . 由于基于深
                 度学习的方法可以自动提取不同漏洞类型的特征, 不依赖于专家的手动提取, 为漏洞检测技术的发展带来了契机.
                 Li 等人  [ 30 ] 提出将深度学习用于代码漏洞检测中, 并指出表征形式的重要性, 其所设计的漏洞检测工具
                 VulDeePecker 采用基于语义信息的数据依赖图对代码进行表征, 使用                BiLSTM  模型对库/API 函数进行检测. 针对
                 VulDeePecker 存在的不足  (只适应一种漏洞类型、只采用数据依赖进行代码表征、只采用了一种深度学习模型),
                 该团队进一步提出       SySeVR [26] , 一个基于深度学习的漏洞检测系统框架, 支持基于语法和语义相结合的代码表征
                 形式, 通过辅助构建的数据集对该框架实用性进行了验证, 其检测性能指标                       F1-Score 可达  0.95  以上. 相对于  Vul-
                 DeePecker, SySeVR  可支持不同的深度学习模型, 并且理论上可以支持所有类型的漏洞检测                   (只要有相应数据集).
                    Cheng  等人  [24] 采用图卷积网络将代码片段嵌入低维表征形式中进行尝试, 该表征形式保留了漏洞代码的控制
                 流信息, 实验结果表明该方法优于          VulDeePecker [30] 以及基于词嵌入方法的深度学习模型效果.
                    Gao  等人  [27] 提出二进制文件漏洞检测工具      VulSeeker, 将控制流图和数据流图相结合进行语义表征, 通过深度
                 神经网络模型进行块级特征          (例如库函数调用次数、逻辑运算次数) 提取并生成函数嵌入向量, 最后通过余弦距
                 离来测量目标函数与训练样本函数的相似性, 进而实现漏洞函数检测. 实验结果显示, VulSeeker 的漏洞检测能力
                 显著优于基准方法       Gemini.
                    Zhou  等人  [28] 采用抽象语法分析树、数据流图、控制流图以及词法序列这                 4  种不同代码表征形式, 提出基于
                 通用图神经网络的模型        Devign, 通过  Conv  模块从表征图节点信息中抽取特征进行图级分类. 为验证模型有效性,
                 其团队基于实际      C  语言开源项目花费大量时间手动标注两个公开数据集, 实验结果表明, Devign                    优于  3  种基准模
                 型  3-layer BiLSTM、3-layer BiLSTM+Att 和  Metrics+XGBoost.
                    Russell 等人  [29] 开发了一个大规模函数级漏洞检测系统, 该系统主要针对              C/C++开源代码漏洞的检测, 通过深
                 度表征学习对代码进行词法解析. 基于实际软件项目数据和源于                     NIST、SATE IV  等数据集对深度表征学习方法
                 进行验证, 最大    F1-Score 可达  0.80, 显著优于漏洞检测工具     Clang、Flaw  和  Cppcheck.
                    Chakraborty  等人  [31] 进一步对  VulDeePecker、SySeVR、Devign  等主流技术进行了表征方式、数据分布、模
                 型选择等方面的比较, 发现工具的性能受数据重复、类不平衡的不利影响, 导致模型学习到大量漏洞无关的特征,
                 最终这些工具在实际项目评测时的性能大约下降了                  50%, 这也直接反映了当前基于深度学习的漏洞检测方法存在
                 的问题.
                    与传统漏洞检测方法相比, 已有研究表明当前基于深度学习的漏洞检测技术, 在检测准确性和效率方面有所
   191   192   193   194   195   196   197   198   199   200   201