1.基本信息
2022 IEEE 46th Annual Computers, Software, and Applications Conference (COMPSAC) CCF-C
作者:美国肯尼索州立大学计算机科学系
对用于深度学习检测漏洞代码模型的分析
综述性论文
2.论文概述
很少有研究明确地将深度学习模型用于软件漏洞检测。本调查旨在拓展这一研究领域,提供一个不同的视角。概述用于训练深度学习模型的数据集的性质,如:合成码、半合成码和实码。深入研究流行的源代码表示,以捕获未标记源代码的语义信息。在此基础上,提出了漏洞检测中的深度学习模型及其评价指标。
论文检索
作者首先通过关键词:Source Code Vulnerability Detection”, “Software Vulnerability Detection using Deep Learning”, “Automatic Detection OR Discovery of vulnerability”, “Deep Learning detect Software Vulnerability”在四大数据库(i) IEEE Xplore (ii) arXiv e-Print Archive (iii) ACM Digital ibrary and (iv) Google Scholar.中搜索相关论文。
作者设置了一个符合要求的论文条件,我们共处理了303篇研究论文,通过对出版物标题、摘要、实验结果和结论的深入筛选,最后缩短为10篇论文供研究。
源码表示
AST
抽象语法树(AST)是源代码的树表示,它可以捕获代码块的抽象语法结构和语义,从而允许对源代码进行静态分析[17,18]。这个过程允许将初始输入源代码划分为更小的部分,并实现函数级源代码[13]的更大粒度。AST可以通过使用CodeSensor[18]、[19]或Pycparser[7]等解析器来获取。虽然可以直接使用这些ast,但由于代码较大或复杂的[16],它缺乏粒度。因此,在[7]中,AST树可以被认为是一棵m-ary树,强制将其转换为一个完整的二叉AST树,以保留其与AST节点的结构关系。类似地,也有人提出了一种名为tree - lstm的RNN模型,该模型利用自底向上的计算,将所有AST子节点的输出整合在一起,构建了一棵二叉AST树[18],[20]。
Code Gadgets
代码小工具是由多行程序语句组成的,这些语句通过实现程序切片[22],在数据依赖和控制依赖[3]方面具有语义相关性。程序切片可以分为两种类型的切片:前向和后向[3]。前向切片是从外部输入接收的代码片,例如file o sockets;然而,后向切片不从运行程序的环境接收外部的直接输入[2],[21]。
Forward slices are the slices of code that are received from an external input, such as file o sockets; whereas, backward slices do not receive an direct input externally from the environment in which the program is run
通过分析程序的数据流和控制流[22]来分解程序,可以减少代码行数,并将重点放在库/API函数调用、数组或指针的关键点上。VulDeePecker[3]只负责代码小工具[8]和[21]中的数据依赖,因为它使用商业工具Checkmarx[25],并对每个参数执行向前和向后切片,然后组装成代码小工具。在Zagane的模型[23]中,数据集包含420,627个代码片,其中包括56395个脆弱代码片,并计算每个片的代码度量值用于其深度学习模型。
CPG
代码属性图(CPG)是表示一个源的经典数据结构的融合,即抽象语法树、控制流图(CFG)和程序依赖图(PDG)[26]。REVEAL[1]漏洞预测框架利用了一种改进的CPG,而不是Yamaguchi等人[26]所表示的数据结构,通过添加数据流图(DFG)与现有的CPG相结合,以捕获代码中关于语义的额外上下文。在源代码表示上,Devign[5]采用了类似CPG的方法,将AST、CFG、DFG和自然代码序列(NCS)的概念合并成一个联合图。
lex表示
Russell等人[6]为C/ c++代码构造了一个自定义词法器,它以156个标记作为词汇表大小的代码表示。这种方法包括关键字、操作符、分隔符,但在编译方面排除了无关代码。lexer将代码转换为三种不同类型的标记。由于与漏洞检测的相关性,字符串、字符和浮点字面值被词法化为特定类型的占位符,而整数字面值则被逐位标记。来自通用库的类型和函数调用被映射到它们的泛型版本。Zheng等人[19]在Draper VDISC数据集的文本上实现了这个用于字级标记化的自定义词法分析器。
Semantics-based Vulnerability Candidates (SeVC)
基于语义的漏洞候选语句是通过提取SyVC的程序片[19]在语义上与SyVC相关的各种语句。为了使sevc概念化,需要探讨SyVC这个术语。SyVCs提取需要将源代码转换为包含多个连续令牌的AST。遍历AST以查找与定义的漏洞语法相匹配的代码元素,该语法被标记为SyVC[4]。通过对[22]进行程序切片,将SyVCs转换为sevc,基于数据依赖和控制依赖来捕获语句的语义关系。Joern[24]工具提取每个SyVC的PDGs;然后,从过程间的向前和向后切片[27]生成程序片,并将其转换为sevc[4]。
深度学习模型
接下里作者一次介绍了CNN、RNN、LSTM和GRU。
RNN允许比CNN[6]提取更长的令牌依赖,因为它的“内存”包含来自前一个和下一个令牌的信息,LSTM是RNN架构的扩展版本,可以学习长期依赖关系。GRU是LSTM的一个替代版本,它的引入避免了消失梯度问题,提高了LSTM的效率。
数据集
挑战和未来工作
数据集是训练漏洞预测模型的重要组成部分。正如本文所调查的,各种研究利用各种数据集,如SARD &NVD或REVEAL数据集,以训练他们的模型,这表明缺乏一个涵盖大多数CWE漏洞的标准化基准数据集。因此,无法产生一个统一和标准化的评估深度学习模型的指标。此外,深度学习模型需要大量的训练数据才能提供出色的性能,而目前的数据集在这方面还很不足。因此,开发此类漏洞数据集是解决地面真实数据集问题的一个重要研究方向。如图5所示,脆弱代码与非脆弱代码的比例趋于惊人的不平衡。非脆弱代码大量存在,而脆弱代码数量极少,导致深度学习漏洞预测模型缺乏检测漏洞的训练数据,导致模型过拟合。在特定的CWE漏洞中存在类别不平衡,如Draper VDISC数据集中存在的CWE 469导致预测不良,而CWE 119大量存在导致在交叉验证期间模型中对该漏洞的最佳预测。
深度学习模型具有非线性和隐藏层,这使得解释导致漏洞预测的行为变得困难,这回避了以下问题:模型准确吗?漏洞发现的预测可靠吗?在某个特定的源代码片段中,将脆弱或非脆弱分类的原因是什么?研究人员用两种方法解决了这个问题。首先,利用LIME[10]创建神经网络的线性模型,进行简单的解释。