基于图卷积网络对代码图表示学习的源代码漏洞检测方法技术

技术编号:25949366 阅读:27 留言:0更新日期:2020-10-17 03:41
本发明专利技术公开了一种基于图卷积网络对代码图表示学习的源代码漏洞检测方法,所述方法如下:生成代码属性图;在代码属性图中添加函数调用关系和过程间依赖关系;根据漏洞关键点获取代码切片;利用切片对图中节点进行删减,提取与漏洞相关的图结构信息;使用图卷积网络学习每个节点的向量表示;根据边的类型划分子图,并通过基于注意力机制的READOUT模型得到图的向量表示;根据图的向量表示和标签调整网络参数;用训练好的模型检测代码漏洞。本发明专利技术能充分利用和学习漏洞代码的结构和属性信息,避免传统深度网络在对代码表示学习时易丢失代码结构信息及因需要把代码表示成固定长度序列而丢失长代码上下文信息的问题,有助于降低漏洞检测的误报和漏报。

【技术实现步骤摘要】
基于图卷积网络对代码图表示学习的源代码漏洞检测方法
本专利技术涉及一种软件漏洞检测方法,具体涉及一种基于图卷积网络对代码进行图表示学习的源代码漏洞检测方法。
技术介绍
软件漏洞是在软件设计与开发实现的过程中存在的一些容易被恶意攻击者利用的缺陷。传统的源代码审查技术在很大程度上取决于审查人员对安全问题的理解与长期经验的积累,并且在代码规模和复杂程度日益增大的情况下无法满足对漏洞检测的需求。基于机器学习的漏洞检测方法虽然避免了基于规则的漏洞检测方法依赖专家人工编写检测规则的问题,但是仍需要人工提取漏洞特征。而近年来成功应用于自然语言处理、图像识别、目标检测领域的深度学习技术可以降低对专家经验和手工特征工程的依赖,为自动提取漏洞特征和生成漏洞模式提供了可能。然而,由于编程语言的特殊性、漏洞类型的多样性、漏洞上下文的复杂性、漏洞代码与漏洞特征在抽象程度上的高差异性、漏洞代码与修复代码之间的高相似性,这些都使得深度学习自动学习漏洞模式比其他领域的深度学习问题更加困难,给基于深度学习的漏洞检测技术带来了巨大的挑战。当前用于自动学习漏洞模式的深度学习模型大多采用语言模型对代码语义进行建模,把代码的各种中间表示转化为一个平铺的一维序列,即将其当作自然语言文本,基于自然语言处理领域常用的深度神经网络(如LSTM和GRU)来处理转换后的代码序列,然后将其自动学习到的代码漏洞特征用于训练一个机器学习分类器,以进行漏洞检测。相对于自然语言文本而言,代码更具有结构化的特点,这种漏洞检测方法未能充分利用和学习漏洞代码的结构信息和属性信息,并且因需要把代码表示成固定长度的序列还会丢失长代码的上下文信息,在漏洞检测时往往存在较高的误报率和漏报率。代码属性图(CodePropertyGraph,CPG)是一种程序语法、控制流和数据流的联合表示,结合了抽象语法树、控制流图和程序依赖图来综合表征程序的结构和语义,是Yamaguchi等人(F.Yamaguchi,N.Golde,D.Arp,K.Rieck,Modelinganddiscoveringvulnerabilitieswithcodepropertygraphs,Proceedings,IEEESymposiumonSecurityandPrivacy.(2014)590–604.doi:10.1109/SP.2014.44)首次提出的一种新型的代码表示形式,该漏洞检测方法使用图数据库查询语句遍历代码属性图,利用模式匹配的方法查找符合某种模式的软件漏洞,提高了对已知漏洞模式识别的准确率,但是该方法仅适用于识别已知的漏洞模式,并且在代码属性图中没有考虑过程间分析,对于跨过程调用的漏洞有可能产生漏报。Wang等人(CPGVA-CodePropertyGraphbasedVulnerabilityAnalysisbyDeepLearning,2018)进一步使用CNN和LSTM等传统的深度神经网络来从代码属性图上学习漏洞代码模式,提高了漏洞识别的准确率,但仍存在较高的漏报率。相对于使用以固定长度序列化数据作为输入的传统深度神经网络(如LSTM和GRU)而言,图神经网络更适合学习图输入这种与节点输入顺序无关的结构特征表示,且对需要学习的图数据的节点和边的数量没有限制,更适合对漏洞代码的复杂结构语义进行有效编码以捕获更广泛的漏洞特征。但是目前仅有两篇利用图神经网络进行漏洞检测的研究。一篇是2019年岳佳的硕士学位论文“基于漏洞基因的软件漏洞检测研究”将从代码的抽象语法树中提取的特征作为文本信息,来构造一个大的文本图,利用图卷积网络(GraphConvolutionalNetwork,GCN)对提取的特征进行分类进而实现漏洞检测,同时还提出一种基于漏洞基因的漏洞检测方法,基于代码属性图和图遍历来实现漏洞检测。前者仍将代码视作为文本来处理,未充分提取和利用代码的图结构信息,后者仍使用模式匹配的方式,未使用深度学习模型对代码进行图表示学习。另一篇是Zhou等人(YaqinZhou,ShangqingLiu,JingkaiSiow,XiaoningDu,andYangLiu,Devign:EffectiveVulnerabilityIdentificationbyLearningComprehensiveProgramSemanticsviaGraphNeuralNetworks[C],33rdConferenceonNeuralInformationProcessingSystems,Vancouver,Canada33rdConferenceonNeuralInformationProcessingSystems(NeurIPS2019),Vancouver,Canada)首次提出的用门控图神经网络(Gatedgraphneuralnetwork,GGNN)从以AST为主干建立的代码属性图上学习漏洞模式的方法。该方法以AST为主干显式编码程序的控制依赖和数据依赖,在函数规模较大时存在图结构过深过大导致学习效率较低的问题,而且该方法对代码的分析仅限于一个函数内,未考虑函数调用与过程间的数据依赖,对于跨函数调用的漏洞有可能产生漏报。
技术实现思路
本专利技术的目的是提供一种基于图卷积网络对代码图表示学习的源代码漏洞检测方法,该方法能够充分利用和学习漏洞代码的结构、属性信息和上下文信息,避免传统的深度网络在对代码进行表示学习时丢失代码结构信息和长代码的上下文信息的问题,有助于降低漏洞检测的误报和漏报。本专利技术的目的是通过以下技术方案实现的:一种基于图卷积网络对代码图表示学习的源代码漏洞检测方法,首先,通过解析源代码,生成以抽象语法树、控制流图和程序依赖图联合表示代码结构信息、以代码内容和节点类型表示代码属性信息的代码属性图。为了更准确地提取漏洞相关的图结构信息,尤其是跨函数调用的漏洞结构信息,在代码属性图中引入了函数调用关系和过程间程序依赖关系。为了避免源代码中大量漏洞无关语句对漏洞检测造成的噪声干扰,加快模型的学习速度,利用程序切片技术,根据可能的漏洞关键点生成程序切片,利用程序切片对改进的代码属性图表示的图结构进行简化,去除与漏洞关键点无关的节点。其次,基于图卷积神经网络GCN,对上述简化后的图结构进行图表示学习,将软件漏洞检测问题转化为图级分类问题,实现对代码结构信息和属性信息端对端的学习。首先是基于GCN在每个代码属性图节点上学习代码的结构特征,即将代码属性图作为图数据,直接对其进行图表示学习,而不是将其看作文本分类问题进行处理,然后为了更好地学习图的局部和全局结构信息,提出了按关系类型划分子图并对各个子图和全图分别进行表示学习的方法,以及基于子图自注意力和节点注意力机制的READOUT(读出)模型。按关系类型(即边的类型)拆分子图,有助于提取出与不同类型漏洞相关的子图结构。基于子图自注意力和节点注意力机制的READOUT模型,有助于突出每个节点和每个子图在漏洞检测任务中的重要程度。具体包括如下步骤:步骤1:通过解析源代码,生成以抽象语法树、控制流图和程序依本文档来自技高网
...

