Devign基于GNN的源代码漏洞检测

Devign基于GNN的源代码漏洞检测
foresta.yangDevign: Effective Vulnerability Identification by Learning Comprehensive Program Semantics via Graph Neural Networks:NIPS(A) 2019,Yaqin Zhou et al.
0 Abstract
本文提出了Devign模型,一个基于GNN的源代码漏洞检测模型,使用GNN学习丰富的代码语义信息。该模型包括一个Conv模块,其功能是提取有用的特征来进行graph-level的分类。该模型在4个大型开源C项目上进行训练和测试,结果表明Devign明显优于现有技术,平均提高了10.51%的准确率和8.68%的F1值。
1 Intro or Overview
1.1 Problem and Challenge
1.2 Motivation
1.3 Contribution
本文提出了一种基于复合代码表示的图神经网络模型Devign,可以对程序语义信息进行完整的提取,用以各种捕捉漏洞特征。在复合代码表示中,以AST为中心,将不同级别的数据依赖和控制依赖编码为联合图,其中不同类型的边代表不同的依赖特征。这种复合代码表征综合了各种信息,尽可能广泛的捕捉漏洞类型和漏洞模式,使得GNN能够更好的学习节点表征。
提取复合代码表征后,经过门控GNN模块,通过对邻接节点信息的聚合和传递来得到各个节点的表征。最后,经过Conv模块选择与当前任务相关的节点和特征集合,应用一维卷积和dense层来对节点特征进行提取从而实现图级别的分类。
另外,为了验证复合程序编码表征的作用,以及使用GNN进行漏洞检测的效果,本文从4个流行的C库中收集人工标记数据集来进行实验。实验结果表明,Devign比现有方法平均提高了10.51%的准确率和8.68%的F1值,而Conv模块带来了4.66%的精度和6.37%的F1值,将Devign应用到从4个项目中收集到的40个最新的CVE中,得到了74.11%的准确率,在发现新漏洞方面体现了该模型的可用性。
2 Architecture & Method
2.1 System Overview
上图是Devign的整体架构,包含三个顺序的部分,首先是复合代码语义embedding层,该层将源代码编码为具有多种代码语义的联合图结构;**第二部分是GNN层,该层通过聚集和传递图中相邻节点的信息来学习节点的特征;**第三部分是Conv模块,提取有意义的节点表征用于图级别的分类预测。
- 复合代码表征
程序分析中的各种程序表示被用来显示程序的内在信息,比如AST,CFG,DFG(数据流图)等等捕捉了源代码的语法和语义关系。很多漏洞不考虑复合代码语义就无法发现,比如有研究表明,仅仅使用AST可以查找不安全参数的漏洞,而将AST与CFG结合则可以查找资源泄露和释放后使用漏洞。进一步,将AST,CFG,DFG联合使用,则可以检测多种类型的漏洞。
除了以上的三种经典的代码结构,Devign还考虑了源代码序列本身,因为它的flatten结构能以一种“人类可读”的方式捕获代码token之间的联系。接下来分别介绍各种类型的代码表示,以及如何将个各种子图表示为一个联合图。下图(a)是整数溢出代码示例,(b)是图表示。
- GNN层
图神经网络的核心思想是通过对相邻节点的信息进行聚合来embedding节点表征,本文使用门控递归图网络来学习节点表征。和正常的GNN一样,通过邻接矩阵来对邻接节点的信息进行聚合,将聚合节点和当前节点一起经过GRU网络得到下一时刻的当前节点。以此类推,经过T时刻,生成所有节点的最终的节点表征。
- Conv层
图分类的标准方法是将所有的节点特征线性的输入到MLP中然后通过softmax分类,这种方法没有注重重点。Conv模块用来选择与当前任务相关的节点和特征集合,应用一维卷积和dense层来对节点特征进行提取从而实现图级别的分类。
Evaluation
- Q1:Devign相比其他源代码漏洞检测方法,效果如何?
- Q2:Conv模块与普通的flatten的节点融合相比,有什么优势?
- Q3:复合图特征学习相比单一图有哪些优势?
- Q4:在真实场景中,相比于静态分析器,Devign是否有更好的性能?
- Q5:在CVE公开报告的最新漏洞上,Devign的表现如何?
上图是本文使用的数据集示例,本文评估了从4个大型C语言开源项目中收集的手工标记的函数,这些项目在开发人员中很流行,并且功能多样,例如Linux Kernel, QEMU, Wireshark和FFmpeg。
本文利用基于代码属性图的C/C++开源代码分析平台Joern来提取数据集中所有函数的AST和CFG,上图中的Ggrn意思是普通的flatten的节点融合。将DFG图分为3个子图,DFG_C表示变量的定义,DFG_R表示变量的最近一次读,DFG_W表示变量的最后一次写。下图展示了Devign模型与BiLSTM,BiLSTM-Attention,CNN,以及两种静态方法进行比较的实验结果。
下面回答之前提出的5个问题:
- Q1:可见Devign相比其他的模型,准确率和F1值都有明显的提高
- Q2:Devign模型与Ggrn模型相比,准确率平均提高3.23%,F1值平均提高3.92%,说明Conv模块提取了更多相关节点和特征用于图级分类
- Q3:对于Ggrn模型,复合图和单一图的区别不大,而对于Devign模型,复合图的效果优于单一图
- Q4:本文创建了一个具有10%漏洞的不平衡数据集,将Devign与著名的开源静态分析工具Cppcheck、Flawfinder和商业工具CXXX进行比较,Devign的F1平均值显著提高,提升幅度达到了27.99%
- Q5:本文分别提取了各个项目的最近的10个CVE漏洞来检查Devign是否可以识别0-day漏洞。通过对40个CVE漏洞的提交修复提取得到112个漏洞函数,将这些函数输入到经过训练的Devign模型中,平均准确率达到了74.11%,显示了Devign在实际应用中发现新漏洞的潜力。
Conclusion
本文提出了一种基于复合代码表示的图神经网络漏洞检测模型Devign, 该模型首先生成联合图提取图节点的复合代码表征,然后通过GNN对邻接节点的信息进行聚合来学习节点特征,最后通过Conv模块选择与当前任务相关的节点和特征集合,通过一维卷积和dense层来进行图级别的分类检测。以函数为检测粒度,针对C代码。