一种基于数据依赖增强程序切片的源代码漏洞检测方法

未命名 09-12 阅读:137 评论:0


1.本发明涉及源代码漏洞检测技术等领域,具体的说,是一种基于数据依赖增强程序切片的源代码漏洞检测方法。


背景技术:

2.随着人们日益依赖互联网,软件程序作为人们与互联网连接的桥梁,被越来越多的人所需要。由于人们的需求变得越来越复杂,软件程序的代码结构随之自然而然地变得复杂,变得更加容易引入漏洞,软件程序的安全性也就变得不可忽视。相关调查显示,对于一些百万级的软件程序,平均每1000行代码中就会包含一个漏洞。软件漏洞带来严重损失的事件也层出不穷。自从软件程序出现,人们就不断尝试通过各种方法来检测程序的漏洞,例如:规则匹配式扫描,污点分析,符号执行,模糊测试,代码相似性度量,等等。对源代码进行漏洞检测可以在程序开发阶段避免漏洞。漏洞发现得越早,漏洞带来的影响和修复漏洞的成本就越小。
3.近几年随着人工智能的普及和成功应用,有一些学者尝试使用人工智能算法来检测漏洞,研究成果表现出优秀的检测性能。目前,基于人工智能算法的漏洞检测算法处理步骤通常分为三步:首先通过静态分析技术对源代码进行预处理,提取和构造出包含源码语法和语义信息的表征形式,然后将字符形式的数据转化为向量,并使用神经网络进行特征提取,最后使用提取到的特征向量训练分类器进行分类。预处理阶段目前常用的是数据流和控制流分析技术、抽象语法树(abstract syntax tree,ast)构造,程序切片技术等。在特征提取步骤中通常使用图神经网络和循环神经网络。循环神经网络主要对预处理后的字符序列(例如抽象语法树遍历序列,程序片段的字符序列)进行特征提取,图神经网络主要对预处理后的图结构数据(例如抽象语法树,控制流图,数据依赖图,程序依赖图,代码属性图等等)进行特征提取。在分类步骤中,通常依靠提取到的特征向量进行分类,通过大量的数据来训练分类器,提高分类器正确分类新数据的能力。
4.然而,由于真实项目中的漏洞模式变得越来越复杂,目前的先进方法在预处理部分通常使用较为基础的静态分析技术,缺少对复杂漏洞的语法和语义信息提取。最早使用深度学习算法进行漏洞检测的li等人(li z, zou d, xu s, et al. sysevr: a framework for using deep learning to detect software vulnerabilities[j]. ieee transactions on dependable and secure computing, 2021, 19(4): 2244-2258.)提出在程序依赖图上获取程序切片,并将其转化为字符串,使用bilstm(bi-directionallong short-term memory)网络来提取特征,并使用多层感知器进行漏洞检测。然而常用的循环神经网络由于只接受序列信息,让代码简单地排列为序列,会使得其中部分强相关的语法语义代码片段相隔较远,导致代码之间的语义信息不能够有效地传递,而不利于模型识别。因此,部分学者尝试使用图神经网络进行漏洞检测,例如庄荣飞等人(庄荣飞. 基于图网络的漏洞挖掘关键技术研究[d].哈尔滨工业大学,2020.),将代码转化为图结构表示,并使用图网络进行特征提取,漏洞检测效果明显优于传统的机器学习方法。然而,图神经网络将代
码语句嵌入为图节点向量时,采用简单的word2vec或者doc2vec等静态技术,会让整个模型受预训练模型的影响,而无法实现良好的泛化性。


技术实现要素:

[0005]
本发明的目的在于提供一种基于数据依赖增强程序切片的源代码漏洞检测方法,通过对待检测代码进行检测,给出漏洞的位置信息帮助漏洞修复人员快速定位漏洞,并给出漏洞的类型,为快速修复漏洞提供帮助。
[0006]
本发明通过下述技术方案实现:一种基于数据依赖增强程序切片的源代码漏洞检测方法,包括下述步骤:1)生成程序依赖图并进行数据增强:通过对源代码的分析,获得其数据依赖信息和控制依赖信息,并构建程序依赖图,而后对程序依赖图进行增强操作;2)将程序切片兴趣点作为切点进行程序切片,获得程序依赖图的子图,子图的漏洞分类标签由是否包含漏洞代码语句决定;子图的漏洞分类标签由是否包含漏洞代码语句决定的具体方式为:若子图包含漏洞代码语句,则该子图视为有漏洞的,且漏洞类型与生成该子图的程序依赖图的标签相同,若子图不包含漏洞代码语句,则该子图视为无漏洞的。
[0007]
3)将源代码中的用户定义标识符进行匿名化,然后将代码中的各语义单元利用word2vec技术转化为向量,形成词典;4)将程序切片后得到的子图中各结点的代码语句依据步骤3)生成的词典转化为向量序列;5由于各结点的原始代码长度不同,导致结点的向量序列长度也不同,为了能够在后续步骤中使用图神经网络,因此采用门控循环递归神经网络将初始的结点向量嵌入为统一长度的向量。
[0008]
6)将完成结点向量嵌入的子图送入图神经网络模型进行训练和测试,得到软件源代码的漏洞多分类检测模型。
[0009]
7)对待检测源代码进行上述步骤1)至步骤4)的处理后,利用步骤6)训练好的软件源代码的漏洞多分类检测模型对处理后的待检测源代码进行推理预测,完成漏洞类型的检测。
[0010]
进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:由于传统的程序依赖图存在对函数调用语句的特殊处理,导致在函数调用语句中发生的数据污染行为不能被记录,因此本方法对程序依赖图进行数据依赖增强操作,通过对函数调用语句的特殊处理,修正传统程序依赖图中的数据依赖不准确的问题,并增强各代码语句与函数调用语句之间的数据依赖关系,而对所述程序依赖图进行增强操作的具体步骤包括:1.1)完成程序依赖图的构建后,先扫描所有结点,找出以引用类型或者指针类型作为参数的函数调用结点;1.2)对找到的函数调用结点进一步处理,找到其参数的数据依赖结点,并以该结点为起始结点在程序依赖图上进行后向切片;1.3)对于步骤1.2)所获得后向切片结果中的结点,选择结点索引(即对应的代码行行号)大于函数调用结点索引的结点,将该结点与函数调用结点之间建立数据依赖关系
并加入到原程序依赖图中。
[0011]
进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:所述程序切片的具体步骤如下:2.1)从切点出发进行常规的前向切片和后向切片,将切片结果纳入最终切片结果中;2.2)识别出最终切片结果中的条件语句结点,并将其作为切点进行前向切片,寻找其数据依赖结点;2.3)将步骤2.2)中的前向切片结果中的结点作为起始点再次进行后向切片,并将切片结果中结点索引大于条件结点索引的结点纳入最终切片结果。
[0012]
进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:所述程序切片兴趣点指包含容易造成程序漏洞的代码结构的代码语句,程序切片兴趣点具体指使用了算术表达式、指针、数组、敏感的库函数调用中一种或多种代码结构的代码语句。
[0013]
进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:所述采用门控循环递归神经网络将初始的结点向量嵌入为统一长度的向量包括下述具体步骤:5.1)人工操作将各结点的向量序列进行填充或者截断,保证各结点的向量序列的长度一致,其中,设置向量序列长度为20个序列元素;5.2)将结点的定长向量序列送入门控循环递归神经网络进行特征提取,在门控循环递归神经网络中,各神经单元会处理一个序列元素,并将其信息传递到下一神经元,最后一个神经元接收到前面所有神经元的信息,取最后一个神经元的隐藏状态作为该结点的嵌入向量,最终各结点的向量表示为一个256维的向量;5.3)门控循环递归神经网络中的参数随着整个网络模型的反向传播进行更新。
[0014]
进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:所述图神经网络模型的整体架构包含4层图卷积和图池化的卷积池化块和一个多层感知器。整个图神经网络的损失函数是带有惩罚因子的交叉熵损失函数,其中,惩罚因子用于缓解多分类中样本不平衡带来的影响。
[0015]
进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:在将完成结点嵌入的子图送入图神经网络模型的训练测试过程中,数据集按照8:1:1的比例划分为训练集,验证集,测试集;图神经网络中,各层网络的参数更新算法采用adam梯度下降算法,图神经网络的超参数使用十倍交叉验证方法选取最优的超参数设置,学习率设置为0.001,batch_size为64,卷积层的隐藏层个数为256。
[0016]
进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:所述将源代码中的用户定义标识符进行匿名化具体为:将用户自定义的变量,统一规范化为“var_i”,其中i为对应变量名在代码中出现的顺序,且i∈(1,2,
···
,n);将用户自定义的函数,统一规范化为“func_i”,其中i为对应函数名在代码中出现的顺序,且i∈(1,2,
···
,m);将用户自定义的变量,统一规范化为“type_i”,其中i为对应结构体名在代码中出现的顺序,且i∈(1,2,
···
,p)。
[0017]
本发明与现有技术相比,具有以下优点及有益效果:本发明改进程序依赖图,增强原始程序依赖图中的数据依赖关系,使得程序依赖图能够对带实参函数调用行为进行建模,以识别数据污染行为,增加程序依赖图表达的信息。传统的程序依赖图存在对函数调用语句的特殊处理,导致在函数调用语句中发生的数据污染行为不能被记录,因此本发明对程序依赖图进行数据依赖增强操作,通过对函数调用语句的特殊处理,修正传统程序依赖图中的数据依赖不准确的问题,并增强各代码语句与函数调用语句之间的数据依赖关系。
[0018]
本发明提出新的切片方法,通过对条件语句进行额外的程序切片操作,使得最终的程序切片子图包含更多的信息,模型能够识别复杂的条件判断结构。在真实场景中,许多漏洞是由于动态因素引起的复杂循环结构引起的,该类型漏洞的直接原因就是由于循环结束条件设置不当,因此条件语句在漏洞检测具有重要意义,增加其相关的额外切片能够为条件语句补充更多的相关信息。
[0019]
本发明使用门控循环神经网络进行结点嵌入,可以更好地提取代码语句的信息,且神经网络动态更新,保证嵌入结果向着最优嵌入结果靠近。
附图说明
[0020]
图1为本发明的实施流程图。
[0021]
图2为本发明所述图神经网络结构图。
具体实施方式
[0022]
下面结合实施例对本发明作进一步地详细说明,但本发明的实施方式不限于此。
[0023]
为使本发明实施方式的目的、技术方案和优点更加清楚,下面将结合本发明实施方式中的附图,对本发明实施方式中的技术方案进行清楚、完整地描述,显然,所描述的实施方式是本发明一部分实施方式,而不是全部的实施方式。基于本发明中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。因此,以下对在附图中提供的本发明的实施方式的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施方式。基于本发明中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。
[0024]
名词解释:word2vec:面向自然语言和编程语言的预训练模型;gcn:图卷积神经网络;joern:一种特定开源工具名称;pdg:程序依赖图;joern-parse:开源工具joern的子功能;program slicing points of interest:程序切片兴趣点。
[0025]
实施例1:一种基于数据依赖增强程序切片的源代码漏洞检测方法,通过对待检测代码进行检测,给出漏洞的位置信息帮助漏洞修复人员快速定位漏洞,并给出漏洞的类型,为快速修
复漏洞提供帮助,包括下述步骤:1)生成程序依赖图并进行数据增强:通过对源代码的分析,获得其数据依赖信息和控制依赖信息,并构建程序依赖图,而后对程序依赖图进行增强操作;2)将程序切片兴趣点作为切点进行程序切片,获得程序依赖图的子图,子图的漏洞分类标签由是否包含漏洞代码语句决定;子图的漏洞分类标签由是否包含漏洞代码语句决定的具体方式为:若子图包含漏洞代码语句,则该子图视为有漏洞的,且漏洞类型与生成该子图的程序依赖图的标签相同,若子图不包含漏洞代码语句,则视为无漏洞的。
[0026]
3)将源代码中的用户定义标识符进行匿名化,然后将代码中的各语义单元利用word2vec技术转化为向量,形成词典;4)将程序切片后得到的子图中各结点的代码语句依据步骤3)生成的词典转化为向量序列;5)由于各结点的原始代码长度不同,导致结点的向量序列长度也不同,为了能够在后续步骤中使用图神经网络,因此采用门控循环递归神经网络将初始的结点向量嵌入为统一长度的向量。
[0027]
6)将完成结点嵌入的子图送入图神经网络模型进行训练和测试,得到软件源代码的漏洞多分类检测模型。
[0028]
7)对待检测源代码进行上述步骤1)至步骤4)的处理后,利用训练好的软件源代码的漏洞多分类检测模型对处理后的待检测源代码进行推理预测,完成漏洞类型的检测。
[0029]
实施例2:本实施例是在上述实施例的基础上进一步优化,与前述技术方案相同之处在此不再赘述,进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:由于传统的程序依赖图存在对函数调用语句的特殊处理,导致在函数调用语句中发生的数据污染行为不能被记录,因此本方法对程序依赖图进行数据依赖增强操作,通过对函数调用语句的特殊处理,修正传统程序依赖图中的数据依赖不准确的问题,并增强各代码语句与函数调用语句之间的数据依赖关系,而对所述程序依赖图进行增强操作的具体步骤包括:1.1)完成程序依赖图的构建后,先扫描所有结点,找出以引用类型或者指针类型作为参数的函数调用结点;1.2)对找到的函数调用结点进一步处理,找到其参数的数据依赖结点,并以该结点为起始结点在程序依赖图上进行后向切片;1.3)对于步骤1.2)所获得后向切片结果中的结点,选择结点索引(即对应的代码行行号)大于函数调用结点索引的结点,将该结点与函数调用结点之间建立数据依赖关系并加入到原程序依赖图中。
[0030]
实施例3:本实施例是在上述任一实施例的基础上进一步优化,与前述技术方案相同之处在此不再赘述,进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:所述程序切片的具体步骤如下:2.1)从切点出发进行常规的前向切片和后向切片,将切片结果纳入最终切片结果中;
2.2)识别出最终切片结果中的条件语句结点,并将其作为切点进行前向切片,寻找其数据依赖结点;2.3)将步骤2.2)中的前向切片结果中的结点作为起始点再次进行后向切片,并将切片结果中结点索引大于条件结点索引的结点纳入最终切片结果。
[0031]
实施例4:本实施例是在上述任一实施例的基础上进一步优化,与前述技术方案相同之处在此不再赘述,进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:所述程序切片兴趣点指包含容易造成程序漏洞的代码结构的代码语句,程序切片兴趣点具体指使用了算术表达式、指针、数组、敏感的库函数调用中一种或多种代码结构的代码语句。
[0032]
实施例5:本实施例是在上述任一实施例的基础上进一步优化,与前述技术方案相同之处在此不再赘述,进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:所述采用门控循环递归神经网络将初始的结点向量嵌入为统一长度的向量包括下述具体步骤:5.1)人工操作将各结点的向量序列进行填充或者截断,保证各结点的向量序列的长度一致,其中,设置向量序列长度为20个序列元素;5.2)将结点的定长向量序列送入门控循环递归神经网络进行特征提取,在门控循环递归神经网络中,各神经单元会处理一个序列元素,并将其信息传递到下一神经元,最后一个神经元接收到前面所有神经元的信息,取最后一个神经元的隐藏状态作为该结点的嵌入向量,最终各结点的向量表示为一个256维的向量;5.3)门控循环递归神经网络中的参数随着整个网络模型的反向传播进行更新。
[0033]
实施例6:本实施例是在上述任一实施例的基础上进一步优化,与前述技术方案相同之处在此不再赘述,进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:所述图神经网络模型的整体架构包含4层图卷积和图池化的卷积池化块和一个多层感知器。整个图神经网络的损失函数是带有惩罚因子的交叉熵损失函数,其中,惩罚因子用于缓解多分类中样本不平衡带来的影响。
[0034]
实施例7:本实施例是在上述任一实施例的基础上进一步优化,与前述技术方案相同之处在此不再赘述,进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,特别采用下述设置方式:在将完成结点嵌入的子图送入图神经网络模型的训练测试过程中,数据集按照8:1:1的比例划分为训练集,验证集,测试集;图神经网络中,各层网络的参数更新算法采用adam梯度下降算法,图神经网络的超参数使用十倍交叉验证方法选取最优的超参数设置,学习率设置为0.001,batch_size为64,卷积层的隐藏层个数为256。
[0035]
实施例8:本实施例是在上述任一实施例的基础上进一步优化,与前述技术方案相同之处在此不再赘述,进一步为更好地实现本发明所述的一种基于数据依赖增强程序切片的源代码
漏洞检测方法,特别采用下述设置方式:所述将源代码中的用户定义标识符进行匿名化具体为:将用户自定义的变量,统一规范化为“var_i”,其中i为对应变量名在代码中出现的顺序,且i∈(1,2,
···
,n);将用户自定义的函数,统一规范化为“func_i”,其中i为对应函数名在代码中出现的顺序,且i∈(1,2,
···
,m);将用户自定义的变量,统一规范化为“type_i”,其中i为对应结构体名在代码中出现的顺序,且i∈(1,2,
···
,p)。
[0036]
实施例9:一种基于数据依赖增强程序切片的源代码漏洞检测方法,通过检测未知代码漏洞,获得相关信息,帮助漏洞修复人员快速定位漏洞,并给出漏洞的类型,进一步帮助漏洞修复人员快速修复漏洞,结合图1~图2所示,包括下述步骤:训练阶段:1)生成程序依赖图并进行数据增强:通过对源代码文件的分析,获得其数据依赖信息和控制依赖信息(提取数据流和控制流信息)并构建程序依赖图,之后对程序依赖图进行数据依赖增强(数据依赖增强程序依赖图),数据增强操作具体步骤如下:1.1)完成程序依赖图的构建之后,先扫描所有的结点,找出以引用类型或者指针类型作为参数的函数调用结点;1.2)对上一步骤找到的函数调用结点进一步处理,找到其参数的数据依赖结点,并以该结点为起始结点在程序依赖图上进行后向切片;1.3)对于上一步骤获得后向切片结果中的结点,选择结点索引(即对应的代码行行号)大于函数调用结点索引的结点,将该结点与函数调用结点之间建立数据依赖关系;2)通过切片技术将程序切片兴趣点作为切点进行程序切片,获得程序依赖图的子图,子图的漏洞分类标签由是否包含漏洞代码决定;所述程序切片兴趣点指包含容易造成程序漏洞的代码结构的代码语句,程序切片兴趣点具体指使用了算术表达式、指针、数组、敏感的库函数调用中一种或多种代码结构的代码语句。子图的漏洞分类标签由该子图是否包含漏洞代码语句进行判断,具体为:若子图包含漏洞代码语句,则该子图视为有漏洞的,且漏洞类型与生成该子图的程序依赖图的标签相同,若子图不包含漏洞代码语句,则该子图视为无漏洞的。程序切片的具体操作如下:2.1)从切点出发进行常规的前向切片和后向切片,将切片结果纳入最终切片结果中;2.2)识别出最终切片结果中的条件语句结点,并将其作为切点进行前向切片,寻找其数据依赖结点;2.3)将上一步骤中的前向切片结果再次进行后向切片,并将切片结果中结点索引大于条件结点索引的结点纳入最终切片结果。
[0037]
3)将源代码中的用户自定义标识符进行匿名化,然后将代码中的各语义单元利用word2vec技术转化为向量,形成词典;具体步骤如下:3.1)将用户自定义的变量,统一规范化为“var_i”,其中i为对应变量名在代码中出现的顺序,且i∈(1,2,
···
,n);将用户自定义的函数,统一规范化为“func_i”,其中i为对应函数名在代码中出现的顺序,且i∈(1,2,
···
,m);将用户自定义的变量,统一规范化为“type_i”,其中i为对应结构体名在代码中出现的顺序,且i∈(1,2,
···
,p)。
[0038]
3.2)将代码进行分词处理后训练一个word2vec的预训练模型,作为词典。
[0039]
4)程序切片的向量表示:将程序切片后得到的子图中各结点的代码语句依据上一步骤(步骤3))生成的词典转化为向量序列;5)由于各结点的原始代码长度不同,导致最初的结点向量序列长度也不同,为了能够在后续步骤中使用图神经网络,因此采用门控循环递归神经网络将初始的结点向量嵌入为统一长度的向量。所述采用门控循环递归神经网络将初始的结点向量嵌入为统一长度的向量包括下述具体步骤:5.1)人工操作将各结点的向量序列进行填充或者截断,保证各结点的向量序列的长度一致,其中,设置向量序列长度为20个序列元素;5.2)将结点的定长向量序列送入门控循环递归神经网络进行特征提取,在门控循环递归神经网络中,各神经单元会处理一个序列元素,并将其信息传递到下一神经元,最后一个神经元接收到前面所有神经元的信息,取最后一个神经元的隐藏状态作为该结点的嵌入向量,最终各结点的向量表示为一个256维的向量;5.3)门控循环递归神经网络中的参数随着整个网络模型的反向传播进行更新。
[0040]
6)将完成结点嵌入的子图送入图神经网络模型进行训练和测试,得到软件源代码的漏洞多分类检测模型。其中,所述图神经网络模型的整体架构包含4层图卷积和图池化的卷积池化块和一个多层感知器。整个图神经网络的损失函数是带有惩罚因子的交叉熵损失函数,其中,惩罚因子用于缓解多分类中样本不平衡带来的影响。在训练测试过程中,数据集按照8:1:1的比例划分为训练集,验证集,测试集。网络的超参数使用十倍交叉验证方法选取最优的超参数设置。
[0041]
检测阶段:7)对待检测源代码进行上述步骤1)至步骤4)的处理后,利用训练好的软件源代码的漏洞多分类检测模型对处理后的待检测源代码进行推理预测,完成漏洞类型的检测。
[0042]
以上所述,仅是本发明的较佳实施例,并非对本发明做任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化,均落入本发明的保护范围之内。

技术特征:
1.一种基于数据依赖增强程序切片的源代码漏洞检测方法,其特征在于:包括下述步骤:1)生成程序依赖图并进行数据增强:通过对源代码的分析,获得其数据依赖信息和控制依赖信息,并构建程序依赖图,而后对程序依赖图进行增强操作;2)将程序切片兴趣点作为切点进行程序切片,获得程序依赖图的子图,子图的漏洞分类标签由是否包含漏洞代码语句决定;3)将源代码中的用户定义标识符进行匿名化,然后将代码中的各语义单元利用word2vec技术转化为向量,形成词典;4)将程序切片后得到的子图中各结点的代码语句依据步骤3)生成的词典转化为向量序列;5)采用门控循环递归神经网络将初始的结点向量嵌入为统一长度的向量;6)将完成结点向量嵌入的子图送入图神经网络模型进行训练和测试,得到软件源代码的漏洞多分类检测模型;7)对待检测源代码进行步骤1)至步骤4)的处理后,利用步骤6)训练好的软件源代码的漏洞多分类检测模型对处理后的待检测源代码进行推理预测,完成漏洞类型的检测。2.根据权利要求1所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,其特征在于:对所述程序依赖图进行增强操作的具体步骤包括:1.1)完成程序依赖图的构建后,先扫描所有结点,找出以引用类型或者指针类型作为参数的函数调用结点;1.2)对找到的函数调用结点进一步处理,找到其参数的数据依赖结点,并以该结点为起始结点在程序依赖图上进行后向切片;1.3)对于步骤1.2)所获得后向切片结果中的结点,选择结点索引大于函数调用结点索引的结点,将该结点与函数调用结点之间建立数据依赖关系并加入到原程序依赖图中。3.根据权利要求1所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,其特征在于:所述程序切片的具体步骤如下:2.1)从切点出发进行常规的前向切片和后向切片,将切片结果纳入最终切片结果中;2.2)识别出最终切片结果中的条件语句结点,并将其作为切点进行前向切片,寻找其数据依赖结点;2.3)将步骤2.2)中的前向切片结果中的结点作为起始点再次进行后向切片,并将切片结果中结点索引大于条件结点索引的结点纳入最终切片结果。4.根据权利要求1所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,其特征在于:所述程序切片兴趣点指使用了算术表达式、指针、数组、敏感的库函数调用中一种或多种代码结构的代码语句。5.根据权利要求1所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,其特征在于:所述采用门控循环递归神经网络将初始的结点向量嵌入为统一长度的向量包括下述具体步骤:5.1)人工操作将各结点的向量序列进行填充或者截断,保证各结点的向量序列的长度一致,其中,设置向量序列长度为20个序列元素;5.2)将结点的定长向量序列送入门控循环递归神经网络进行特征提取,在门控循环递
归神经网络中,各神经单元会处理一个序列元素,并将其信息传递到下一神经元,最后一个神经元接收到前面所有神经元的信息,取最后一个神经元的隐藏状态作为该结点的嵌入向量,最终各结点的向量表示为一个256维的向量;5.3)门控循环递归神经网络中的参数随着整个网络模型的反向传播进行更新。6.根据权利要求1所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,其特征在于:所述图神经网络模型的整体架构包含4层图卷积和图池化的卷积池化块和一个多层感知器;整个图神经网络的损失函数是带有惩罚因子的交叉熵损失函数,其中,惩罚因子用于缓解多分类中样本不平衡带来的影响。7.根据权利要求1所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,其特征在于:在将完成结点嵌入的子图送入图神经网络模型的训练测试过程中,数据集按照8:1:1的比例划分为训练集,验证集,测试集;图神经网络的超参数使用十倍交叉验证方法选取最优的超参数设置。8.根据权利要求1所述的一种基于数据依赖增强程序切片的源代码漏洞检测方法,其特征在于:所述将源代码中的用户定义标识符进行匿名化具体为:将用户自定义的变量,统一规范化为“var_i”,其中i为对应变量名在代码中出现的顺序,且i∈(1,2,
···
,n);将用户自定义的函数,统一规范化为“func_i”,其中i为对应函数名在代码中出现的顺序,且i∈(1,2,
···
,m);将用户自定义的变量,统一规范化为“type_i”,其中i为对应结构体名在代码中出现的顺序,且i∈(1,2,
···
,p)。

技术总结
本发明公开了一种基于数据依赖增强程序切片的源代码漏洞检测方法,通过对源代码的分析,获得其数据依赖信息和控制依赖信息,并构建程序依赖图,而后对程序依赖图进行增强操作;将程序切片兴趣点作为切点进行程序切片,获得程序依赖图的子图,子图的漏洞分类标签由是否包含漏洞代码语句决定;将源代码中的用户定义标识符进行匿名化,然后将代码中的各语义单元利用Word2Vec技术转化为向量,形成词典;将程序切片后得到的子图中各结点的代码语句依据词典转化为向量序列;通过对待检测代码进行检测,给出漏洞的位置信息帮助漏洞修复人员快速定位漏洞,并给出漏洞的类型,为快速修复漏洞提供帮助。漏洞提供帮助。漏洞提供帮助。


技术研发人员:胡勇 陈晓
受保护的技术使用者:四川大学
技术研发日:2023.08.07
技术公布日:2023/9/9
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