赞
踩
受各种代码表示图中手动定义漏洞模式的工作的启发,和图神经网络的不断发展。作者提出了Devign,一个基于图神经网络,使用图神经网络学习丰富的代码语义信息的模型。
它包括一个Conv模块,其功能是提取有用的特征来进行graph-level的分类。
模型是在人工标记的数据集上训练的,数据集是建立在四个大规模开源C项目上的。这些项目包含了高复杂性和多样性的真实源代码,而不是合成的代码。
结果表明Devign明显优于现有技术,平均提高了10.51%的准确率和8.68%的F1值。Conv模块平均提高了4.66%的准确率和6.37%的F1。
漏洞查找在安全方面是一个严峻的有挑战性的任务。除了传统的静态分析,动态分析和symbolic execution。机器学习也逐渐成为了一个新的方法。
在早期的方法中,机器学习算法将人类专家手工制作的特征或模式作为输入,来检测漏洞。然而,漏洞的根本原因各不相同。这导致用手动定义的特征来描述众多库的所有漏洞是不切实际的。
为了提高现有方法的可用性,避免人类专家在特征提取方面的繁重工作,最近的工作研究了深度神经网络在更自动化的漏洞识别方法中的潜力。然而,现在的这些工作都有很大的局限性。
为此,作者提出了一种新的基于图神经网络的模型。该模型具有实际漏洞数据的复合规划表示,这使作者能够对一整套经典编程代码语义进行编码,以捕获各种漏洞特征。一个关键的创新是Conv模块,Conv模块通过利用传统的卷积和密集层进行图级分类,分层选择更粗糙的特征。此外,为了证明源代码的复合编程嵌入和所提出的图神经网络模型在漏洞识别这一具有挑战性的任务中的潜力,作者用C语言从4个库中手动标记了数据集。作者将该模型命名为Devign
利用代码属性图手工构建的漏洞模式,集成了所有语法和依赖语义,已被证明是检测软件漏洞的最有效方法之一。受此启发,我们设计了Devign,在代码属性图上的自动化上述过程,使用图神经网络学习漏洞模式。
大多数机器学习或基于模式的方法在源文件或应用程序的粗粒度级别预测漏洞。
如图1,图嵌入层EMB是从函数代码ci到作为模型输入的图数据结构的映射
在下一节中,描述了为什么以及如何利用经典代码表示将代码嵌入到用于特征学习的复合图中的动机和方法。
在程序分析中,程序的各种表示被用来表现文本代码背后更深层次的语义,其中经典概念包括AST、控制流和数据流图,它们捕捉源代码的不同标记之间的句法和语义关系。大多数漏洞(如内存泄漏)过于小,如果不共同考虑复合代码语义,就无法发现。通过将AST与控制流图相结合,它能够覆盖另外两种类型的漏洞,即资源泄漏和一些释放后使用的漏洞。通过进一步集成这三个代码图,可以描述除了两个需要额外外部信息的类型之外的大多数类型。
除了以上的三种经典的代码结构,Devign还考虑了源代码序列本身,因为它的flatten结构能以一种“人类可读”的方式捕获代码token之间的联系。接下来分别介绍各种类型的代码表示,以及如何将个各种子图表示为一个联合图。下图(a)是整数溢出代码示例,(b)是图表示。
以上,Devign将一个C函数表示成一个联合图形式(包含4个子图),所有的节点就是AST的节点集合,使用预训练的word2vec模型和构建在整个项目源代码文件上的代码语料库,分别对节点的code和type编码,将两部分编码concat作为节点的初始表征。
图神经网络的关键思想是嵌入来自局部邻域的节点表示通过邻域聚合。本文选择门控图递归网络来学习节点嵌入,因为它允许比其他更深入,并且更适合我们的具有语义和图结构的数据。
来自门控图递归层的生成的节点特征可以用作任何预测层的输入,例如,用于节点或链路或图级预测,然后可以以端到端的方式训练整个模型。在我们的问题中,我们需要执行图级分类的任务来确定函数ci是否易受攻击。图分类的标准方法是全局地收集所有这些生成的节点嵌入。在我们的问题中,每个代码表示图都有自己预定义的顺序和相邻矩阵中编码的节点的连接,并且节点特征是通过门控递归图层而不是需要对来自不同通道的节点特征进行排序的图卷积网络来学习的。因此,我们直接应用一维卷积和密集神经网络来学习与图级任务相关的特征,以获得更有效的预测。
作者从四个大型C语言开源项目(Linux Kernel、QEMU、Wireshark和FFmpeg)中收集了高质量的易受攻击函数数据集。
结果显示,在大多数情况下,Devign在准确性和F1得分方面优于其他方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。