【技术保护点】
1.一种基于图卷积网络对代码图表示学习的源代码漏洞检测方法,其特征在于所述方法包括如下步骤:/n步骤1:通过解析源代码,生成以抽象语法树、控制流图和程序依赖图联合表示代码结构信息,以代码内容和节点类型表示代码属性信息的代码属性图;/n步骤2:在代码属性图中添加函数调用关系和过程间依赖关系;/n步骤3:利用程序切片技术提取与漏洞关键点相关的程序切片;/n步骤4:利用得到的程序切片简化步骤1和步骤2提取得到的图结构信息,得到简化后的与漏洞相关的图结构:/n步骤5:使用图卷积网络对图数据进行表示学习,学习每个节点的向量表示;/n步骤6:根据边的类型,在图结构上划分出多个子图,并通过基于节点注意力机制的READOUT模型得到每个子图的向量表示,基于子图自注意力机制的READOUT模型得到全图的向量表示;/n步骤7:将得到的子图和全图的向量表示进行拼接后送入全连接层和softmax层得到预测结果,利用标签信息计算交叉熵损失函数,根据误差反向传播调整网络参数,直到网络对输入的响应达到预定的目标范围为止,训练结束;/n步骤8:用训练好的图卷积神经网络模型对代码进行漏洞检测。/n

