CN111460450A - 一种基于图卷积网络的源代码漏洞检测方法 - Google Patents
一种基于图卷积网络的源代码漏洞检测方法 Download PDFInfo
- Publication number
- CN111460450A CN111460450A CN202010168037.0A CN202010168037A CN111460450A CN 111460450 A CN111460450 A CN 111460450A CN 202010168037 A CN202010168037 A CN 202010168037A CN 111460450 A CN111460450 A CN 111460450A
- Authority
- CN
- China
- Prior art keywords
- graph
- code
- vulnerability
- convolution network
- source code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/562—Static detection
- G06F21/563—Static detection by source code analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N20/00—Machine learning
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
Abstract
本发明涉及一种基于图卷积网络的源代码漏洞自动检测方法,在训练阶段,进行数据获取和数据预处理,判断源代码是否有sink方法调用,对sink方法调用进行数据数据流分析,构造为代码属性图,计算代码属性图的邻接矩阵与特征矩阵,给代码属性图加标签,将代码属性图中的邻接矩阵和特征矩阵作为图卷积网络的输入,训练图卷积网络,得到训练好的网络模型;测试阶段进行数据获取和数据预处理,判断源代码是否有sink方法调用,进行数据数据流分析,构造为代码属性图,计算代码属性图的邻接矩阵与特征矩阵,输入训练好的图卷积网络模型,输出代码属性图的分类结果,表示代码属性图是否有漏洞即对应的sink方法调用是否含有漏洞。
Description
技术领域
本发明属于计算机网络安全技术领域,涉及源代码中的漏洞检测,具体涉及一种基于图卷积网络的源代码漏洞检测方法,该方法可以自动对源代码进行漏洞扫描,判断源代码是否含有漏洞,并报告漏洞位置,为后续代码漏洞自动检测的研究提供了技术支持。
背景技术
软件中隐藏的漏洞可能导致安全问题,使攻击者危害计算机系统和应用程序。每年有数千个这样的漏洞被公开地报告给公共漏洞和暴露数据库(CVE),更多的漏洞在专有代码中被内部发现并修补。正如从最近许多备受关注的攻击中所看到的,如HeartBleedBug、Wannacry勒索软件密码蠕虫和Equifax信贷历史数据库的黑客攻击,这些安全漏洞在财务和社会上都会产生灾难性的影响。这些漏洞通常是由程序员所犯的细微错误引起的,并且由于开源软件和代码重用的普遍性,可以迅速传播。
软件漏洞是影响网络安全的一个基本问题,对漏洞的挖掘和发现也成为网络安全的核心技术之一。漏洞的挖掘和发现集中融合了计算机安全和软件测试这两个领域的技术手段。传统软件缺陷测试和漏洞挖掘研究通常按照两个维度来分类:根据被测程序是否有源代码,分为白盒和黑盒测试;根据程序是否执行,分为静态分析(static analysis)和动态分析(dynamic analysis)。在全球网络安全竞争日益激烈的情况之下,漏洞挖掘技术也在不断智能化,集中体现为测试手段更多样化、技术形态更丰富,以及引入机器学习辅助甚至替代人工分析。
虽然有用于程序静态(运行前)或动态(运行时)分析的现有工具,但这些工具通常只检测基于预定义规则的有限的可能错误子集。随着近些年开源代码库的广泛使用,使用数据驱动技术研究程序特性已成为可能。
在利用机器学习进行源代码漏洞检测时,核心技术是源代码中可疑代码的提取与可疑代码的表示法以及将可疑代码作为输入的机器学习模型。在2018年NDSS会议上,Li等人设计了一种检测C/C++代码上的库函数/API调用漏洞的系统VulDeePecker,首先提取函数调用相关代码切片作为可疑代码,之后用Word2Vec对可疑代码向量化,最后用双向长短时神经网络(BLSTM)对可疑代码进行分类,在SARD和NVD漏洞数据库的测试上取得了较低的误报率。在2017年的Security&Privacy会议上,Kim等人将源代码视作字符串,用源代码字符串的哈希值作为源代码的表示,利用大量的数据集,构建了检测代码复制行为的工具VUDDY,可以用于漏洞检测。
在2016年的ICSE会议上,Wang将源代码中的关键类型的代码节点作为可疑代码,利用深度信念网络(DBN)将可疑代码编码为向量,以自动学习代码的语义表达,建立起缺陷预测和程序语义之间的桥梁,之后利用传统机器学习方法训练编码后的向量,利用公开的PROMISE数据集研究了项目内和跨项目的漏洞检测,在部分项目的检测上取得了较好的效果。
在源代码漏洞检测的前沿领域,将机器学习方法引入漏洞检测时,通常是将源代码视作文本字符串,提取出可疑代码的文本字符串,然后输入进机器学习模型中。但是源代码具有结构性,代码的本质并不是字符串,而是一个具有复杂拓扑的数据结构,字符串只是对这种数据结构的一种编码,在编译的过程中,首先要把字符串解析为这种数据结构,之后才能进行语义分析、类型推导/检查、代码优化、机器代码生成等过程。将源代码字符串解析为这种数据结构需要对代码进行词法分析、语法分析,通常用抽象语法树(AbstractSyntax Tree,AST)来表示这种数据结构。用字符串来表示源代码会损失掉很多结构信息,同时字符串也很难表达出源代码的语法信息和语义信息。
在当前源代码漏洞检测领域中,除了用字符串表示源代码之外,还有一种源代码表示方法,就是将源代码用图表示。图是一种复杂的拓扑结构,包括顶点和边,抽象语法树本身就是一种图结构,图的顶点表示着源代码字符串中的代码元素,图的边则表示顶点之间的连接关系,用边将顶点(代码元素)连接,源代码就由扁平的字符串变成了具有拓扑结构的图。对源代码做语义分析,将语义相关的代码元素用边连接,图就可以清楚地表达出源代码的语义信息。
目前用图表示源代码并用于漏洞检测的研究中,通常的做法是将可疑代码构造为图,然后由专家写出图遍历规则,符合规则的视作漏洞,在这个过程中并没有利用到机器学习方法,反而需要专家定义图遍历规则。比如,在2017年的European Security&Privacy会议上,Backes等人将PHP代码转换为图的表示,并对其进行过程间分析,定义漏洞遍历规则,以检测PHP中的Web漏洞;在2014年的Security&Privacy会议上,Yamaguchi等人构建了C语言的代码属性图,包括AST图、控制流图和程序依赖图,并用图遍历的方式搜索图中的代码漏洞。
在源代码漏洞检测的前沿研究领域中,将机器学习方法引入漏洞检测的研究工作通常将源代码视作文本字符串,这种文本字符串的源代码表示法无法表达源代码的结构信息、语法信息和语义信息,用图表示源代码的研究工作虽然会很好的表达出源代码的结构信息、语法信息和语义信息,但是通常没有引入机器学习方法,而是由专家制定图的遍历规则,既耗时又耗力。
因此,根据当前漏洞检测研究现状,研究一种结合源代码的图表示法和机器学习方法的漏洞检测技术,填补当前研究领域的空白,为后续的漏洞检测技术研究提供参考,是申请人关注的课题之一。
发明内容
针对现有的源代码漏洞静态检测技术无法同时利用图表示法和机器学习方法的技术问题,本发明的目的在于,一种基于图卷积网络的源代码漏洞自动检测方法,该方法将源代码用图表示,并对图进行机器学习训练,实现了对目标源代码进行漏洞检测并报告出准确的漏洞位置的功能,而且漏报率和误报率较低。
为了实现上述任务,本发明采用以下的技术解决方案:
一种基于图卷积网络的源代码漏洞自动检测方法,包括训练阶段和测试阶段,其特征在于:
在训练阶段,对训练数据集进行数据获取和数据预处理,数据预处理的过程是,首先判断测试数据集的源代码是否有sink方法调用,对sink方法调用进行数据数据流分析,然后将与sink方法调用相关的可疑代码构造为代码属性图,并计算代码属性图的邻接矩阵与特征矩阵,并且给sink方法调用和代码属性图加标签,将代码属性图中的邻接矩阵和特征矩阵作为图卷积网络的输入,训练图卷积网络,进一步得到训练好的网络模型;
在测试阶段,对测试数据集进行数据获取和数据预处理,数据预处理的过程是,首先判断测试数据集的源代码是否有sink方法调用,对sink方法调用进行数据数据流分析,然后将与sink方法调用相关的可疑代码构造为代码属性图,并计算代码属性图的邻接矩阵与特征矩阵,将邻接矩阵与特征矩阵输入训练好的图卷积网络模型,图卷积网络模型输出代码属性图的分类结果,表示代码属性图是否有漏洞即对应的sink方法调用是否含有漏洞。
本发明的基于图卷积网络的源代码漏洞自动检测方法,基于大量开源代码数据集,获取数据集中有漏洞的代码和无漏洞的代码,使用静态代码分析技术,提取源代码中的可疑代码,并将可疑代码构造为图,利用深度学习中的图卷积网络技术,训练代码漏洞检测模型,为源代码漏洞静态检测提供技术支持,缩小代码审计的范围,减少了开发人员发现代码漏洞的时间。和现有技术比较,带来的技术创新在于:
(1)源代码的图表示法具有很强的表达力
用图表示源代码,可以清楚地表达出源代码的结构信息、语法信息和语义信息,解决了传统的文本字符串表示法难以表达源代码的结构信息、语法信息和语义信息的问题。
(2)精确定位漏洞位置
对源代码进行自动化的静态分析,提取出源代码中的可疑代码,再构造为图,输入进图卷积网络模型进行检测,如果结果为漏洞,则可疑代码就是漏洞代码。
(3)不需要专家制定图遍历规则
引入机器学习方法中的图卷积网络技术,将构造好的代码图输入进图卷积网络模型中进行训练和检测,代码图中的漏洞规则由图卷积网络模型自动学习,无需人工参与。
(4)模型更新速度快
采用基于大规模的开源代码库和机器学习方法,只需要更新数据集并继续用新的代码数据训练图卷积网络模型,漏洞检测模型即可更新。解决了专家制定图遍历规则进而需要对新代码进行分析并重新制定规则的问题。
附图说明
图1是本发明的基于图卷积网络的源代码漏洞自动检测方法流程图。
图2是源代码举例。
图3是构造的代码属性图中的AST边举例。
图4是构造的代码属性图中的数据流边举例。
图5是构造的代码属性图中的控制流边举例。
图6是构造的代码属性图中的方法调用边举例。
图7是图卷积网络模型结构图。
以下结合附图和实施例对本发明作进一步的详细说明。
具体实施方式
需要说明的是,本发明的基于图卷积网络的源代码漏洞自动检测方法,不限于具体的编程语言,为了方便说明,本实施例以流行的Java、C、C++语言为例,详细介绍本发明的具体细节。
依照图1所示,本实施例给出一种基于图卷积网络的源代码漏洞自动检测方法,包括训练阶段和测试阶段,其中:
在训练阶段,对训练数据集进行数据获取和数据预处理,数据预处理的过程是,首先判断测试数据集的源代码是否有sink方法调用,对sink方法调用进行数据数据流分析,然后将与sink方法调用相关的可疑代码构造为代码属性图,并计算代码属性图的邻接矩阵与特征矩阵,并且给sink方法调用和代码属性图加标签,将代码属性图中的邻接矩阵和特征矩阵作为图卷积网络的输入,训练图卷积网络,进一步得到训练好的网络模型;
在测试阶段,对测试数据集进行数据获取和数据预处理,数据预处理的过程是,首先判断测试数据集的源代码是否有sink方法调用,对sink方法调用进行数据数据流分析,然后将与sink方法调用相关的可疑代码构造为代码属性图,并计算代码属性图的邻接矩阵与特征矩阵,将邻接矩阵与特征矩阵输入训练好的图卷积网络模型,图卷积网络模型输出代码属性图的分类结果,表示代码属性图是否有漏洞即对应的sink方法调用是否含有漏洞。
本实施例中,该基于图卷积网络的源代码漏洞自动检测方法分为五个阶段,即:对训练数据集进行数据获取阶段、数据预处理阶段、训练数据标签化阶段、模型构建与训练阶段、源代码漏洞检测阶段。
其中的数据预处理阶段分为四个步骤:1、判断源代码是否包含Sink方法调用;2、对Sink方法调用进行数据流分析;3、将Sink方法调用相关的可疑代码构造为代码属性图;4、计算代码属性图的邻接矩阵和特征矩阵作为图卷积网络的输入。
模型构建与训练阶段,将使用训练数据训练得到一个图卷积网络模型。
源代码漏洞检测阶段,首先对源代码进行数据预处理,然后将预处理得到的代码属性图输入到训练好的图卷积网络模型中,根据网络模型的输出结果判断源代码中是否含有漏洞。
以下是具体的实施过程。
1、对训练数据集进行数据获取
1.1Java语言数据集获取
(1)开源代码库OWASP/Benchmark及其测试用例的简要介绍
OWASP/Benchmark是OWASP组织下的一个开源项目,又叫做OWASP基准测试项目,它是免费且开放的测试套件。它可以用来评估那些自动化安全扫描工具的速度、覆盖范围和准确性,这样就可以得到这些软件的优点和缺点,还可以对它们进行相互比较。每个版本的OWASP/Benchmark都包含数千个完全可运行和漏洞利用的测试用例,每个测试用例都映射到该漏洞的相应CWE编号,所以该项目的漏洞数量和漏洞类型都是固定的,因此就可以查看扫描工具的测试报告进行对比得出该工具的误报和漏报率。
OWASP/Benchmark基准测试项目内置了数千个测试用例,可以用来评估漏洞扫描工具,使用这个基准测试项目训练并评估图网络漏洞检测模型。
OWASP/Benchmark目前共有两个版本,v1.1版本包含21041个测试用例,v1.2版本包含2704个测试用例,测试用例共覆盖11种漏洞类型,每种漏洞类型的测试用例数目不等。表1.1展示了每种漏洞类型在各个版本中的测试用例数目。
表1.1:OWASP/Benchmark测试用例数目表
(2)数据筛选
①OWASP/Benchmark版本筛选
本实施例使用OWASP/Benchmark v1.1版本中的测试用例训练并评估图卷积网络模型,具体原因如下:
使用图卷积网络模型检测漏洞,需要大量数据集训练网络模型,OWASP/Benchmarkv1.2中的测试用例数目过少,不适合用来训练或评估图卷积网络模型。
②依据各漏洞类型中的测试用例数目筛选。
OWASP/Benchmark中的测试用例分为有漏洞代码和无漏洞代码,在训练和测试的过程中有漏洞代码与无漏洞代码的比例设为1:1,因此如果某种漏洞类型的含漏洞的测试用例数目过少或无漏洞的测试用例数目过少,则不适合用于深度学习训练。因此,设定含漏洞的测试用例和无漏洞的测试用例都不得少于300个。
根据表1.2中的各个漏洞类型的含漏洞测试用例数目和无漏洞测试用例数目,排除了Trust Boundary Violation、LDAP Injection、Secure Cookie Flag和XPATHInjection四种漏洞类型的训练和测试。
表1.2:OWASP/Benchmark v1.1中各漏洞类型的测试用例分布
③依据漏洞产生的原因进行筛选
根据第②步的筛选,漏洞类型包括Weak Randomness、XSS、SQL Injection、PathTraversal、Command Injection、Weak Cryptography和Weak Hashing共7种。分析测试用例源代码,查找漏洞产生的原因。发现Weak Randomness、Weak Cryptography和Weak Hashing等3种漏洞产生的原因是使用了不安全的随机数算法、加密算法和Hash算法,这种漏洞更适合用规则匹配的方式去检测,通过指定目前公开的随机数算法、加密算法和Hash算法中哪些是安全的,哪些是不安全的,可以轻松的确定源代码中使用的算法是否安全,没有进行深度学习训练大量样本再检测漏洞的必要,因此这3种漏洞类型也不在训练和测试之列。
本实施例使用OWASP/Benchmark v1.1中的XSS、SQL Injection、Path Traversal和Command Injection四种漏洞的测试用例作为Java语言图网络漏洞检测模型的数据集。
1.2 C/C++语言数据集获取
在2018年NDSS会议上,Li等人设计了一种检测C/C++代码中的库函数/API调用漏洞的系统VulDeePecker,其训练和测试数据集由SARD漏洞库和NVD漏洞库组成。其中,SARD漏洞库由测试用例组成,NVD漏洞库由现实世界中的含漏洞的代码程序组成。VulDeePecker数据集中包含两种漏洞类型,分别是缓冲区错误漏洞和资源管理错误漏洞。
本实施例使用数据量较多的缓冲区错误漏洞作为C语言、C++语言漏洞模型训练和测试的数据集,其中包括SARD漏洞库中的测试用例和NVD漏洞库中的现实世界中的源代码。
2、数据预处理阶段
从图1中可以看出,数据预处理阶段在训练阶段和测试阶段均存在。在此阶段,首先判断训练数据集或测试数据集的源代码是否包含可能导致漏洞利用的方法调用(称为Sink方法调用),如果包含这种方法调用,则对方法调用涉及的变量进行数据流分析,找出与此方法调用相关的所有变量,包含这些变量的代码语句即是与漏洞相关的代码,然后将漏洞相关的代码构造为代码属性图,最后从代码属性图中获取图的邻接矩阵和特征矩阵作为图卷积网络的输入。
2.1代码属性图介绍
本实施例使用代码属性图表示源代码,并对代码属性图进行分析,提取出代码属性图中与漏洞相关的子图作为图卷积网络的输入。
源代码具有结构性,代码的本质并不是字符串,而是一个具有复杂拓扑的数据结构,字符串只是对这种数据结构的一种编码,将源代码字符串解析为这种数据结构需要对代码进行词法分析、语法分析,通常用抽象语法树(Abstract Syntax Tree,AST)来表示这种数据结构。本发明使用开源工具JavaParser构造Java语言源代码的AST,使用Eclipse/CDT工具构造C/C++语言源代码的AST,在AST的基础上,对源代码进行语义分析、数据流分析、控制流分析、方法调用关系分析等过程,充分获取源代码的语义信息,从AST出发构造代码属性图。
图是节点和边的集合。本发明中的代码属性图中的节点是AST中的节点,代码属性图中的边按照源代码分析过程分为四类,分别是AST边、数据流边、控制流边和方法调用边。
以图2中的源代码为例,构造代码属性图。图3中的边是对源代码的post()方法声明构造的图的AST边。图4是对post()方法构造的图的数据流边。图5是对post()方法构造的图的控制流边。图6是对post()方法的foo()方法调用构造的方法调用边。
AST边可以从AST的拓扑结构获得,分为Child Node边和Next Node边,Child Node边连接AST中的父节点和子节点,Next Node边按顺序连接相同父节点的子节点们。
数据流边连接源代码中的变量,表示变量(数据)之间的关系,需要对源代码进行数据流分析获得。数据流边分为Last Use、Last Write、Computed From、Last LexicalUse、Guarded By和Guarded By Negation。一个变量可能出现在源代码的不同位置,被初始化与赋值,初始化语句和赋值语句中可能出现其他的变量,可能出现在if语句的then分支与else分支,源代码中同一个变量的不同位置用不同变量节点表示。
本实施例中,将同一个变量的当前位置的变量节点与上次使用时位置的变量节点用Last Use连接;将同一个变量当前位置的变量节点与上次修改(初始化或赋值)时位置的变量节点用Last Write连接;将变量节点在修改时用到的其他变量用Computed From连接;将if语句的then分支和else分支的同一个变量用Last Lexical Use连接;Guarded By将if语句的条件节点和then语句中出现的变量节点连接;Guarded By Negation将if语句的条件节点和else语句中出现的变量节点连接。
在本实施例中,用控制流边表示程序运行的控制逻辑关系,分为Next Execute和Returns To。用Next Execute连接上一次执行的代码节点和下一次执行的代码节点;用Returns To连接return语句节点和方法声明节点。
进一步地,在本实施例中,用调用边表示程序间的方法调用依赖关系,分为MethodCall和Formal Argument Name。用Method Call连接方法调用节点和被调方法的方法声明节点,并对被调方法的声明节点同样构造代码属性图;用Formal Argument Name连接方法调用节点的实参和被调方法的方法声明节点中对应的形参。
2.2判断源代码是否包含Sink方法调用
本实施例从细粒度的代码节点出发,构造代码属性图,在构造代码图的过程中,首先判断代码中是否包含可能导致漏洞利用的方法调用(即Sink方法调用),如果有,则提取出Sink方法调用相关的漏洞代码并构造为代码属性图。Sink方法通常是Java库中的方法,包括Java SDK中的库方法和第三方库方法,比如Java内置的Java数据库连接JavaDatabase Connectivity(简称JDBC),相关的类可以对数据库进行操作,其中的java.sql.Statement类的execute(String sql)实例方法调用可能因为传入的参数sql中含有SQL注入代码而引起SQL注入漏洞。
本实施例中,预先收集这种Sink方法,当出现新的Sink方法的时候,可以及时添加到Sink方法数据集中,具有很高的扩展性。本实施例针对数据获取阶段的用于训练和测试的OWASP/Benchmark的4种漏洞类型,收集了覆盖这个数据集的Sink方法。
在对这个数据集进行训练和测试的时候,首先将源代码构造为AST,然后找出AST中所有的方法调用节点,根据方法调用的名称和参数数目来判断方法调用节点是否属于Sink方法,如果是,则对这个Sink方法调用节点进行数据流分析,找出漏洞相关的代码并构造代码属性图。
2.3对Sink方法调用进行数据流分析
在找到Sink方法调用之后,首先对这个方法调用所在的方法声明构造数据流图,然后从数据流图中找到Sink方法调用相关的变量。具体地,找到执行Sink方法调用的实例变量和方法调用的参数变量,在数据流图中搜索从实例变量节点和参数变量节点出发用Last Use、Last Write、Computed From或Last Lexical Use连接的变量节点,并递归的进行这个搜索过程,搜索到的所有变量节点即为与这个Sink方法调用有关的变量节点,含有这些变量节点的代码语句则是Sink方法调用相关的代码语句,将被用于构造代码属性图。
2.4将Sink方法调用相关的代码构造为代码属性图
对Sink方法调用进行数据流分析之后,获取到了与方法调用相关的变量节点,含有变量节点的代码语句节点就是Sink方法调用相关的代码,本步骤将从整个源代码中构造出只包含Sink方法调用相关代码的代码属性图。找到Sink方法调用所在的方法声明节点,递归地遍历这个方法声明节点及其子节点,如果某个节点含有Sink方法调用相关的代码节点,则这个节点将被用于构造代码属性图,递归的对这个节点的子节点用同样的方法进行遍历,便得到只包含Sink方法调用相关的代码节点的代码属性图。
2.5代码属性图作为图卷积网络的输入
将代码属性图中的邻接矩阵和特征矩阵输入到图卷积网络。
①邻接矩阵
对代码属性图中的节点进行编号,设节点数目为N,则构造一个N行N列的矩阵,矩阵元素值为0或1,其中主对角线上的矩阵元素值皆为1,第x行y列的矩阵元素表示编号为x的节点是否为编号为y的节点的前趋节点(即编号为y的节点是否为编号为x的节点的后继节点),值为0表示否,值为1表示是。根据代码属性图的边的连接关系可以确定每个节点的后继节点和前趋节点,进而可以直接对矩阵元素赋值,赋值之后的矩阵就成了邻接矩阵,可以表示各个节点之间的连接关系。
②特征矩阵
每个节点都有自己的特征,用一个特征向量表示,设节点数目为N,特征向量长度为M,则特征矩阵的大小为N行M列,第x行表示编号为x的节点的特征向量。
根据代码属性图各个节点的类型,分别对不同类型的节点设计节点特征的字符串表示,最后用Word2Vec工具统一将节点特征的字符串表示转换为向量表示。
代码属性图中的节点都属于AST中的节点,AST中的节点都有节点类型信息,比如方法声明节点的类型为MethodDeclaration,条件语句节点的类型为IfStmt,For循环语句节点的类型为ForStmt,变量声明表达式节点的类型为VariableDeclarationExpr等。根据AST中的节点是否有子节点将节点分为两种,有子节点的称为分枝节点,无子节点的称为叶子节点。对于分枝节点,本实施例中,用节点的类型作为节点特征字符串表示,比如方法声明节点是一个分枝节点,其特征字符串表示为“MethodDeclaration”;对于叶子节点,用节点类型和节点内容的结合作为节点特征字符串表示,比如一个名为variableName的变量节点的节点类型是NameExpr,变量节点内容是variableName,则这个变量节点的特征字符串表示就是“NameExpr variableName”。
分枝节点的特征字符串表示是节点类型,叶子节点的特征字符串表示由其节点类型和节点内容组合而成,节点类型是AST的节点类型,具有一致性,但是不同源代码的节点内容比如变量名并没有统一,不同代码的变量名并不相同,这会增加训练难度,因此需要对节点内容进行归一化操作。
对于变量节点,统一变量命名,根据变量数目逐一给变量进行编号,设某变量编号为x,则将此变量重命名为“var_x”;对于字符串字面量节点,本发明统一将非空的字符串用“Not Empty String”表示,将空字符串用“Empty String”表示。
得到节点的特征字符串之后,用Word2Vec将字符串转换为向量表示。Word2Vec被广泛用于文本挖掘,基于分布式表示的思想,它将一个标记映射到一个整数,然后将其转换为固定长度向量。在本实施例中,对每一个特征字符串中的每个单词生成一个与之对应的100维的向量,多个单词的向量加和求平均值作为整个特征字符串的向量,这个向量就是节点的特征向量。
3、标签化数据
OWASP/Benchmark基准测试项目可以用来评估那些自动化安全扫描工具的速度、覆盖范围和准确性,数据集附带了每个测试用例的用例的标签,表明测试用例是含有漏洞或是不含漏洞。
本实施例中,用二维向量表示漏洞的标签,用[1,0]表示测试用例有漏洞,用[0,1]表示测试用例没有漏洞,每个测试用例构造一个代码属性图,代码属性图的标签即测试用例的标签。
4、构建模型及训练模型
现实世界中很多的数据有着不规则的结构,比如知识图谱、社交网络、推荐系统、电子交易、分子结构等,这些图谱结构中的每个节点连接都不尽相同,每个节点都有自己独特的特征信息和结构信息,图卷积神经网络(Graph Convolutional Network,GCN)可以很好的处理这种图数据。
源代码本质是一种复杂的拓扑数据结构,用代码属性图表示源代码,训练图卷积网络。图卷积网络的输入是代码属性图的邻接矩阵和特征矩阵,输出是一个二维向量,表示对代码属性图的预测结果。在训练的时候,根据代码属性图的原始标签和预测结果,使用TensorFlow的softmax计算交叉熵,根据交叉熵计算loss值并传递给优化器进行优化。
5、源代码漏洞检测阶段
在对目标源代码进行检测时,对源代码进行数据预处理,然后将预处理得到的代码属性图输入到训练好的图卷积网络模型中,根据模型输出结果判断源代码是否含有漏洞。
首先进行数据预处理,和训练阶段的数据预处理方法相同,将测试数据集的源文件(源代码)构造AST,然后分析AST,判断AST中是否有Sink方法调用,将与Sink方法调用相关的可疑代码构造为代码属性图,然后计算代码属性图的邻接矩阵和特征矩阵并输入到训练好的图卷积网络,图卷积网络的输出是二维向量,设输出的二维向量是(x,y),如果x>y,则预测结果为含有漏洞,如果x≤y,则预测结果为不含有漏洞,当预测为含有漏洞时,这个Sink方法调用就是漏洞位置。
6、实验部分
6.1训练数据集和测试数据集
本实验使用OWASP/Benchmark v1.1中的XSS、SQL Injection、Path Traversal和Command Injection四种漏洞的测试用例作为Java语言的图网络漏洞检测模型的数据集,每种漏洞类型的数据单独训练并测试;使用VulDeePecker的缓冲区错误漏洞数据集训练和测试C语言、C++语言的图网络漏洞检测模型。
在对每种漏洞类型的数据训练和测试的过程中,首先对所有源代码文件进行自动化的静态分析,生成所有的代码属性图并标注标签。然后,将代码属性图作为图卷积网络的输入,进行网络模型的训练和测试。在训练和测试的过程中,含漏洞的图与不含漏洞的图的数目之比是1:1,将代码属性图分为三部分,分别是训练数据集、验证数据集、测试数据集,比例为6:2:2,使用训练数据集训练得到图卷积网络模型,使用验证数据集判断训练出的各个网络模型的效果,选取效果最好的模型对测试数据集进行源代码漏洞检测。
表6.1是OWASP/Benchmark v1.1数据集中各漏洞类型生成的代码属性图中用于模型训练、验证和测试的代码属性图数目。
表6.2是VulDeePecker数据集中缓冲区错误漏洞类型生成的代码属性图中用于模型训练、验证和测试的代码属性图数目。
表6.1:OWASP/Benchmark v1.1用于模型训练的代码属性图的漏洞类型和数目
表6.2:VulDeePecker数据集中用于模型训练的代码属性图的漏洞类型和数目
6.2模型训练
(1)训练模型的硬件平台
NVIDIA GeForce GTX 1080 GPU、Intel Xeon E5-1620 CPU
(2)图卷积网络模型
图卷积网络模型结构如图7所示,将图卷积网络视作一个黑盒,输入代码属性图的邻接矩阵和特征矩阵,输出二维向量作为预测结果,因此简要介绍网络模型是如何迭代的。
输入的代码属性图包含表示节点连接关系的邻接矩阵和表示各个节点特征的特征矩阵,每一次迭代都对图中的各个节点的特征向量进行更新,在更新某个节点的特征向量时,会综合考虑这个节点本身的特征向量与对这个节点产生影响的邻接节点的特征向量,将这些特征向量与一个矩阵参数相乘之后就是这个节点更新之后的特征向量,矩阵参数在网络模型训练过程中会不断更新。经过一定的迭代次数之后,将特征矩阵和一个矩阵参数相乘,得到模型的输出即二维向量,这个矩阵参数同样会在网络模型训练的过程中不断更新。
模型的参数为:将参数设置为图卷积网络和自然语言处理领域常用的参数值,设置节点的特征向量为100维,训练的batch size为8,学习率为0.001,特征矩阵的迭代次数为5。
6.3测试数据集漏洞检测实验结果
(1)检测准确率高、误报率低。
经过图卷积网络模型训练,针对OWASP/Benchmark v1.1数据集的测试集,测试结果如下表6.3所示。
表6.3:对OWASP/Benchmark v1.1测试集的检测结果
漏洞类型 | FPR(%) | TPR(%) | Precision(%) | F1(%) |
SQL Injection | 0.81 | 99.59 | 99.19 | 99.39 |
Command Injection | 1.66 | 97.79 | 98.33 | 98.06 |
Path Traversal | 2.72 | 95.11 | 97.22 | 96.15 |
XSS | 5.84 | 91.56 | 94 | 92.76 |
将含有漏洞的测试用例标记为正样本,不含漏洞的测试用例标记为负样本,因此True Positive(TP)表示正样本被正确的分类为正样本,False Negative(FN)表示正样本被错误的分类为负样本,True Negative(TN)表示负样本被正确的分类为负样本,FalsePositive(FP)表示负样本被错误的分类为正样本,True Positive Rate(TPR)表示正样本正确分类的比例,False Positive Rate(FPR)表示负样本被错误分类为正样本的比例,Precision是被分类为正样本的样本中真正样本占的比例,F1-measure度量值综合考虑Precision和True Positive Rate,其中,TPR=TP/(TP+FN),FPR=FP/FP+TN),Precision=TP/(TP+FP),F1=(2×Precision×TPR)/(Precision+TPR)。
表6.4展示了对OWASP/Benchmark v1.1测试数据集的漏洞检测结果。
表6.4:OWASP/Benchmark v1.1测试数据集的漏洞检测结果
漏洞类型 | FPR(%) | TPR(%) | Precision(%) | F1(%) |
缓冲区错误漏洞 | 2.87 | 98.39 | 97.17 | 97.78 |
从检测结果可以看到,对四种漏洞类型的测试都在有很高的检出率(TPR)的同时具有很低的误报率(FPR)。
同时,发明人还对Java测试数据集和C/C++测试数据集的漏洞进行了检测,检测结果都有很高的检出率(TPR)与很低的误报率(FPR),这也表明了本实施例的基于图卷积网络的源代码漏洞自动检测方法,并不限于具体的程序语言,具有通用性。
Claims (1)
1.一种基于图卷积网络的源代码漏洞自动检测方法,包括训练阶段和测试阶段,其特征在于:
在训练阶段,对训练数据集进行数据获取和数据预处理,数据预处理的过程是,首先判断测试数据集的源代码是否有sink方法调用,对sink方法调用进行数据数据流分析,然后将与sink方法调用相关的可疑代码构造为代码属性图,并计算代码属性图的邻接矩阵与特征矩阵,并且给sink方法调用和代码属性图加标签,将代码属性图中的邻接矩阵和特征矩阵作为图卷积网络的输入,训练图卷积网络,进一步得到训练好的网络模型;
在测试阶段,对测试数据集进行数据获取和数据预处理,数据预处理的过程是,首先判断测试数据集的源代码是否有sink方法调用,对sink方法调用进行数据数据流分析,然后将与sink方法调用相关的可疑代码构造为代码属性图,并计算代码属性图的邻接矩阵与特征矩阵,将邻接矩阵与特征矩阵输入训练好的图卷积网络模型,图卷积网络模型输出代码属性图的分类结果,表示代码属性图是否有漏洞即对应的sink方法调用是否含有漏洞。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010168037.0A CN111460450B (zh) | 2020-03-11 | 2020-03-11 | 一种基于图卷积网络的源代码漏洞检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010168037.0A CN111460450B (zh) | 2020-03-11 | 2020-03-11 | 一种基于图卷积网络的源代码漏洞检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111460450A true CN111460450A (zh) | 2020-07-28 |
CN111460450B CN111460450B (zh) | 2023-02-10 |
Family
ID=71678270
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010168037.0A Active CN111460450B (zh) | 2020-03-11 | 2020-03-11 | 一种基于图卷积网络的源代码漏洞检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111460450B (zh) |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111966604A (zh) * | 2020-09-07 | 2020-11-20 | 江苏君英天达人工智能研究院有限公司 | 一种fuzzing工控协议漏洞挖掘系统 |
CN112288079A (zh) * | 2020-11-17 | 2021-01-29 | 北京轩宇信息技术有限公司 | 图神经网络模型训练方法、软件缺陷检测方法及系统 |
CN112699377A (zh) * | 2020-12-30 | 2021-04-23 | 哈尔滨工业大学 | 基于切片属性图表示学习的函数级代码漏洞检测方法 |
CN113076543A (zh) * | 2021-03-22 | 2021-07-06 | 四川大学 | 一种针对社交网络中漏洞利用知识库的构建方法 |
CN113157917A (zh) * | 2021-03-15 | 2021-07-23 | 西北大学 | 基于OpenCL的优化分类模型的建立、优化分类方法及系统 |
CN113158194A (zh) * | 2021-03-30 | 2021-07-23 | 西北大学 | 一种基于多关系图网络的漏洞模型的构建方法及检测方法 |
CN113239358A (zh) * | 2021-03-11 | 2021-08-10 | 东南大学 | 基于知识图谱的开源软件漏洞挖掘方法 |
CN113326187A (zh) * | 2021-05-25 | 2021-08-31 | 扬州大学 | 数据驱动的内存泄漏智能化检测方法及系统 |
CN113742733A (zh) * | 2021-08-09 | 2021-12-03 | 扬州大学 | 阅读理解漏洞事件触发词抽取和漏洞类型识别方法及装置 |
CN114692155A (zh) * | 2022-05-30 | 2022-07-01 | 中国海洋大学 | 基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法 |
CN115495755A (zh) * | 2022-11-15 | 2022-12-20 | 四川大学 | 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法 |
CN115879868A (zh) * | 2022-09-09 | 2023-03-31 | 南京审计大学 | 一种专家系统与深度学习相融合的智能合约安全审计方法 |
CN112288079B (zh) * | 2020-11-17 | 2024-05-14 | 北京轩宇信息技术有限公司 | 图神经网络模型训练方法、软件缺陷检测方法及系统 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100083240A1 (en) * | 2006-10-19 | 2010-04-01 | Checkmarx Ltd | Locating security vulnerabilities in source code |
CN108846282A (zh) * | 2018-06-04 | 2018-11-20 | 西安电子科技大学 | 基于静态污点分析的安卓应用程序权限泄露漏洞检测方法 |
CN109101820A (zh) * | 2018-08-16 | 2018-12-28 | 北京理工大学 | 一种基于执行流图的Web应用安全漏洞预测方法 |
CN109426722A (zh) * | 2017-09-01 | 2019-03-05 | 深圳市源伞新科技有限公司 | Sql注入缺陷检测方法、系统、设备及存储介质 |
CN109657473A (zh) * | 2018-11-12 | 2019-04-19 | 华中科技大学 | 一种基于深度特征的细粒度漏洞检测方法 |
CN109697162A (zh) * | 2018-11-15 | 2019-04-30 | 西北大学 | 一种基于开源代码库的软件缺陷自动检测方法 |
CN110232280A (zh) * | 2019-06-20 | 2019-09-13 | 北京理工大学 | 一种基于树结构卷积神经网络的软件安全漏洞检测方法 |
CN110245496A (zh) * | 2019-05-27 | 2019-09-17 | 华中科技大学 | 一种源代码漏洞检测方法及检测器和其训练方法及系统 |
US20190354689A1 (en) * | 2018-05-18 | 2019-11-21 | Deepmind Technologies Limited | Deep neural network system for similarity-based graph representations |
-
2020
- 2020-03-11 CN CN202010168037.0A patent/CN111460450B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100083240A1 (en) * | 2006-10-19 | 2010-04-01 | Checkmarx Ltd | Locating security vulnerabilities in source code |
CN109426722A (zh) * | 2017-09-01 | 2019-03-05 | 深圳市源伞新科技有限公司 | Sql注入缺陷检测方法、系统、设备及存储介质 |
US20190354689A1 (en) * | 2018-05-18 | 2019-11-21 | Deepmind Technologies Limited | Deep neural network system for similarity-based graph representations |
CN108846282A (zh) * | 2018-06-04 | 2018-11-20 | 西安电子科技大学 | 基于静态污点分析的安卓应用程序权限泄露漏洞检测方法 |
CN109101820A (zh) * | 2018-08-16 | 2018-12-28 | 北京理工大学 | 一种基于执行流图的Web应用安全漏洞预测方法 |
CN109657473A (zh) * | 2018-11-12 | 2019-04-19 | 华中科技大学 | 一种基于深度特征的细粒度漏洞检测方法 |
CN109697162A (zh) * | 2018-11-15 | 2019-04-30 | 西北大学 | 一种基于开源代码库的软件缺陷自动检测方法 |
CN110245496A (zh) * | 2019-05-27 | 2019-09-17 | 华中科技大学 | 一种源代码漏洞检测方法及检测器和其训练方法及系统 |
CN110232280A (zh) * | 2019-06-20 | 2019-09-13 | 北京理工大学 | 一种基于树结构卷积神经网络的软件安全漏洞检测方法 |
Non-Patent Citations (2)
Title |
---|
BOHONG LIU等: "A Neural-Network based Code Summarization Approach by Using Source Code and its Call Dependencies", 《INTERNETWARE "19: PROCEEDINGS OF THE 11TH ASIA-PACIFIC SYMPOSIUM ON INTERNETWARE》 * |
马虹哲: "源代码安全漏洞检测方法探讨", 《网络空间安全》 * |
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111966604A (zh) * | 2020-09-07 | 2020-11-20 | 江苏君英天达人工智能研究院有限公司 | 一种fuzzing工控协议漏洞挖掘系统 |
CN112288079A (zh) * | 2020-11-17 | 2021-01-29 | 北京轩宇信息技术有限公司 | 图神经网络模型训练方法、软件缺陷检测方法及系统 |
CN112288079B (zh) * | 2020-11-17 | 2024-05-14 | 北京轩宇信息技术有限公司 | 图神经网络模型训练方法、软件缺陷检测方法及系统 |
CN112699377B (zh) * | 2020-12-30 | 2023-04-28 | 哈尔滨工业大学 | 基于切片属性图表示学习的函数级代码漏洞检测方法 |
CN112699377A (zh) * | 2020-12-30 | 2021-04-23 | 哈尔滨工业大学 | 基于切片属性图表示学习的函数级代码漏洞检测方法 |
CN113239358A (zh) * | 2021-03-11 | 2021-08-10 | 东南大学 | 基于知识图谱的开源软件漏洞挖掘方法 |
CN113157917A (zh) * | 2021-03-15 | 2021-07-23 | 西北大学 | 基于OpenCL的优化分类模型的建立、优化分类方法及系统 |
CN113157917B (zh) * | 2021-03-15 | 2023-03-24 | 西北大学 | 基于OpenCL的优化分类模型的建立、优化分类方法及系统 |
CN113076543A (zh) * | 2021-03-22 | 2021-07-06 | 四川大学 | 一种针对社交网络中漏洞利用知识库的构建方法 |
CN113158194A (zh) * | 2021-03-30 | 2021-07-23 | 西北大学 | 一种基于多关系图网络的漏洞模型的构建方法及检测方法 |
CN113326187A (zh) * | 2021-05-25 | 2021-08-31 | 扬州大学 | 数据驱动的内存泄漏智能化检测方法及系统 |
CN113326187B (zh) * | 2021-05-25 | 2023-11-24 | 扬州大学 | 数据驱动的内存泄漏智能化检测方法及系统 |
CN113742733A (zh) * | 2021-08-09 | 2021-12-03 | 扬州大学 | 阅读理解漏洞事件触发词抽取和漏洞类型识别方法及装置 |
CN113742733B (zh) * | 2021-08-09 | 2023-05-26 | 扬州大学 | 阅读理解漏洞事件触发词抽取和漏洞类型识别方法及装置 |
CN114692155A (zh) * | 2022-05-30 | 2022-07-01 | 中国海洋大学 | 基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法 |
CN115879868A (zh) * | 2022-09-09 | 2023-03-31 | 南京审计大学 | 一种专家系统与深度学习相融合的智能合约安全审计方法 |
CN115495755A (zh) * | 2022-11-15 | 2022-12-20 | 四川大学 | 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN111460450B (zh) | 2023-02-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111460450B (zh) | 一种基于图卷积网络的源代码漏洞检测方法 | |
Long et al. | Automatic inference of code transforms for patch generation | |
CN109426722B (zh) | Sql注入缺陷检测方法、系统、设备及存储介质 | |
Zhong et al. | An empirical study on API usages | |
Kiezun et al. | HAMPI: a solver for string constraints | |
Bernardi et al. | Design pattern detection using a DSL‐driven graph matching approach | |
Cheng et al. | Static detection of control-flow-related vulnerabilities using graph embedding | |
Kiezun et al. | HAMPI: A solver for word equations over strings, regular expressions, and context-free grammars | |
CN117951701A (zh) | 用于确定软件代码中的缺陷和漏洞的方法 | |
Saccente et al. | Project achilles: A prototype tool for static method-level vulnerability detection of Java source code using a recurrent neural network | |
Zheng et al. | An Abstract Syntax Tree based static fuzzing mutation for vulnerability evolution analysis | |
US20100199355A1 (en) | Method of protecting digital documents against unauthorized uses | |
Bernardi et al. | A model-driven graph-matching approach for design pattern detection | |
CN112765031A (zh) | 一种群智化漏洞挖掘任务的分解方法 | |
Tang et al. | Detecting compiler warning defects via diversity-guided program mutation | |
Naeem et al. | A machine learning approach for classification of equivalent mutants | |
CN116578980A (zh) | 基于神经网络的代码分析方法及其装置、电子设备 | |
Islam et al. | What changes in where? an empirical study of bug-fixing change patterns | |
Kaur et al. | A systematic literature review on the use of machine learning in code clone research | |
CN113127933B (zh) | 一种基于图匹配网络的智能合约庞氏骗局检测方法及系统 | |
Kreutzer et al. | Language-agnostic generation of compilable test programs | |
Hills | Variable feature usage patterns in PHP (T) | |
Rajbahadur et al. | Pitfalls analyzer: quality control for model-driven data science pipelines | |
Zeng et al. | An efficient vulnerability extrapolation using similarity of graph kernel of pdgs | |
Xu et al. | Detecting code vulnerabilities by learning from large-scale open source repositories |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |