一种基于图神经网络的细粒度源代码漏洞检测方法与流程

文档序号:21035034发布日期:2020-06-09 20:23阅读:310来源:国知局
一种基于图神经网络的细粒度源代码漏洞检测方法与流程

本发明涉及网络安全技术领域,尤其涉及一种基于图神经网络的细粒度源代码漏洞检测方法。



背景技术:

软件作为信息化社会中不可或缺的一部分发挥着越来越重要的作用,它不仅和个人的日常生活密不可分也和社会的发展息息相关。然而软件是一把双刃剑,它在为个人和社会提供便利的服务的同时,软件中潜在的漏洞也可能会对个人和社会造成极大的损失。软件中的漏洞往往是不可避免地,一方面是由于软件在设计、开发、部署过程中很难做到不存在问题,另一方面则是由于商业效益原因软件开发周期不能太长,进一步增加了软件存在漏洞的风险。为了减少软件中漏洞,提高软件质量,软件漏洞检测技术应运而生。漏洞检测技术就是通过检查软件的源代码或者软件的执行过程,根据经验、已知的漏洞模式、软件的执行结果等判断软件是否存在漏洞。

现有的漏洞检测技术按照是否需要执行软件分为静态的方法和动态的方法。静态的漏洞检测方法无需运行软件,通过分析软件的源代码或二进制文件,寻找软件中的漏洞,成熟的方法主要有污点分析、安全规则检查等。静态分析的方法通常需要很强的专家知识,费时费力,漏报率高。以污点分析为例,污点分析首先需要确定软件中的污点(外部输入、安全敏感的数据),通过跟踪污点在数据流和控制流中的目的地,判断污点是否会产生问题,整个过程相当依赖检测人员的领域知识,检测效率自然因人而异。动态的漏洞检测方法则需要运行软件,通过分析软件的执行结果判断软件是否存在漏洞,成熟的方法主要有模糊测试、符号执行等。模糊测试通过构造随机、非预期的程序输入,根据程序执行过程中的异常,定位可能的漏洞,但往往不能够覆盖程序的所有执行路径,漏报率较高;符号执行则通过将程序输入符号化、程序执行公式化,理论上能够计算并测试所有的执行路径,但是由于求解开销大的问题,难以在日常开发中普及。除了上述较为成熟的漏洞检测方法,基于机器学习、深度学习的检测方法也逐渐走向实际应用中。针对源代码中的漏洞检测,现有的基于机器学习的方法一方面需要依赖领域专家提取特征,另一方面则是检测漏洞通常在文件级别和函数级别,检测的粒度还需细化;而现有的基于深度学习的方法的检测粒度同样仍需细化,此外源代码还需要转化成合适的中间表示以便于使用深度学习算法进行学习。



技术实现要素:

有鉴于现有技术的上述缺陷,本发明所要解决的技术问题是提供一种基于图神经网络的细粒度源代码漏洞检测方法,以代码属性图作为源代码的中间表示,使用图注意力网络学习语句的向量表示,最终结合深度神经网络实现语句级别的细粒度漏洞检测,解决了现有漏洞检测方法漏报率高、严重依赖领域专家知识、检测粒度过大、源代码欠缺合适中间表示的问题。

为实现上述目的,本发明提供了一种基于图神经网络的细粒度源代码漏洞检测方法,包括以下步骤:

步骤a,对于一个软件的所有源代码,抽取源代码中函数的代码属性图,将代码属性图进行向量化表示,向量化表示包括节点属性、图结构的向量化表示;

步骤b,使用图注意力网络抽取代码特征,将向量化表示的代码属性图输入到图注意力网络中,学习得到节点的抽象向量表示,从节点向量表示中提取函数中每一语句的向量表示x,根据语句是否存在漏洞,为语句添加标签y,对所有语句进行处理得到最终的数据集;

步骤c,训练漏洞检测模型,将数据集分为训练集、测试集,将训练集的数据输入到一个卷积神经网络中进行训练,通过在测试集上的效果进行网络参数的调整,确定最终的模型。

进一步地,所述步骤a具体为:

步骤a-1),将代码属性图的节点进行向量化表示。代码属性图的节点属性包含代码和类型两个属性;代码属性的内容为标志序列,以所有的标志的集合作为词库,使用词嵌入模型将标志转换成数值向量表示,进一步将代码属性表示成标志向量的均值vcode;类型属性表示节点的类型,使用一位热编码将其表示成数值向量vtype,最终节点属性vnode由vcode和vtype拼接而成;

