DeepVD Toward Class-Separation Features for Neural Network Vulnerability Detection

0 Abstract

包括深度学习(DL)在内的机器学习(ML)的进步使几种方法能够隐式学习易受攻击的代码模式,从而自动检测软件漏洞。最近的一项研究表明,尽管取得了成功,但现有的基于ML/DL的漏洞检测(VD)模型在区分两类漏洞和良性代码方面的能力有限。我们提出了DEEPVD,这是一种基于图的神经网络VD模型,强调漏洞和良性代码之间的类分离特征。DEEPVD在不同的抽象级别上利用了三种类型的类分离功能:**语句类型(类似于词性标记)、后支配树(涵盖常规执行流)和异常流图(涵盖异常和错误处理流)。**我们使用13130种易受攻击的方法,在303个项目的真实世界漏洞数据集中进行了几个实验来评估DEEPVD。我们的研究结果表明,与最先进的基于ML/DL的VD相比,DEEPVD的准确率相对提高了13%–29.6%,召回率为15.6%–28.9%,F评分为16.4%–25.8%。我们的消融研究证实,我们设计的功能和组件有助于DEEPVD实现漏洞和良性代码的高度可分离性。

1 Intro or Overview

1.1 Problem and Challenge

提出了DEEPVD,这是一种基于图的神经网络VD模型,其目标是利用强调脆弱性和良性类别之间的类分离的特征。我们以以下见解设计DEEPVD。首先,当程序通过一个方法执行时,执行可以以两种方式进行:1)从方法m的开始到m的出口点的规则流,以及2)从m开始到异常/错误处理点的异常/错误操作流。漏洞的主要原因之一是对异常和错误案例的处理不当。例如,程序可能会在输入的数据验证中遗漏一个案例,从而导致通过精心编制的输入进行注入攻击(第二节)。因此,对于方法m,我们捕获从m的输入到异常/错误处理点的程序切片。这些切片被组合成一个数据结构,称为异常流图(EFG)[20]。EFG预计由关键程序元素及其依赖项组成,这些元素与异常/错误的错误处理有关,从而导致漏洞。

其次,在使用EFG来处理程序中的异常流时,我们还考虑了规则流的每个方法的后支配树(PDT)[21]。PDT是一个树,其中每个节点表示一个语句,每个边表示后优势关系。如果从s开始到方法出口点的所有路径都必须经过d,则语句d被视为另一个语句s的后支配者。虽然PDT比CFG更简单,但它可以帮助模型学习在通往出口点的规则流中s和d的执行之间的关联。如果d崩溃,s的执行路径将永远不会到达出口点。

第三,根据Checkmarx[22]的漏洞分析,漏洞代码通常涉及特定的语法类型。因此,我们用一种相当于自然语言处理(NLP)中的词性(POS)标记的技术来增强EFG。POS标记已被证明可以提高下游NLP任务(文本到语音转换[23]、名称实体识别[24]等)的性能。这种标记也应用于代码补全,以实现高精度[25]。对于图表示中的每个语句节点,我们将其与一个语句类型相关联,因为漏洞通常与特定的语句类型相关,例如数组声明/引用、指针声明/引用,赋值和表达式[14],[22]。语句类型补充了EFG和PDT捕获的语义依赖关系,并改进了类分离。EFG和PDT被编码并馈送到VD的标签图卷积网络(标签GCN)[26]和树LSTM[27]中。

1.2 Motivation

1.3 Contribution

2 Architecture & Method

2.1 System Overview

image-20240321210200935

1) 代码序列:方法M的代码标记序列在VD中很重要,因为它包含具体的词法值。我们使用lexer来解析和收集给定方法中的所有词法代码标记。我们将语句视为句子,将代码标记视为单词,并使用嵌入模型来生成所有代码标记的向量表示。在获得所有令牌的嵌入后,我们使用门控递归单元(GRU)[29]来生成整个序列的向量。然后,我们应用空间金字塔池(SPP)[30]来逐步减小GRU产生的向量的空间大小。最后,我们在给定的方法M中获得了表示代码序列的特征向量FCS。

2) AST上的长路径:作为源代码的重要组成部分,抽象语法树(AST)承载着结构和句法信息。直接使用基于树的嵌入模型的AST结构可能会产生较高的计算成本。相反,我们选择长路径而不是从方法体构建的AST。长路径是指从一个叶节点开始,到另一个叶结点结束,并通过AST的根节点的路径。如先前的工作[31]、[32]所示,可以通过AST节点上具有特定长度的路径来捕获和表示AST结构。以长路径中的节点为例,我们使用嵌入模型、基于注意力的GRU层[33](对于AST结构),然后使用SPP[30]来构建表示给定方法的长路径的向量FLP(第IV节)。

3) 后支配树(PDT):我们首先根据Ferrante等人[21]中的算法构建PDT。由于PDT是树形结构的,我们选择使用tree-LSTM[27]来执行PDT的表示学习,这是一种基于树的神经网络模型,已在源代码中表现良好。另一种设计是将支配后关系添加到EFG中,并使用基于图的神经网络模型来学习表示。我们不选择这种替代方案,因为基于图的模型必须学会区分PDT和EFG中的两种类型的关系。PDT中的每个节点都是一个语句。我们将标记视为单词,将语句视为句子,并使用嵌入模型来构建所有标记的向量。嵌入将经过SPP,然后使用树LSTM模型来生成该方法的特征向量FPDT(第五节)。

4) 异常流图(EFG):我们遵循Allen和Horwitz[20]中的算法为给定的方法构建EFG。与PDT中一样,每个EFG节点代表一个语句,因此,我们使用单词嵌入模型和SPP层执行相同的过程来为每个语句生成向量。在这一步骤之后,我们获得了一个图结构,其中每个节点(语句)都由一个向量表示。最后,我们将该图结构作为LabelGCN模型的输入,以生成特征向量FEFG(第六节)。

5) 调用关系:对于方法M,我们考虑调用方/被调用方方法中的调用/被调用语句。与M中的调用/被调用语句和M的调用/被叫语句一起,我们构建了一个星形图。该图中的每个节点都表示一个语句,因此,对于节点内容,我们使用与上面相同的过程来构建语句的向量。我们还应用网络嵌入Node2Vec[34]对节点进行编码。将表示节点内容和调用结构的向量组合以产生特征向量FCR(第VII节)。最后,使用多层感知器对所有的特征向量进行分类。

image-20240321210748419

3 Experiment and Evaluation

3.1 DataSet and Process

3.2 Evaluation

4 Conclusion

Summary