CN112541180A - 一种基于语法特征和语义特征的软件安全漏洞检测方法 - Google Patents
一种基于语法特征和语义特征的软件安全漏洞检测方法 Download PDFInfo
- Publication number
- CN112541180A CN112541180A CN202011488425.3A CN202011488425A CN112541180A CN 112541180 A CN112541180 A CN 112541180A CN 202011488425 A CN202011488425 A CN 202011488425A CN 112541180 A CN112541180 A CN 112541180A
- Authority
- CN
- China
- Prior art keywords
- detection
- pdg
- vulnerability
- detection object
- model
- 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/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
-
- 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/044—Recurrent networks, e.g. Hopfield 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/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Computing Systems (AREA)
- General Health & Medical Sciences (AREA)
- Evolutionary Computation (AREA)
- Molecular Biology (AREA)
- Data Mining & Analysis (AREA)
- Computational Linguistics (AREA)
- Biophysics (AREA)
- Mathematical Physics (AREA)
- Biomedical Technology (AREA)
- Artificial Intelligence (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于语法特征和语义特征的软件安全漏洞检测方法。包括以下步骤:步骤1、确定检测对象的粒度;步骤2、建立软件历史漏洞库;步骤3、建立检测对象的抽象语法树;步骤4、对抽象语法树进行嵌入;步骤5、对检测对象软件源代码进行编译;步骤6、建立检测对象的程序依赖图;步骤7、对程序依赖图进行嵌入,步骤8、使用图卷积神经网络对AST的特征进行学习:步骤9、使用双向LSTM对PDG的特征进行学习;本发明的优越效果是:提高了检测模型的精度、准确率、召回率的性能指标;采用一种图神经网络直接对AST树形结构进行学习,因此不会丢失任何信息,基于图神经网络的特征直接提取方式能够极大提高模型的检测性能。
Description
技术领域
本发明属于软件安全技术领域,尤其涉及一种基于语法特征和语义特征的软件安全漏洞检测方法。
背景技术
目前,随着软件源代码及其漏洞数据的大量公开,相关数据能够低成本海量获取,基于数据驱动的方法被用于漏洞检测。其中,思路是利用深度学习技术的特征学习能力自动提取源代码模块的漏洞特征建立漏洞检测模型,整个过程分为两个阶段。一是模型建立阶段,二是模型应用阶段。在模型建立阶段中,首先确定分析对象的粒度,也就是确定软件源代码模块的大小,软件软代码模块是一段有相互关系的代码,可自行定义,可以是一个文件、一个函数、一个组件或者任意大小的一段代码;第二步是针对分析的对象进行预处理,解析出可用于分析的代码中间表示,中间表示包括Token序列、AST和CFG,第三步是针对中间表示进行数量化,采用空间嵌入的方式,第四步是选择合适的深度学习算法,将第三步的数量化的向量作为深度学习算法的输入且输出即为学习到的特征,第五步,将学习到的特征作为一个分类器的输入,同时将对应代码模块的是否具有漏洞标签或者漏洞的具体类别作为分类器的输出,对分类器进行训练,训练好的分类器即可用于模型应用阶段:针对一个新的软件源代码模块,对其进行预处理转换为中间代码后使用相同的量化和嵌入向量作为深度学习模型的输入学习提取特征,特征作为分类器的输入,分类器的输出为漏洞类别的概率。
现有技术1(VulDeePecker:A Deep Learning-Based System for VulnerabilityDetection,2018)的分析粒度为一个code gadget,一个code gadget是一段语义相关的代码语句集合,通过分析程序的数据流生成。针对code gadget通过lexical analysis将gadget表示成token序列,基于word2vec将每个token转换为向量,之后得到每个gadget的矢量表示,再采用一个Bidirectional LSTM(BLSTM)进行特征学习建立漏洞检测模型。现有技术2(SySeVR:A Framework for Using Deep Learning to Detect SoftwareVulnerabilities)对现有技术1的工作进行扩展,基于Bidirectional Gated RecurrentUnit(BGRU)建立漏洞检测模型。现有技术3(μVulDeePecker:A Deep Learning-BasedSystem for Multiclass Vulnerability Detection)针对现有技术1的不足,基于现有技术1中相同的code gadget思路,采用深度学习方法设计了一个漏洞多分类器,能够精确指出漏洞的类型。现有技术4(VulDeeLocator:A Deep Learning-based Fine-grainedVulnerability Detector)在现有技术2的基础上进行扩展,基于LLVM的中间代码获取语义相关的LLVM slice,使用BRNN建立模型。现有技术5(Towards a Deep Learning Model forVulnerability Detection on Web Application Variants)针对一个PHP slices建立漏洞检测模型,首先将PHP slices转换为基于操作码的中间表示,然后对操作码进行分词,使用word2vec进行向量化,之后使用一个5层的LSTM神经网络建立分类模型,一个Slice是一个代码片段,代码片段中的程序语句具有一定的关联关系,关联关系由人为定义,比如语句间具有数据依赖关系、控制依赖关系。现有技术6(Automatic feature learning forvulnerability prediction)针对JAVA文件建立漏洞分类模型,以JAVA文件中的method为单位进行分词后,使用LSTM深度学习对每个token进行嵌入,同时得到了每个method的语法特征,经过池化后得到每个file的语法特征。对所有的token向量进行聚类分析,得到分类的类别,再将计算构成每个file的token落入到每个类别的数量,数量即为file的语义特征。将语法和语义特征作为分类器的输入建立分类模型。现有技术7(Project Achilles:APrototype Tool for Static Method-Level Vulnerability Detection of Java SourceCode Using a Recurrent Neural Network)采用了现有技术6中类似的方法,将LSTM模型应用于JAVA程序,分析粒度不是一个file,针对不同的具体类型的漏洞检测进行了测试。现有技术8(Automated Vulnerability Detection in Source Code Using DeepRepresentation Learning)的分析粒度为C/C++函数,对每个函数进行分词得到token,再采用与句子情感分类类似的特征提取方法提取特征,基于卷积神经网络(CNNs)和递归神经网络(RNNs)进行漏洞分类。现有技术9(Automated software vulnerability detectionwith machine learning)的分析粒度为C/C++函数,对多种不同输入特征的性能进行了对比,分析了词袋模型和词向量方法,词袋模型采用extremely random trees分类器,词向量的方法采用TextCNN模型。现有技术10(A deep tree-based model for software defectprediction)针对一个Java源代码文件,首先建立文件的抽象语法树(AST),再基于AST采用一种树结构的LSTM网络建立漏洞检测模型。现有技术11(Cross-Project TransferRepresentation Learning for Vulnerable Function Discovery)、现有技术12(POSTER:Vulnerability Discovery with Function Representation Learning from UnlabeledProjects)针对C/C++源程序的函数,建立每个函数的AST,采用深度优先搜索得到AST的节点序列,之后使用Word2vec对节点序列进行嵌入,再使用5层的LSTM网络建立分类模型。现有技术13针对一个java文件,建立其AST,提取AST的节点,所有不同的AST节点构成一个库,对每个节点分配一个整数表示节点,将节点换成整数作为DBN的输入建立分类模型。现有技术14(Software Defect Prediction via Convolutional Neural Network)在现有技术13(Automatically Learning Semantic Features for Defect Prediction)的基础上,对AST的节点采用CNN进行词嵌入得到其向量表示,同时学习到整个AST节点序列的特征,将特征作为Logistic Regression classifier的输入建立分类模型。现有技术15(StaticDetection of Control-Flow-Related Vulnerabilities Using Graph Embedding)使用图卷积神经网络(graph convolutional network),针对控制流相关的漏洞建立检测模型,首先建立一个method的控制流图,之后使用Doc2Vec对控制流图的节点进行嵌入,然后使用graph convolutional network对整个控制流图进行学习得到图的特征表示建立漏洞检测模型。现有技术16(Convolutional Neural Networks over Control Flow Graphs forSoftware Defect Prediction)针对一个源file,首先对源文件编译得到汇编指令,建立基于汇编指令的CFG,基于CFG使用directed graph-based convolutional neural network建立漏洞检测模型。
另外,还有的现有技术提出同时使用AST、CFG、PDG(程序依赖图)以及代码传统metric四个特征建立漏洞检测模型,对这四类特征进行嵌入量化后,将量化向量通过直接拼接的方式形成总体特征。word2vec嵌入算法的原理如下:word2vec嵌入的目的是将一个序列中的每个符号转换成一个数字向量,使得意义相近的符号具有距离相近的向量表示。
目前的现有技术总结如下:
(1)现有技术使用基于AST的特征提取方法,思路是利用某种搜索算法将AST转换成一个节点序列,之后基于节点序列进行特征提取,缺点是:AST为一种树形结构,反映了节点类型以及节点之间的关联关系,在转换成节点序列的过程中,现有的搜索算法(例如深度优先搜索)无法体现同一层节点之间的相邻和先后关系,也就是同一层节点在转换成序列后可能有多种结果,即转换后的序列不能保留原树形结构的结构信息,使得原始信息损失较大。
(2)现有技术使用基于CFG的特征提取方法,思路是针对CFG使用图神经网络提取CFG的语义特征,基于CFG提取语义特征的方法的不足是:CFG中仅包含了程序的控制流信息,缺少了数据流信息,在语义表达上不完整。
(3)现有技术使用基于PDG的特征提取方法,采用图中节点的邻接矩阵表示PDG的特征(即语义特征),这种邻接矩阵只能表示节点关系的有和无,要么是0,要么是1,不能表示关联关系的程度,实际上PDG描述了程序中代码语句执行的先后关系是一种时间序列。
(4)现有技术中根据已知漏洞的语法特征建立分析对象的slice,之后对slice的语义进行分析,过程中并未体现分析对象语法特征的利用,同时现有技术中的语义特征与本发明使用的基于控制流图的语义特征在概念上差异较大。
(5)现有技术提出采用基于语法和语义特征的检测方法,与本发明的显著差异如下:①语法特征的差异,本质上,语法特征描述的是构成源代码各组成部分之间的关联关系,而现有技术中所采用的语法特征是构成源代码文件的token的状态向量的平均值,这显然无法描述各组成部分之间的关联关系,但是本发明的语法特征是对各组成部分之间关联关系的准确描述;②语义特征的差异,现有技术的语义特征描述的是构成源代码文件的token之间的距离,是一种静态的描述。
(6)现有的基于源代码语法和语义特征的检测方法都存在一定程度的不足:基于n-gram序列的词袋模型和token序列的词向量模型难以准确描述代码的语法和语义;基于AST的检测方法,AST能够很好描述代码的语法,但是AST不能表示程序的执行语义,因此很多与执行语义相关的漏洞不能被检测;基于控制流图的检测方法,CFG能很好表示程序的执行过程,但是CFG不包含变量声明,缺失了一部分语义,对漏洞的检测和定位有较大影响。
发明内容
本发明的目的在于提供一种能够克服上述技术问题的基于语法特征和语义特征的软件安全漏洞检测方法,本发明是一种基于软件源代码的语法特征和语义特征融合的基于深度学习的软件安全漏洞检测方法并用于对软件源代码中的软件安全漏洞进行检测。本发明所述方法包括以下步骤:
步骤1、确定检测对象的粒度:
检测对象的粒度是一个函数、一个文件、一个组件或者任意一段有关联关系的代码片段,根据实际的检测项目需要确定,检测项目的语言是C/C++、Java、PHP。
步骤2、建立软件历史漏洞库:
从公开的软件漏洞库中搜集与检测软件项目编程语言相同的软件安全漏洞,建立针对语言类的漏洞样本库,样本大小为检测粒度大小,漏洞库表明了检测粒度大小的样本具有漏洞的情况,即每个样本是否具有漏洞和具有漏洞的类型和数量;
使用公共漏洞数据库SARD(Software Assurance Reference Dataset)的JTS(Juliet Test Set for C/C++)数据集,JTS的版本为JTS-1.3,共包含246852个函数,具有漏洞的函数105244,占总样本的42%,通过直接分析文件名与函数名得到每个函数的漏洞有无的标签,采用的漏洞标签是1和0,表示漏洞的有和无。
步骤3、建立检测对象的抽象语法树:
在步骤1的基础上,基于LLVM编译器对检测对象进行解析,基于编译器提供的第三方接口Clang Lib,建立检测对象的抽象语法树(AST)。
步骤4、对抽象语法树进行嵌入:
在步骤3的基础上,针对得到的检测对象的抽象语法树,按照深度优先搜索算法(DFS)对抽象语法树进行遍历,生成针对语法树节点的节点序列,针对步骤2中的所有样本,生成每个样本的抽象语法树,并生成每个抽象语法树的节点序列,基于步骤2的漏洞库中所有样本对应的抽象语法树的节点序列,使用word2vec嵌入算法对每个节点进行嵌入,得到节点的向量表示;抽象语法树及其节点序列的示例如下所示:
节点序列:{MethodDeclaration,int,func1,Parameter,int,var1,Blockstmt,ExpressionStmt,VariableDeclaration,int,Assign,var2,EncloseExpr,BinaryExpr:divide,var1,42,ReturnStmt}。
步骤5、对检测对象软件源代码进行编译:
在步骤1的基础上,基于LLVM编译器对检测对象进行编译,获取代码的中间表示(IR,Intermediate Representation)。
步骤6、建立检测对象的程序依赖图:
在步骤5的基础上,基于代码的中间表示IR,通过LLVM提供的Pass框架,建立检测对象的程序依赖图(PDG)。
步骤7、对程序依赖图进行嵌入,在步骤6的基础上,针对得到的检测对象的PDG,按照如下搜索算法对PDG进行遍历,生成针对PDG的节点序列,设一个PDG图的节点集合为V,具体包括以下步骤:
步骤7.1、遍历集合V,输出所有入度为0的节点,设为V1,且V=V-V1;
步骤7.2、对于V1中所有节点的在V中的后继节点,其入度减1;
步骤7.3、重复步骤7.1和步骤7.2,直到V中节点数为0,结束;
步骤7.4、针对步骤2中的所有样本,同样的方法生成每个样本的PDG,并生成每个PDG的节点序列,基于步骤2的漏洞库中所有样本对应的PDG的节点序列,使用word2vec嵌入算法对每个节点进行嵌入,得到节点的向量表示;
PDG及其节点序列的示例如下所示:
得到的节点序列:{BB1,BB2,BB3,BB5,BB4}。
步骤8、使用图卷积神经网络对AST的特征进行学习:
步骤8.1、在步骤4的基础上,选取图卷积神经网络建立针对AST语法特征的深度学习模型;
步骤8.2、将步骤4中得到的节点的向量表示作为图卷积神经网络的输入,基于图卷积神经网络直接对AST的树形结构的特征进行学习,使用的图卷积神经网络包括四层:输入层、卷积层、池化层和全连接层。
步骤9、使用双向LSTM对PDG的特征进行学习:
在步骤7的基础上,选取双向长短期记忆网络(BLSTM)建立针对PDG语义特征的深度学习模型,BLSTM对时间序列输入具有好的学习能力,PDG为时间序列结构,选择BLSTM模型;
使用的BLSTM包括四层:输入层、双向LSTM处理单元层、Attention层与全连接层。
步骤10、建立针对语法特征和语义特征的融合模型,在步骤8和9的基础上,选择两层的全连接神经网络和softmax分类器建立融合模型,将步骤8和步骤9的输出作为全连接层的输入,全连接层的输出作为softmax的输入,Softmax的输出为漏洞的概率。
步骤11、训练和测试检测模型:
步骤11.1、在步骤2建立的漏洞数据库的基础上,基于步骤3将步骤2中的检测对象转换为AST,基于步骤4得到AST的向量表示;基于步骤6将步骤2中的检测对象转换为PDG;
步骤11.2、基于步骤7得到PDG的向量表示,将AST的向量表示以及PDG的向量表示,分别作为图卷积神经网络和BLSTM的输入,检测对象的标签作为分类器的输出,采用Adam优化训练算法对整个模型进行训练和测试。
步骤12、将检测模型应用于新的软件模块,将步骤11中获得的检测模型应用于新的软件模块,首先建立新的软件模块的AST和PDG,转换为向量表示,将向量作为模型的输入,模型运行的输出即为新的软件模块具有漏洞的概率。
本发明所述方法的优越效果是:
1、本发明所述方法采用AST表示软件的语法,采用PDG(程序依赖图)表示软件的语义,分别通过两种针对性的深度神经网络进行特征提取后,基于一个深度神经网络将语法和语义特征进行融合,提高了检测模型的精度、准确率、召回率的性能指标;
2、本发明所述方法采用一种图神经网络直接对AST树形结构进行学习而不需要对AST进行序列转换,不会丢失任何信息,基于图神经网络的特征直接提取方式能够极大提高模型的检测性能;
3、本发明所述方法基于PDG提取语义特征,PDG是对CFG的扩展,包含了控制依赖信息和数据依赖信息,相对于CFG,PDG具有更加完善的语义表达;
4、本发明所述方法采用针对时间序列特征提取良好效果的BLSTM模型对PDG进行语义特征提取,能够提高语义特征提取的准确性和完备性;
5、本发明所述方法所采用的语义特征是程序的执行语义,是一种动态特征,基于程序的执行语义对漏洞能够更加准确检测;
6、本发明所述方法提出了AST+基于图的卷积神经网络的语法特征提取方法、基于PDG+BLSTM的语义特征提取方法、采用基于神经网络的语法和语义特征的融合方法,能够同时全面、准确提取语法和语义特征,并将两类特征进行融合,降低了漏警率。
附图说明
图1是本发明所述方法的原理图;
图2是本发明所述方法的流程图;
图3是本发明所述方法的模型的训练示意图;
图4是本发明所述方法的图卷积神经网络图;
图5是本发明所述方法的BLSTM示意图;
图6是本发明所述方法的抽象语法树及其节点序列的示意图;
图7是本发明所述方法的PDG及其节点序列的示意图。
具体实施方式
下面结合附图对本发明的实施方式进行详细描述。如图1所示,本发明所述方法包括以下步骤:
步骤1、确定检测对象的粒度:
检测对象的粒度是一个函数、一个文件、一个组件或者任意一段有关联关系的代码片段,根据实际的检测项目需要确定,检测项目的语言是C/C++、Java、PHP。
步骤2、建立软件历史漏洞库:
从公开的软件漏洞库中搜集与检测软件项目编程语言相同的软件安全漏洞,建立针对语言类的漏洞样本库,样本大小为检测粒度大小,漏洞库表明了检测粒度大小的样本具有漏洞的情况,即每个样本是否具有漏洞和具有漏洞的类型和数量;
使用公共漏洞数据库SARD(Software Assurance Reference Dataset)的JTS(Juliet Test Set for C/C++)数据集,JTS的版本为JTS-1.3,共包含246852个函数,具有漏洞的函数105244,占总样本的42%,通过直接分析文件名与函数名就能得到每个函数的漏洞有无的标签,也就是采用的漏洞标签是1和0,表示漏洞的有和无。
步骤3、建立检测对象的抽象语法树:
在步骤1的基础上,基于LLVM编译器对检测对象进行解析,基于编译器提供的第三方接口Clang Lib,建立检测对象的抽象语法树(AST)。
步骤4、对抽象语法树进行嵌入:
在步骤3的基础上,针对得到的检测对象的抽象语法树,按照深度优先搜索算法(DFS)对抽象语法树进行遍历,生成针对语法树节点的节点序列,针对步骤2中的所有样本,生成每个样本的抽象语法树,并生成每个抽象语法树的节点序列,基于步骤2的漏洞库中所有样本对应的抽象语法树的节点序列,使用word2vec嵌入算法对每个节点进行嵌入,得到节点的向量表示;
抽象语法树及其节点序列的示例如图6所示:
节点序列:{MethodDeclaration,int,func1,Parameter,int,var1,Blockstmt,ExpressionStmt,VariableDeclaration,int,Assign,var2,EncloseExpr,BinaryExpr:divide,var1,42,ReturnStmt}。
步骤5、对检测对象软件源代码进行编译:
在步骤1的基础上,基于LLVM编译器对检测对象进行编译,获取代码的中间表示(IR,Intermediate Representation)。
步骤6、建立检测对象的程序依赖图:
在步骤5的基础上,基于代码的中间表示IR,通过LLVM提供的Pass框架,建立检测对象的程序依赖图(PDG)。
步骤7、对程序依赖图进行嵌入,在步骤6的基础上,针对得到的检测对象的PDG,按照如下搜索算法对PDG进行遍历,生成针对PDG的节点序列,设一个PDG图的节点集合为V,具体包括以下步骤:
步骤7.1、遍历集合V,输出所有入度为0的节点,设为V1,且V=V-V1;
步骤7.2、对于V1中所有节点的在V中的后继节点,其入度减1;
步骤7.3、重复步骤7.1和步骤7.2,直到V中节点数为0,结束;
步骤7.4、针对步骤2中的所有样本,同样的方法生成每个样本的PDG,并生成每个PDG的节点序列,基于步骤2的漏洞库中所有样本对应的PDG的节点序列,使用word2vec嵌入算法对每个节点进行嵌入,得到节点的向量表示;
PDG及其节点序列的示例如图7所示:
得到的节点序列:{BB1,BB2,BB3,BB5,BB4}。
步骤8、使用图卷积神经网络对AST的特征进行学习:
步骤8.1、在步骤4的基础上,选取图卷积神经网络建立针对AST语法特征的深度学习模型;
步骤8.2、将步骤4中得到的节点的向量表示作为图卷积神经网络的输入,基于图卷积神经网络直接对AST的树形结构的特征进行学习,使用的图卷积神经网络包括四层:输入层、卷积层、池化层和全连接层,如图4所示。
步骤9、使用双向LSTM对PDG的特征进行学习:
在步骤7的基础上,选取双向长短期记忆网络(BLSTM)建立针对PDG语义特征的深度学习模型,BLSTM对时间序列输入具有好的学习能力,PDG为时间序列结构,选择BLSTM模型;
使用的BLSTM包括四层:输入层、双向LSTM处理单元层、Attention层与全连接层,BLSTM示例如图5所示。
步骤10、建立针对语法特征和语义特征的融合模型,在步骤8和9的基础上,选择两层的全连接神经网络和softmax分类器建立融合模型,将步骤8和步骤9的输出作为全连接层的输入,全连接层的输出作为softmax的输入,Softmax的输出为漏洞的概率。
步骤11、训练和测试检测模型:
步骤11.1、在步骤2建立的漏洞数据库的基础上,基于步骤3将步骤2中的检测对象转换为AST,基于步骤4得到AST的向量表示;基于步骤6将步骤2中的检测对象转换为PDG;
步骤11.2、基于步骤7得到PDG的向量表示;将AST的向量表示以及PDG的向量表示,分别作为图卷积神经网络和BLSTM的输入,检测对象的标签作为分类器的输出,采用Adam优化训练算法对整个模型进行训练和测试,如图3所示。
步骤12、将检测模型应用于新的软件模块,将步骤11中获得的检测模型应用于新的软件模块,首先建立新的软件模块的AST和PDG,转换为向量表示,将向量作为模型的输入,模型运行的输出即为新的软件模块具有漏洞的概率。
训练过程中,将实际输出与期望输出的误差进行反向传播,参数调整的次序依次是分类器、全连接层、BLSTM模型以及基于图的卷积神经网络模型,如图3所示。
本发明所述方法中得到了两个节点序列,一个是抽象语法树的节点序列,另一个是程序依赖图的节点序列,由于节点序列的表示都是符号,需要将符号转换成一个数字向量,转化过程采用如下模型:
设一个符号序列表示为w1,w2,…wn,滑动窗口大小等于2,也就是根据一个符号的前后两个符号来预测符号,即使用wt-1,wt-2以及wt+1,wt+2来预测wt,模型的似然函数为由背景词生成任一中心词的概率:
设v表示背景词的向量,u表示中心词的向量,则:
其中,V为所有符号构成的词典,模型的最大似然估计等价于最小化损失函数:
训练结束后,得到词典中任一词作为中心词和背景词的两组词向量v和u,本发明中使用中心词向量作为词的表征向量,Adam优化训练算法的原理如下:设f(x,θ)表示本发明采用的图卷积神经网络或者BLSTM,θ为网络参数,每次选取K个训练样本{(x1,y1),(x2,y2),…,(xK,yK)}对网络的参数进行训练,则第t次迭代时损失函数关于参数θ的偏导数为:
其中L(·)是可微分的损失函数,K为批量大小(batch size),训练过程中,按照如下公式来更新参数的梯度:
θt=θt-1-Δθt……(5),
下面为Δθt的计算方法:
设
Mt=β1Mt-1+(1-β1)gt……(6),
Gt=β2Gt-1+(1-β2)gt⊙gt……(7),
其中β1和β2分别为两个移动平均的衰减率,取值为β1=0.9,β2=0.99,M0=0,G0=0,gt⊙gt为计算每个参数梯度的平方;
设
Adam算法的参数更新值为:
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明公开的范围内,能够轻易想到的变化或替换,都应涵盖在本发明权利要求的保护范围内。
Claims (4)
1.一种基于语法特征和语义特征的软件安全漏洞检测方法,其特征在于,包括以下步骤:
步骤1、确定检测对象的粒度:
检测对象的粒度是一个函数、一个文件、一个组件或者任意一段有关联关系的代码片段,根据实际的检测项目需要确定,检测项目的语言是C/C++、Java、PHP;
步骤2、建立软件历史漏洞库:
从公开的软件漏洞库中搜集与检测软件项目编程语言相同的软件安全漏洞,建立针对语言类的漏洞样本库,样本大小为检测粒度大小,漏洞库表明了检测粒度大小的样本具有漏洞的情况,即每个样本是否具有漏洞和具有漏洞的类型和数量;
使用公共漏洞数据库SARD数据集,JTS的版本为JTS-1.3,共包含246852个函数,具有漏洞的函数105244,占总样本的42%,通过直接分析文件名与函数名就能得到每个函数的漏洞有无的标签,也就是采用的漏洞标签是1和0,表示漏洞的有和无;
步骤3、建立检测对象的抽象语法树:
在步骤1的基础上,基于LLVM编译器对检测对象进行解析,基于编译器提供的第三方接口Clang Lib,建立检测对象的抽象语法树;
步骤4、对抽象语法树进行嵌入:
在步骤3的基础上,针对得到的检测对象的抽象语法树,按照深度优先搜索算法对抽象语法树进行遍历,生成针对语法树节点的节点序列,针对步骤2中的所有样本,生成每个样本的抽象语法树,并生成每个抽象语法树的节点序列,基于步骤2的漏洞库中所有样本对应的抽象语法树的节点序列,使用word2vec嵌入算法对每个节点进行嵌入,得到节点的向量表示;
步骤5、对检测对象软件源代码进行编译:
在步骤1的基础上,基于LLVM编译器对检测对象进行编译,获取代码的中间表示;
步骤6、建立检测对象的程序依赖图:
在步骤5的基础上,基于代码的中间表示IR,通过LLVM提供的Pass框架,建立检测对象的程序依赖图;
步骤7、对程序依赖图进行嵌入,在步骤6的基础上,针对得到的检测对象的PDG;
步骤8、使用图卷积神经网络对AST的特征进行学习;
步骤9、使用双向LSTM对PDG的特征进行学习:
在步骤7的基础上,选取双向长短期记忆网络建立针对PDG语义特征的深度学习模型,BLSTM对时间序列输入具有好的学习能力,PDG为时间序列结构,选择BLSTM模型;
使用的BLSTM包括四层:输入层、双向LSTM处理单元层、Attention层与全连接层;
步骤10、建立针对语法特征和语义特征的融合模型,在步骤8和9的基础上,选择两层的全连接神经网络和softmax分类器建立融合模型,将步骤8和步骤9的输出作为全连接层的输入,全连接层的输出作为softmax的输入,Softmax的输出为漏洞的概率;
步骤11、训练和测试检测模型;
步骤12、将检测模型应用于新的软件模块,将步骤11中获得的检测模型应用于新的软件模块,首先建立新的软件模块的AST和PDG,转换为向量表示,将向量作为模型的输入,模型运行的输出即为新的软件模块具有漏洞的概率。
2.根据权利要求1所述的一种基于语法特征和语义特征的软件安全漏洞检测方法,其特征在于,所述步骤7包括以下步骤:
步骤7.1、遍历集合V,输出所有入度为0的节点,设为V1,且V=V-V1;
步骤7.2、对于V1中所有节点的在V中的后继节点,其入度减1;
步骤7.3、重复步骤7.1和步骤7.2,直到V中节点数为0,结束;
步骤7.4、针对步骤2中的所有样本,同样的方法生成每个样本的PDG,并生成每个PDG的节点序列,基于步骤2的漏洞库中所有样本对应的PDG的节点序列,使用word2vec嵌入算法对每个节点进行嵌入,得到节点的向量表示。
3.根据权利要求1所述的一种基于语法特征和语义特征的软件安全漏洞检测方法,其特征在于,所述步骤8包括以下步骤:
步骤8.1、在步骤4的基础上,选取图卷积神经网络建立针对AST语法特征的深度学习模型;
步骤8.2、将步骤4中得到的节点的向量表示作为图卷积神经网络的输入,基于图卷积神经网络直接对AST的树形结构的特征进行学习,使用的图卷积神经网络包括四层:输入层、卷积层、池化层和全连接层。
4.根据权利要求1所述的一种基于语法特征和语义特征的软件安全漏洞检测方法,其特征在于,所述步骤11包括以下步骤:
步骤11.1、在步骤2建立的漏洞数据库的基础上,基于步骤3将步骤2中的检测对象转换为AST,基于步骤4得到AST的向量表示;基于步骤6将步骤2中的检测对象转换为PDG;
步骤11.2、基于步骤7得到PDG的向量表示;将AST的向量表示以及PDG的向量表示,分别作为图卷积神经网络和BLSTM的输入,检测对象的标签作为分类器的输出,采用Adam优化训练算法对整个模型进行训练和测试。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011488425.3A CN112541180B (zh) | 2020-12-16 | 2020-12-16 | 一种基于语法特征和语义特征的软件安全漏洞检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011488425.3A CN112541180B (zh) | 2020-12-16 | 2020-12-16 | 一种基于语法特征和语义特征的软件安全漏洞检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112541180A true CN112541180A (zh) | 2021-03-23 |
CN112541180B CN112541180B (zh) | 2022-09-13 |
Family
ID=75018216
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011488425.3A Active CN112541180B (zh) | 2020-12-16 | 2020-12-16 | 一种基于语法特征和语义特征的软件安全漏洞检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112541180B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113076235A (zh) * | 2021-04-09 | 2021-07-06 | 中山大学 | 一种基于状态融合的时序异常检测方法 |
CN113158194A (zh) * | 2021-03-30 | 2021-07-23 | 西北大学 | 一种基于多关系图网络的漏洞模型的构建方法及检测方法 |
CN113220301A (zh) * | 2021-04-13 | 2021-08-06 | 广东工业大学 | 一种基于分层神经网络的克隆一致性变化预测方法和*** |
CN113297580A (zh) * | 2021-05-18 | 2021-08-24 | 广东电网有限责任公司 | 基于代码语义分析的电力信息***安全防护方法及装置 |
CN113722218A (zh) * | 2021-08-23 | 2021-11-30 | 南京审计大学 | 一种基于编译器中间表示的软件缺陷预测模型构建方法 |
CN114816997A (zh) * | 2022-03-29 | 2022-07-29 | 湖北大学 | 一种基于图神经网络与双向gru特征抽取的缺陷预测方法 |
CN115130110A (zh) * | 2022-07-08 | 2022-09-30 | 国网浙江省电力有限公司电力科学研究院 | 基于并行集成学习的漏洞挖掘方法、装置、设备及介质 |
CN115577361A (zh) * | 2022-12-09 | 2023-01-06 | 四川大学 | 一种改进的基于图神经网络的PHP Web shell检测方法 |
CN115795487A (zh) * | 2023-02-07 | 2023-03-14 | 深圳开源互联网安全技术有限公司 | 漏洞检测方法、装置、设备及存储介质 |
CN116628707A (zh) * | 2023-07-19 | 2023-08-22 | 山东省计算中心(国家超级计算济南中心) | 一种可解释性的基于多任务的源代码漏洞检测的方法 |
CN117725422A (zh) * | 2024-02-07 | 2024-03-19 | 北京邮电大学 | 程序代码漏洞检测模型训练方法及检测方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109214191A (zh) * | 2018-09-18 | 2019-01-15 | 北京理工大学 | 一种利用深度学习预测软件安全漏洞的方法 |
CN110222512A (zh) * | 2019-05-21 | 2019-09-10 | 华中科技大学 | 一种基于中间语言的软件漏洞智能检测与定位方法与*** |
CN110245496A (zh) * | 2019-05-27 | 2019-09-17 | 华中科技大学 | 一种源代码漏洞检测方法及检测器和其训练方法及*** |
-
2020
- 2020-12-16 CN CN202011488425.3A patent/CN112541180B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109214191A (zh) * | 2018-09-18 | 2019-01-15 | 北京理工大学 | 一种利用深度学习预测软件安全漏洞的方法 |
CN110222512A (zh) * | 2019-05-21 | 2019-09-10 | 华中科技大学 | 一种基于中间语言的软件漏洞智能检测与定位方法与*** |
CN110245496A (zh) * | 2019-05-27 | 2019-09-17 | 华中科技大学 | 一种源代码漏洞检测方法及检测器和其训练方法及*** |
Non-Patent Citations (7)
Title |
---|
GUANJUN LIN 等: "POSTER: Vulnerability Discovery with Function Representation Learning from Unlabeled Projects", 《CCS "17: PROCEEDINGS OF THE 2017 ACM SIGSAC CONFERENCE ON COMPUTER AND COMMUNICATIONS SECURITY》 * |
HOA KHANH DAM 等: "A deep tree based model for software defect prediction", 《ARXIV:1802.00921》 * |
HOA KHANH DAM等: "Automatic feature learning for vulnerability prediction", 《ARXIV:1708.02368》 * |
JACOB A. HARER 等: "Automated software vulnerability detection with machine learning", 《ARXIV:1803.04497》 * |
ZHEN LI 等: "VulDeePecker:A Deep Learning Based System for Vulnerability Detection", 《ARXIV:1801.01681V1》 * |
陈肇炫等: "基于抽象语法树的智能化漏洞检测***", 《信息安全学报》 * |
龚扣林等: "基于BiLSTM模型的漏洞检测", 《计算机科学》 * |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113158194B (zh) * | 2021-03-30 | 2023-04-07 | 西北大学 | 一种基于多关系图网络的漏洞模型的构建方法及检测方法 |
CN113158194A (zh) * | 2021-03-30 | 2021-07-23 | 西北大学 | 一种基于多关系图网络的漏洞模型的构建方法及检测方法 |
CN113076235A (zh) * | 2021-04-09 | 2021-07-06 | 中山大学 | 一种基于状态融合的时序异常检测方法 |
CN113220301A (zh) * | 2021-04-13 | 2021-08-06 | 广东工业大学 | 一种基于分层神经网络的克隆一致性变化预测方法和*** |
CN113297580A (zh) * | 2021-05-18 | 2021-08-24 | 广东电网有限责任公司 | 基于代码语义分析的电力信息***安全防护方法及装置 |
CN113297580B (zh) * | 2021-05-18 | 2024-03-22 | 广东电网有限责任公司 | 基于代码语义分析的电力信息***安全防护方法及装置 |
CN113722218A (zh) * | 2021-08-23 | 2021-11-30 | 南京审计大学 | 一种基于编译器中间表示的软件缺陷预测模型构建方法 |
CN114816997A (zh) * | 2022-03-29 | 2022-07-29 | 湖北大学 | 一种基于图神经网络与双向gru特征抽取的缺陷预测方法 |
CN114816997B (zh) * | 2022-03-29 | 2023-08-18 | 湖北大学 | 一种基于图神经网络与双向gru特征抽取的缺陷预测方法 |
CN115130110B (zh) * | 2022-07-08 | 2024-03-19 | 国网浙江省电力有限公司电力科学研究院 | 基于并行集成学习的漏洞挖掘方法、装置、设备及介质 |
CN115130110A (zh) * | 2022-07-08 | 2022-09-30 | 国网浙江省电力有限公司电力科学研究院 | 基于并行集成学习的漏洞挖掘方法、装置、设备及介质 |
CN115577361A (zh) * | 2022-12-09 | 2023-01-06 | 四川大学 | 一种改进的基于图神经网络的PHP Web shell检测方法 |
CN115795487A (zh) * | 2023-02-07 | 2023-03-14 | 深圳开源互联网安全技术有限公司 | 漏洞检测方法、装置、设备及存储介质 |
CN116628707A (zh) * | 2023-07-19 | 2023-08-22 | 山东省计算中心(国家超级计算济南中心) | 一种可解释性的基于多任务的源代码漏洞检测的方法 |
CN117725422A (zh) * | 2024-02-07 | 2024-03-19 | 北京邮电大学 | 程序代码漏洞检测模型训练方法及检测方法 |
CN117725422B (zh) * | 2024-02-07 | 2024-05-07 | 北京邮电大学 | 程序代码漏洞检测模型训练方法及检测方法 |
Also Published As
Publication number | Publication date |
---|---|
CN112541180B (zh) | 2022-09-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112541180B (zh) | 一种基于语法特征和语义特征的软件安全漏洞检测方法 | |
CN111639344B (zh) | 一种基于神经网络的漏洞检测方法及装置 | |
CN109977205B (zh) | 一种计算机自主学习源代码的方法 | |
CN112215013B (zh) | 一种基于深度学习的克隆代码语义检测方法 | |
CN113672931B (zh) | 一种基于预训练的软件漏洞自动检测方法及装置 | |
CN113312464B (zh) | 一种基于对话状态追踪技术的事件抽取方法 | |
CN113138920B (zh) | 基于知识图谱与语义角色标注的软件缺陷报告分派方法及装置 | |
CN114064487A (zh) | 一种代码缺陷检测方法 | |
CN116661805B (zh) | 代码表示的生成方法和装置、存储介质及电子设备 | |
CN113742733A (zh) | 阅读理解漏洞事件触发词抽取和漏洞类型识别方法及装置 | |
CN114547318A (zh) | 故障信息获取方法、装置、设备和计算机存储介质 | |
CN117215935A (zh) | 一种基于多维度代码联合图表示的软件缺陷预测方法 | |
CN115757695A (zh) | 一种日志语言模型训练方法及*** | |
CN116861269A (zh) | 工程领域的多源异构数据融合及分析方法 | |
CN115221332A (zh) | 一种危化品事故事理图谱的构建方法与*** | |
CN112579777B (zh) | 一种未标注文本的半监督分类方法 | |
CN116702160B (zh) | 一种基于数据依赖增强程序切片的源代码漏洞检测方法 | |
CN117725592A (zh) | 一种基于有向图注意力网络的智能合约漏洞检测方法 | |
CN117056226A (zh) | 基于迁移学习的跨项目软件缺陷数量预测方法 | |
CN115098389B (zh) | 一种基于依赖模型的rest接口测试用例生成方法 | |
CN115982037A (zh) | 一种基于抽象语法树的软件缺陷预测方法 | |
CN115935367A (zh) | 一种基于图神经网络的源代码漏洞静态检测及定位方法 | |
CN113011162B (zh) | 一种指代消解方法、装置、电子设备及介质 | |
CN114780403A (zh) | 基于增强代码属性图的软件缺陷预测方法及预测装置 | |
Qu et al. | Software Defect Detection Method Based on Graph Structure and Deep Neural Network |
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 |