步骤a-2),将代码属性图的图结构进行向量化表示。代码属性图的图结构由邻接矩阵a表示,代码属性图中边的类型包括抽象语法树的边east、控制流图的边ecfg,在邻接矩阵中用1表示east,用2表示ecfg,最终一个函数的代码属性图表示为为g(v,a),v为图中所有的节点向量列表,a为图的邻接矩阵。

进一步地,所述步骤b中图注意力网络采用监督学习方法训练得到,具体为:

步骤b-1),首先根据漏洞数据库的信息标记函数是否存在漏洞,其次将函数代码属性图的向量化表示g(v,a)进行标准化处理,根据所有函数代码属性图节点数的分布,选择合适的数值作为标准节点数,对过大的代码属性图进行裁剪,对过小的代码属性图添加孤立的无属性节点,得到标准化表示g′(v′,a′);

步骤b-2),最后将g′(v′,a′)和相应的标签输入到图注意力网络中,使用n次k折交叉验证方法评估训练的效果,当训练模型在测试集上的f1值达到一个相对平稳值后,从图注意网络的最后一个图注意卷积层输出节点的向量化表示;

步骤b-3),进一步从节点向量表示中提取函数中每一语句的向量表示x,根据漏洞数据的信息确定语句是否存在漏洞,为语句添加标签y,对所有语句进行处理得到最终的数据集。

进一步地,所述步骤b-2中训练模型在测试集上的f1值由以下公式计算得到:

其中,tp、fp、tn、fn分别表示真正例(truepositive)、假正例(falsepositive)、真反例(truenegative)、假反例(falsenegative);在函数级别的漏洞检测中,真正例表示测试样本实际为含漏洞函数,预测结果为含漏洞函数;假正例表示测试样本实际为不含漏洞函数,预测结果为含漏洞函数;真反例表示测试样本实际为不含漏洞函数,预测结果亦为不含漏洞函数;假反例表示测试样本实际为含漏洞函数,预测结果为不含漏洞函数。

进一步地,所述步骤b-3中y为0表示语句没有漏洞,为1则表示语句存在漏洞。

进一步地,所述卷积神经网络由一个输入层、数个卷积层和全局池化层、数个全连接层、一个输出层组成,网络参数的由具体的数据集确定,具体需要调试的参数包括卷积层和最大池化层的层数、全连接层的层数、各层的单元数、卷积核的大小、学习率、训练批次的大小、激活函数的选择、epoch值。

本发明的有益效果是:

本发明所提的源代码漏洞检测方法具有更高的自动化程度,减少对领域专家知识的依赖,大大节约代码审计的成本,提高代码审计的效率。而相较于其它使用深度学习进行漏洞检测的方法,本方法基于代码属性图能更好地保留源代码中地语法和语义信息,同时使用图注意网络能更有目的性地学习语句的向量化表示,实现更细粒度的语句级别的漏洞检测。

以下将结合附图对本发明的构思、具体结构及产生的技术效果作进一步说明,以充分地了解本发明的目的、特征和效果。

附图说明

图1是本发明实施例的总体框架图。

图2是本发明实施例的示例函数图。

图3是本发明实施例的示例函数代码属性图。

图4是本发明实施例的节点向量化过程图。

图5是本发明实施例的代码属性图结构向量化过程图。

图6是本发明实施例的图注意网络结构图。

具体实施方式

为更好地阐述本发明所提的细粒度的源代码漏洞检测方法,便于本领域的技术人员实现本发明,以下通过具体的实施实例和附图详尽地描述方法的实现流程。应当理解,此处所描述的实施实例仅用于解释本发明,但并不限于本发明

本发明实施的前提条件是已有一个可用的大型漏洞数据库,同时可从漏洞数据库中可明确得知漏洞类型和漏洞在源代码中所在的位置,从该数据库中可以收集包含某种类型漏洞且编程语言相同的源代码作为数据集。图1为所提漏洞检测方法的总体框架图,主要分为特征抽取模块和模型训练模块。在特征抽取模块中首先从源代码中抽取函数的代码属性图,将其向量化表示为g(v,a),进一步使用图注意网络提取语句的特征向量;模型训练模块以语句的特征向量和其相应的标签为输入,经过训练得到语句级别的漏洞检测模型。训练模型为一个卷积神经网络,包括一个输入层、数个卷积层和全局池化层、数个全连接层和一个输出层。