【技术特征摘要】
1.一种基于图卷积网络对代码图表示学习的源代码漏洞检测方法,其特征在于所述方法包括如下步骤:
步骤1:通过解析源代码,生成以抽象语法树、控制流图和程序依赖图联合表示代码结构信息,以代码内容和节点类型表示代码属性信息的代码属性图;
步骤2:在代码属性图中添加函数调用关系和过程间依赖关系;
步骤3:利用程序切片技术提取与漏洞关键点相关的程序切片;
步骤4:利用得到的程序切片简化步骤1和步骤2提取得到的图结构信息,得到简化后的与漏洞相关的图结构:
步骤5:使用图卷积网络对图数据进行表示学习,学习每个节点的向量表示;
步骤6:根据边的类型,在图结构上划分出多个子图,并通过基于节点注意力机制的READOUT模型得到每个子图的向量表示,基于子图自注意力机制的READOUT模型得到全图的向量表示;
步骤7:将得到的子图和全图的向量表示进行拼接后送入全连接层和softmax层得到预测结果,利用标签信息计算交叉熵损失函数,根据误差反向传播调整网络参数,直到网络对输入的响应达到预定的目标范围为止,训练结束;
步骤8:用训练好的图卷积神经网络模型对代码进行漏洞检测。


2.根据权利要求1所述的基于图卷积网络对代码图表示学习的源代码漏洞检测方法,其特征在于所述步骤2的具体步骤如下:
步骤21:选取图中类型为函数的节点;
步骤22:遍历其孩子节点即函数体的节点,查找边类型为与控制流和数据流相关的边,获取到节点和边信息加入图结构信息中;
步骤23:从孩子节点中选取类型为Callee的节点,根据函数名和路径递归查找被调用的函数;
步骤24:重复步骤21、22、23,直至遍历完函数中的所有节点,得到与漏洞相关的控制流、程序依赖和函数调用的图结构信息。


3.根据权利要求1所述的基于图卷积网络对代码图表示学习的源代码漏洞检测方法,其特征在于所述步骤...

【专利技术属性】
技术研发人员:苏小红段亚男王甜甜蒋远赵玲玲
申请(专利权)人:哈尔滨工业大学
类型:发明
国别省市:黑龙江;23

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1