Abstract
- 评估了现有的5大类11种代表性的基于深度学习的漏洞检测模型(即基于标记的、基于树的、基于图的和预训练的)
- 提出5种指标评估模型的效果
- 预训练模型和卷积神经网络通常优于其他模型和网络
- 泛化性:预训练由于数据来源更广泛,效果更好
- 互补性:模型之间可以互相补充检测结果
- 鲁棒性:随着代码突变,检测能力降低
- 扩展性:卷积网络检测时间更短
- 打包了11个模型并统一了接口
Intro
Models categories
- Tree based: AstGRU:分析函数的AST,并进行遍历搜索,将复杂的树结构转换为普通序列
- Graph based: Vul-CNN: 提取函数的依赖图PDG,然后通过社交网络中心性分析将其转换为图像。收集到图像后,使用CNN进行漏洞检测
Social network centrality analysis是一种社交网络分析方法,用于研究社交网络中节点(即个人或组织)的重要性或影响力。
- Graph based: Devign: 提取代码属性图(CPG),应用图神经网络GNN检测漏洞
Contribution
在同一的数据集上比较这些检测工具。参与比较的有:
- Token based
- TextCNN
- LSTM
- GRU
- AST based
- Code2Vec
- AstGRU
- Graph based
- VulCNN
- Devign
- Reveal
- Pre-train
- Bert
- Codebert
- VulBERTa
实验结果:
Effectiveness
CNN > Others
Pre-train > Others
Generalizability
- Pre-train > Others
Complementarity
- Graph based + Pre train = ↑
- LSTM + TextCNN
- CodeBERT + VulBERTa
Robustness
- Pre train √
- AST based ×:破坏了AST结构
Scalability
- CNN √
- Graph based / Pre train ×:参数和操作较多
How Vulnerability Detections work
Train stage
- Pre-processing: Code to structed data: AST, PDG, CFG;
- Extract features: 提取了可用于训练的特征向量;词嵌入、AST路径嵌入、图嵌入
- Training:输入:上一步提取的特征向量 输出:softmax函数输出的预测分布
Detection stage
- 对测试集的样本以相同方式进行预处理和特征提取
- 发送至模型,预测样本是否存在漏洞
Models, datasets and Evaluation metrics
Models
Token based
TextCNN:基于CNN,进行少量调参并使用静态词向量,就能获得较好的文本分类性能。
LSTM:基于RNN,解决了梯度消失和梯度爆炸。当用作文本分类器时,可以有效地捕获文本上下文词之间的关联属性,并通过其遗忘门结构过滤无效信息。
梯度消失和梯度爆炸
梯度消失和梯度爆炸是深度神经网络在训练过程中常见的问题。两者都与深度神经网络中的反向传播算法有关。
梯度消失:在深度神经网络中,反向传播算法通过计算损失函数对每个权重参数的偏导数来更新参数。当网络层数增加时,反向传播算法的梯度会在每一层中逐渐变小,最终可能会变得非常小,导致参数更新变得非常缓慢或停滞不前。这种现象称为梯度消失。
梯度爆炸:与梯度消失相反,梯度爆炸是指在反向传播算法中,梯度值变得非常大,导致参数更新变得非常快,甚至出现参数值溢出的情况。这种现象称为梯度爆炸。
梯度消失和梯度爆炸都会影响深度神经网络的训练效果和收敛速度。梯度消失通常发生在深度循环神经网络(RNN)等网络中,而梯度爆炸通常发生在卷积神经网络(CNN)等网络中。为了避免梯度消失和梯度爆炸的影响,通常采用一些技巧和方法,例如使用不同的激活函数、归一化技术(如Batch Normalization)、梯度裁剪等,以提高网络的稳定性和训练效果。
GRU:和LSTM类似,没有输出门,参数更少
AST based
Code2vec
- 代码分解为AST的路径集合
- 模型学习每条路径的原子表示,以及如何聚合多个语法路径
- 基于AST预测可能的方法名称
ASTGRU:双门控循环单元 (Bi-GRU) 网络
源代码由向量表示,保留了所有语法特征但减少了不必要的数据冗余
使用Bi-GRU学习漏洞特征,并打包填充方法,使得Bi-GRU可以处理长度不等的数据
建立在基于SARD的Juliet的数据集上,这个数据集具有较好的质量
Bi-GRU
Bi-GRU是一种双向门控循环单元(Bidirectional Gated Recurrent Unit)神经网络,是循环神经网络(RNN)的一种变种。与标准的GRU相比,Bi-GRU具有双向性,可以同时考虑前向和后向的上下文信息。
在Bi-GRU中,输入数据序列首先被分别输入到前向和后向的两个GRU层中,每个GRU层包含一个隐藏状态向量,可以通过门控机制来控制信息的流动。前向GRU层从前向后处理输入序列,后向GRU层则从后向前处理输入序列。两个GRU层的输出在每个时间步骤上通过一个合并层进行拼接。这种结构可以有效地捕获输入序列中的上下文信息,从而提高模型的性能。 Bi-GRU广泛应用于自然语言处理(NLP)任务中,例如文本分类、机器翻译、命名实体识别等。它可以捕获单词或字符级别的上下文信息,以更好地理解和处理自然语言文本中的语义和语法结构。
Graph based
VulCNN:
- 程序语义提取为程序依赖图PDG
- 对PDG执行社交网络中心性分析,转换为图像
- 图像送入CNN
- More scalable
PDG
程序依赖图是指程序中各个元素之间的依赖关系所构成的图形结构。程序依赖图可以描述程序中各个模块或变量之间的依赖关系,包括数据依赖、控制依赖和调用依赖等。
数据依赖是指程序中某个变量的值依赖于另一个变量的值,或者某个计算的结果依赖于前面的计算结果。例如,在一个数值计算程序中,某个变量的值可能依赖于前面计算的结果,或者依赖于另一个变量的值。
控制依赖是指程序中某个语句或代码块的执行取决于另一个语句或代码块的执行结果。例如,程序中的if-else语句和循环语句就是典型的控制依赖结构。
调用依赖是指程序中一个函数或方法的执行依赖于另一个函数或方法的执行结果。例如,在一个程序中,某个函数可能会调用另一个函数来完成某些任务,这就构成了调用依赖关系。
通过构建程序依赖图,可以对程序的结构和执行过程进行分析和优化。程序依赖图可以帮助开发人员理解程序中各个元素之间的关系,发现潜在的性能瓶颈和安全漏洞,并进行程序的重构和优化。
Devign
- 基于图神经网络的模型
- 学习代码的语义表示并进行图分类
- 基于手动标记的数据集,具有更好的复杂性和真实性多样性
Pre-trained
预训练模型通常在大型开源语料库上进行预训练,以学习语法和语义的深度表示。
- BERT:一种预训练模型,它使用一个额外的输出层进行微调,以便在大量句子级和标签级任务上表现良好。
- CodeBERT:BRT的扩展,是一种编程语言和自然语言的双峰预训练模型
- VulBERTa:已经在大量开源C/C++环境中进行预训练,在cpp领域表现良好