步骤a),对于一个软件的所有源代码,抽取源代码中函数的代码属性图,将代码属性图进行向量化表示成g(v,a),以下以图2的示例代码,详细说明方法的图向量化表示的过程。

步骤a-1),将函数的代码属性图的节点向量化表示。示例函数抽取的代码属性图如图3所示,代码属性图可以使用程序分析工具joern生成。代码属性图的节点属性包含代码和类型两个属性。图3中每个节点中的内容第一行表示代码,第二行表示节点的类型。

代码属性使用词嵌入模型glove,以数据集所有标志作为词库,将标志转换成数值向量表示,进一步将代码属性表示成标志向量的均值vcode;类型属性表示节点的类型,使用一位热编码将其表示成数值向量vtype,最终节点属性vnode由vcode和vtype拼接而成。为了表述的清晰性,图4中以示例函数中的语句returna+b;为例展示函数代码属性图节点转换成向量表示的过程。

步骤a-2),将函数的代码属性图的图结构表示成邻接矩阵a。代码属性图包括两种类型的边,分别为抽象语法树ast的边east、控制流图cfg的边ecfg,邻接矩阵中用0表示节点间无边连接,用1表示节点间存在一条east,用2表示节点间存在一条ecfg。要得到邻接矩阵,首先需要将代码属性图按照深度优先的次序将节点编号,然后根据节点间边的连接性生成邻接矩阵a。最终一个函数的代码属性图表示为g(v,a),v为图中所有的节点向量列表,a为图的邻接矩阵。为简洁明了地说明该过程,图5以示例函数的代码属性图的子图为例,展示代码属性图图结构向量化成邻接矩阵的过程。

步骤b),使用图注意网络抽取函数代码中的特征,将源代码中的语句向量化表示。为从函数代码属性图学习到更好的节点向量化表示,采用监督学习方法训练图注意力网络。

步骤b-1),首先根据漏洞数据库的信息标记函数是否存在漏洞;其次将函数代码属性图的向量化表示g(v,a)进行标准化处理,根据所有函数代码属性图节点数的分布,选择合适的数值(如75%分位点)作为标准节点数,对过大的代码属性图进行裁剪,对过小的代码属性图添加孤立的无属性节点,得到标准化表示g′(v′,a′);

步骤b-2),最后将g′(v′,a′)和相应的标签输入到图注意力网络中,图注意网络的结构如图6所示,使用n次k折交叉验证方法评估训练的效果,当训练模型在测试集上的f1值达到一个相对平稳值后,从图注意网络的最后一个图注意卷积层输出节点的向量化表示。

步骤b-3),进一步从节点向量表示中提取函数中每一语句的向量表示x,根据漏洞数据库的信息确定语句是否存在漏洞;为语句添加标签y,y为0表示语句没有漏洞,为1则表示语句存在漏洞。对所有语句进行上述处理得到最终的数据集。

为说明f1值的计算,记检测模型的四种可能预测结果为tp、fp、tn、fn,分别表示真正例(truepositive)、假正例(falsepositive)、真反例(truenegative)、假反例(falsenegative)。在函数级别的漏洞检测中,真正例表示测试样本实际为含漏洞函数,预测结果为含漏洞函数;假正例表示测试样本实际为不含漏洞函数,预测结果为含漏洞函数;真反例表示测试样本实际为不含漏洞函数,预测结果亦为不含漏洞函数;假反例表示测试样本实际为含漏洞函数,预测结果为不含漏洞函数。f1由以下公式计算得到。

步骤c),训练漏洞检测模型。将数据集分为训练集、测试集,将训练集的数据输入到一个卷积神经网络中进行训练,通过在测试集上的效果进行网络参数的调整,确定最终的模型。图卷积神经网络的结构如图1中所示,由一个输入层、数个卷积层和最大池化层、数个全连接层和一个输出层组成。网络参数的由具体的数据集确定,具体需要调试的参数包括卷积层和最大池化层的层数、全连接层的层数、各层的单元数、卷积核的大小、学习率、训练批次的大小、激活函数的选择、epoch值等。训练过程采用n次k折交叉验证方法,使用f1值评估模型。

以上详细描述了本发明的较佳具体实施例。应当理解,本领域的普通技术人员无需创造性劳动就可以根据本发明的构思做出诸多修改和变化。因此,凡本技术领域中技术人员依本发明的构思在现有技术的基础上通过逻辑分析、推理或者有限的实验可以得到的技术方案,皆应在由权利要求书所确定的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1