作者:锋哥很好 | 来源:互联网 | 2023-08-08 10:30
ACM Transactions on Software Engineering and Methodology(TOSEM)
ABSTRACT
作者针对目前基于机器学习的漏洞检测方法的不足,提出了一种新的方法,即同时考虑代码中的控制流、结构化信息以及跨函数的数据流信息,此外还利用了最新的图神经网络进行嵌入表示。作者将该方法实现为DeepWuKong模型,并使用现实世界中105428个C\C++程序进行评估,实验结果表明在静态代码分析问题中将传统程序分析和深度学习进行有效结合具有广阔的应用前景。
INTRODUCTION
现有基于机器学习的静态漏洞检测方法总体思路是构建一个检测模型,通过样本训练捕获易受攻击程序与其所提取程序特征之间的相关性,随后便可利用训练好的模型检测新程序中是否存在漏洞。然而这些方法大多侧重于检测低级内存错误,例如缓冲区溢出和释放后使用。然而,针对现实世界中的复杂漏洞,现有方法仍存在以下几个问题:
- 未执行过程间程序依赖性分析,即未考虑函数间的调用关系,仅可以得到局部函数的代码特征
- 常采用Word2Vec、Doc2Vec提取浅层代码特征,如代码标记、抽象语法树,而未考虑更全面的特征代码,如控制依赖、数据依赖
- 现有方法以粗粒度的方式在函数或文件级别检测漏洞,这种粒度的检测对开发人员精确定位并修复漏洞帮助不大
作者提出了DeepWuKong,一种基于深度学习的新方法,即利用图神经网络对代码的文本和结构化信息进行嵌入表示,以此来检测常见的C\C++漏洞。实际上,该方法主要对源代码特征提取和神经网络两部分提出了创新,将传统程序分析和深度学习进行了有效结合,并结合图神经网络挖掘代码的结构化语义。与传统的静态漏洞检测器和先进的基于深度学习的方法相比,DeepWuKong表现优异。
本文主要贡献如下:
- 提出了一种新的程序切片方法来提取复杂的高级语义特征,包括程序的数据流和控制流
- 提出了DeepWukong,利用图神经网络将代码的文本和结构化信息嵌入到全面的代码表示中,支持对10种常见C/C++漏洞的精确静态漏洞检测
- 构建了一个基准,包括105428个存在漏洞的C\C++程序,实验结果表明DeepWukong在多个评估指标下均表现优异。
- 程序切片
- 代码标记符号化与嵌入
- 深度图神经网络学习
主要包括两个阶段:训练阶段和检测阶段。
对于训练阶段,在(a.1)中,DeepWukong首先提取源代码的控制流图(CFG)和数据流图(VFG),分别计算源代码中的控制依赖和数据依赖关系,然后基于这些信息构建程序依赖图(PDG)。在(a.2)中,DeepWukong从程序敏感点(即切片标准)开始沿PDG进行向前和向后遍历,直到达到固定点,从而构建程序依赖图的子图XFG(即PDG的子图),从而保持程序的数据流和控制流。
为了精确地提取源代码的语义信息以训练神经网络,DeepWukong首先通过将用户定义的变量和函数映射到(b.1)中的规范符号名来进行变量名规范化,然后使用Doc2Vec将源代码的每个语句(即XFG上的每个节点)转换为向量表示,如(b.2)所示。
随后,将获得的结构化(XFG边)和非结构化信息(XFG上每个节点嵌入向量形式的代码标记)作为神经网络的输入,如(c.1)所示。然后使用三种图神经网络来评估基于深度学习的方法的性能,如(c.2)所示。最后,得到一个训练好的检测模型。
对于检测阶段,首先提取目标程序的控制和数据依赖信息(a.1),以生成一组切片(XFG)(a.2)。对于每个XFG,在符号化(b.1)和嵌入(b.2)之后,其边缘及其节点的代码标记都被用作特征(c.1),并被送到已训练好的模型中进行漏洞检测。
图卷积层,也称GCL层,在该层主要进行节点特征传播,核心计算公式如下:
图池化层,也称GPL层,通过应用一个池化率k来减小原图的节点数量,核心计算公式如下:
多层感知机,又称为MLP,主要负责最后的分类工作,核心计算公式如下:
EXPERIMENTAL EVALUATION
- Dateset
- Software Assurance Reference Dataset (SARD),一个被广泛使用的漏洞数据集,作者从其中选取了10种常见的C/C++漏洞
- 开源项目,包括redis-5.0.8和lua-5.3.4
对上述数据集进行标注,在此基础上标记XFG,然后处理重复冲突样本,并进行一定的数据分布平衡。
- Experimental environment and neural network configuration
NVIDIA GeForce GTX 1080 GPU,Intel Xeon E5-1620 CPU 3.5GHz,PyTorch Geometric
采用10折交叉验证进行模型训练,图中每个节点的向量表示维度设置为64,dropout设置为0.5,epoch设置为50,优化器采用Adam,学习率为0.001。
评估指标包括ACC、FPR、FNR、TPR、P、F1、AUC、IFN、MKN
C. Research Questions
RQ1 验证DeepWukong在漏洞检测任务中的有效性
使用三种不同的图嵌入方式,包括GCN、GAT、k-GNNs,其实验结果为
DeepWukong通过图嵌入方式自动学习代码中的高级语义特征,在漏洞检测任务中表现出优异的性能。此外,DeepWukong的性能与图神经网络类别无关,因为这三中图计算模型都显示出了良好的结果。总体来看,k-GNN的性能略优于其他两种图神经网络模型,因为它可以更好地捕获XFG的结构化和非结构化信息。
RQ2 将DeepWukong与传统的漏洞检测工具进行对比
传统的漏洞检测工具包括FLAWFINDER、RATS、CLANG STATIC ANALYZER和INFER。实验结果表明,传统的基于规则的检测方法不适用于检测现实世界中的复杂漏洞,而通过深度学习对控制和数据流信息嵌入的DeepWukong模型可以在不知道任何预定义反模式的情况下,能够有效地定位漏洞。
RQ3 将DeepWukong与现有的基于深度学习的漏洞检测方法进行对比
现有的基于深度学习的漏洞检测方法分别使用了TOKEN-BASED embedding、VGDETECTOR、VULDEEPECKER。实验结果表明,DeepWukong在图嵌入过程中保留了更加全面的代码信息(过程间的控制流和数据流信息),能够捕获漏洞的共同特征,并大大提高现有基于深度学习的方法的性能。
RQ4 验证DeepWukong在真实软件漏洞检测中的有效性
实验结果表明,DeepWukong可以有效地检测现实开源应用程序中的漏洞,并显著提高传统和基于深度学习的漏洞检测方法的性能。
LIMITATIONS
- 数据集打标签过程可能存在纰漏
- 程序敏感点的选取方式可能并非完美
- 仅局限于C/C++程序中的10种漏洞
CONCLUSION
作者提出一种基于深度学习的新方法,主要对源代码特征提取和神经网络两部分提出了创新,将传统程序分析和深度学习进行了有效结合,并结合图神经网络挖掘代码的结构化语义,以支持对广泛漏洞的检测。DeepWukong首先执行程序切片以提取细粒度但复杂的语义特征,然后与图神经网络相结合以生成紧凑的低维表示。将其应用于包含10种比较流行的C/C++漏洞和2个实际开源项目的10万多个易受攻击的程序,结果证明DeepWukong优于几种最先进的方法,包括传统的漏洞检测器和基于深度学习的方法。