abstract
受各种代码表示图中手动定义漏洞模式的工作的启发,和图神经网络的不断发展。作者提出了Devign,一个基于图神经网络,使用图神经网络学习丰富的代码语义信息的模型。
它包括一个Conv模块,其功能是提取有用的特征来进行graph-level的分类。
模型是在人工标记的数据集上训练的,数据集是建立在四个大规模开源C项目上的。这些项目包含了高复杂性和多样性的真实源代码,而不是合成的代码。
结果表明Devign明显优于现有技术,平均提高了10.51%的准确率和8.68%的F1值。Conv模块平均提高了4.66%的准确率和6.37%的F1。
Introduction
漏洞查找在安全方面是一个严峻的有挑战性的任务。除了传统的静态分析,动态分析和symbolic execution。机器学习也逐渐成为了一个新的方法。
在早期的方法中,机器学习算法将人类专家手工制作的特征或模式作为输入,来检测漏洞。然而,漏洞的根本原因各不相同。这导致用手动定义的特征来描述众多库的所有漏洞是不切实际的。
为了提高现有方法的可用性,避免人类专家在特征提取方面的繁重工作,最近的工作研究了深度神经网络在更自动化的漏洞识别方法中的潜力。然而,现在的这些工作都有很大的局限性。
为此,作者提出了一种新的基于图神经网络的模型。该模型具有实际漏洞数据的复合规划表示,这使作者能够对一整套经典编程代码语义进行编码,以捕获各种漏洞特征。一个关键的创新是Conv模块,Conv模块通过利用传统的卷积和密集层进行图级分类,分层选择更粗糙的特征。此外,为了证明源代码的复合编程嵌入和所提出的图神经网络模型在漏洞识别这一具有挑战性的任务中的潜力,作者用C语言从4个库中手动标记了数据集。作者将该模型命名为Devign
-
- 在复合代码表示中,以AST为中心,将不同级别的数据依赖和控制依赖编码为联合图,其中不同类型的边代表不同的依赖特征。这种复合代码表征综合了各种信息,尽可能广泛的捕捉漏洞类型和漏洞模式,使得GNN能够更好的学习节点表征。
- 提出了带有Conv模块的门控图神经网络模型,用于图级分类。Conv模块从节点特征中分层学习,以捕获用于图级分类任务的更高级别的表示。
- 为了devign模型,作者从4个流行的C库中收集人工标记数据集来进行实验。实验结果表明,Devign比现有方法平均提高了10.51%的准确率和8.68%的F1值,而Conv模块带来了4.66%的精度和6.37%的F1值,将Devign应用到从4个项目中收集到的40个最新的CVE中,得到了74.11%的准确率,在发现新漏洞方面体现了该模型的可用性。
Devign Model
利用代码属性图手工构建的漏洞模式,集成了所有语法和依赖语义,已被证明是检测软件漏洞的最有效方法之一。受此启发,我们设计了Devign,在代码属性图上的自动化上述过程,使用图神经网络学习漏洞模式。
2.1 Problem Formulation
大多数机器学习或基于模式的方法在源文件或应用程序的粗粒度级别预测漏洞。
2.2 Graph Embedding Layer of Composite Code Semantics
如图1,图嵌入层EMB是从函数代码ci到作为模型输入的图数据结构的映射
在下一节中,描述了为什么以及如何利用经典代码表示将代码嵌入到用于特征学习的复合图中的动机和方法。
2.2.1 Classical Code Graph Representation and Vulnerability Identification
在程序分析中,程序的各种表示被用来表现文本代码背后更深层次的语义,其中经典概念包括AST、控制流和数据流图,它们捕捉源代码的不同标记之间的句法和语义关系。大多数漏洞(如内存泄漏)过于小,如果不共同考虑复合代码语义,就无法发现。通过将AST与控制流图相结合,它能够覆盖另外两种类型的漏洞,即资源泄漏和一些释放后使用的漏洞。通过进一步集成这三个代码图,可以描述除了两个需要额外外部信息的类型之外的大多数类型。
除了以上的三种经典的代码结构,Devign还考虑了源代码序列本身,因为它的flatten结构能以一种“人类可读”的方式捕获代码token之间的联系。接下来分别介绍各种类型的代码表示,以及如何将个各种子图表示为一个联合图。下图(a)是整数溢出代码示例,(b)是图表示。
2.2.2 Graph Embedding of Code
-
- Abstract Syntax Tree (AST) :是一种源代码的树形结构表示,它是代码解析器用来理解程序的基本结构和检查语法错误的第一步表示,因此,它是生成许多其他代码表示的基础。AST的节点集包括本文使用的其余三种代码表示的所有节点,从根节点开始,代码被分解为代码块、语句、声明、表达式等等,最后分解为形成叶节点的token。如图2所示,第一行是代码级别,越往下越细致,蓝色框是叶子节点,紫色箭头表示父节点和子节点的关系。
- Control Flow Graph (CFG) :CFG描述了程序在执行过程中可能要遍历的所有路径。路径选择是由条件语句决定的,例如if, for, switch语句。节点表示语句和条件,节点之间通过有向边连接,表示控制的传递。如图2所示,绿色箭头表示的是CFG图的边。
- Data Flow Graph (DFG):DFG跟踪了CFG中变量的使用情况。数据流是面向变量的,任何数据流都涉及对某些变量的访问或修改,DFG中的边表示对相同变量的后续访问或修改。如图2所示,橙色双箭头表示DFG图的边,并在边上标注了涉及的变量。
- Natural Code Sequence (NCS) :体现了源代码的自然顺序,反映了源代码序列所体现的编程逻辑。如图2所示,红色箭头表示NCS的边,连接了AST所有的叶子节点。
以上,Devign将一个C函数表示成一个联合图形式(包含4个子图),所有的节点就是AST的节点集合,使用预训练的word2vec模型和构建在整个项目源代码文件上的代码语料库,分别对节点的code和type编码,将两部分编码concat作为节点的初始表征。
2.2.3 Gated Graph Recurrent Layers
图神经网络的关键思想是嵌入来自局部邻域的节点表示通过邻域聚合。本文选择门控图递归网络来学习节点嵌入,因为它允许比其他更深入,并且更适合我们的具有语义和图结构的数据。
2.2.4 The Conv Layer
来自门控图递归层的生成的节点特征可以用作任何预测层的输入,例如,用于节点或链路或图级预测,然后可以以端到端的方式训练整个模型。在我们的问题中,我们需要执行图级分类的任务来确定函数ci是否易受攻击。图分类的标准方法是全局地收集所有这些生成的节点嵌入。在我们的问题中,每个代码表示图都有自己预定义的顺序和相邻矩阵中编码的节点的连接,并且节点特征是通过门控递归图层而不是需要对来自不同通道的节点特征进行排序的图卷积网络来学习的。因此,我们直接应用一维卷积和密集神经网络来学习与图级任务相关的特征,以获得更有效的预测。
evaluation
- Q1:Devign相比其他源代码漏洞检测方法,效果如何?
- Q2:对于图级分类任务,Conv模块驱动的Devign与平坦求和的Ggrn相比如何?
- Q3:Devign能从各种类型的代码表示中学习吗?具有复合图的Devign模型如何与单边图相比有什么优势?
- Q4:在真实场景中,相比于静态分析器,Devign是否有更好的性能?
- Q5:在CVE公开报告的最新漏洞上,Devign的表现如何?
作者从四个大型C语言开源项目(Linux Kernel、QEMU、Wireshark和FFmpeg)中收集了高质量的易受攻击函数数据集。
结果显示,在大多数情况下,Devign在准确性和F1得分方面优于其他方法。
- Q1:Devign的表现强于其他方法。
- Q2:Devign模型与Ggrn模型相比,准确率平均提高3.23%。
- Q3:对于Ggrn模型,复合图和单一图的区别不大,而对于Devign模型,复合图的效果优于单一图。