掌桥专利:专业的专利平台
掌桥专利
首页

程序代码漏洞检测模型训练方法及检测方法

文献发布时间:2024-04-18 20:00:50


程序代码漏洞检测模型训练方法及检测方法

技术领域

本申请涉及代码检测领域,尤其涉及一种程序代码漏洞检测模型训练方法及检测方法。

背景技术

现今,计算机技术正在革命性地改变人类社会的运作方式和发展方向。编程语言是计算机技术中的重要组成部分,是上层计算机软件应用的基础。人们使用编程语言完成软件逻辑构建、程序运行控制等。编程语言在计算机技术中的重要地位和广泛使用使其安全问题成为研究人员关注的重点领域。不规范或错误地使用编程语言将导致软件应用出现缺陷,进而降低软件的安全性。

现有的程序代码漏洞检测方法的存在检测准确性差、泛化性差以及细粒度漏洞检测效果差等技术问题。

发明内容

鉴于此,本申请实施例提供了一种程序代码漏洞检测模型训练方法及检测方法,以消除或改善现有技术中存在的一个或更多个缺陷。

本申请的第一个方面提供了一种程序代码漏洞检测模型训练方法,该方法包括:

将各个训练程序代码分别转换为程序依赖图和抽象语法树;所述训练程序代码包括:C语言程序代码和C++语言程序代码;

基于预设的关键节点类型、各个所述训练程序各自对应的所述程序依赖图和抽象语法树生成各个所述训练程序代码各自对应的多个漏洞检测图;

基于各个所述训练程序代码中的多个程序代码语句的漏洞标记,对各个所述训练程序代码各自对应的各个所述漏洞检测图进行细粒度分类,得到一个包含多种样本类型的漏洞检测图训练集;

基于所述漏洞检测图训练集训练预先构建的异构图神经网络以得到用于进行细粒度漏洞检测图检测并输出细粒度漏洞检测结果的程序代码漏洞检测模型。

在本申请的一些实施例中,所述基于预设的关键节点类型、各个所述训练程序各自对应的所述程序依赖图和抽象语法树生成各个所述训练程序代码各自对应的多个漏洞检测图,包括:

基于各个所述训练程序各自对应的所述程序依赖图和抽象语法树创建各个所述训练程序各自对应的的代码图;

对各个所述代码图中的属于所述关键节点类型的各个关键程序代码节点分别进行遍历,得到各个所述训练程序代码各自对应的各个所述漏洞检测图。

在本申请的一些实施例中,所述基于各个所述训练程序各自对应的所述程序依赖图和抽象语法树创建各个所述训练程序各自对应的的代码图,包括:

将各个所述训练程序代码中的各个语句作为对应的程序代码节点;

基于各个所述训练程序各自对应的抽象语法树对各个所述训练程序各自对应的各个所述程序代码节点进行类型标注;

基于各个所述训练程序各自对应的程序依赖图和各个所述程序代码节点的类型,对各个所述训练程序各自对应的各个所述程序代码节点中存在联系的节点进行连接,得到各个所述训练程序各自对应的代码图。

在本申请的一些实施例中,所述对各个所述代码图中的属于所述关键节点类型的各个关键程序代码节点分别进行遍历,得到各个所述训练程序代码各自对应的各个所述漏洞检测图,包括:

对各个所述代码图中的各个所述关键程序代码节点分别进行向前遍历及向后遍历,直至遍历完与各个所述关键程序代码节点存在依赖关系的多个程序代码节点;

在各个所述代码图中删除除了与各个所述关键程序代码节点存在依赖关系的多个程序代码节点外的各个程序代码节点,得到各个所述训练程序代码各自对应的各个所述漏洞检测图。

在本申请的一些实施例中,所述关键节点类型包括:函数调用节点、数组操作节点、指针操作节点和运算符操作节点。

在本申请的一些实施例中,所述细粒度漏洞检测结果包括:

函数调用漏洞、数组操作漏洞、指针操作漏洞、运算符操作漏洞或无漏洞。

本申请的第二个方面提供了一种程序代码漏洞检测方法,该方法包括:

将目标程序转换为程序依赖图和抽象语法树;

基于预设的关键节点类型、所述程序依赖图和抽象语法树生成所述目标程序对应的多个漏洞检测图;

将所述目标程序对应的多个漏洞检测图输入权利要求1-6任一项所述的程序漏洞检测模型训练方法训练得到的程序漏洞检测模型,以使该程序漏洞检测模型输出得到所述目标程序对应的漏洞检测结果。

本申请的第三个方面提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序代码,所述处理器执行所述计算机程序代码时实现前述的第一方面所述的程序代码漏洞检测模型训练方法。

本申请的第四个方面提供了一种计算机可读存储介质,其上存储有计算机程序代码,该计算机程序代码被处理器执行时实现前述的第一方面所述的程序代码漏洞检测模型训练方法。

本申请的第五个方面提供了一种计算机程序代码产品,包括计算机程序代码,该计算机程序代码被处理器执行时实现前述的第一方面所述的程序代码漏洞检测模型训练方法。

综上所述,本申请提供一种程序代码漏洞检测模型训练方法及检测方法,所述程序代码漏洞检测模型训练方法包括将各个训练程序代码分别转换为程序依赖图和抽象语法树;基于预设的关键节点类型、各个训练程序各自对应的程序依赖图和抽象语法树生成多个漏洞检测图;基于各个训练程序代码中的多个程序代码语句的漏洞标记,对各个漏洞检测图进行细粒度分类,得到一个包含多种样本类型的漏洞检测图训练集;基于漏洞检测图训练集训练预先构建的异构图神经网络以得到用于进行细粒度漏洞检测图检测并输出细粒度漏洞检测结果的程序代码漏洞检测模型。本申请能够有效提高程序代码漏洞检测的准确性、有效提升细粒度漏洞检测的多样性,以及有效提升程序代码漏洞检测的泛化性。

本申请的附加优点、目的,以及特征将在下面的描述中将部分地加以阐述,且将对于本领域普通技术人员在研究下文后部分地变得明显,或者可以根据本申请的实践而获知。本申请的目的和其它优点可以通过在说明书以及附图中具体指出的结构实现到并获得。

本领域技术人员将会理解的是,能够用本申请实现的目的和优点不限于以上具体所述,并且根据以下详细说明将更清楚地理解本申请能够实现的上述和其他目的。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,并不构成对本申请的限定。附图中的部件不是成比例绘制的,而只是为了示出本申请的原理。为了便于示出和描述本申请的一些部分,附图中对应部分可能被放大,即,相对于依据本申请实际制造的示例性装置中的其它部件可能变得更大。在附图中:

图1为本申请一实施例中的程序代码漏洞检测模型训练方法的流程示意图。

图2为本申请另一实施例中的代码图中的关键程序代码节点子图示意图。

图3为本申请另一实施例中的对关键程序代码节点子图进行遍历的示意图。

图4为本申请另一实施例中的漏洞检测图的示意图。

图5为本申请另一实施例中的异构图神经网络模型的结构示意图。

图6为本申请另一实施例中的程序代码漏洞检测方法的流程示意图。

具体实施方式

为使本申请的目的、技术方案和优点更加清楚明白,下面结合实施方式和附图,对本申请做进一步详细说明。在此,本申请的示意性实施方式及其说明用于解释本申请,但并不作为对本申请的限定。

在此,还需要说明的是,为了避免因不必要的细节而模糊了本申请,在附图中仅仅示出了与根据本申请的方案密切相关的结构和/或处理步骤,而省略了与本申请关系不大的其他细节。

应该强调,术语“包括/包含”在本文使用时指特征、要素、步骤或组件的存在,但并不排除一个或更多个其它特征、要素、步骤或组件的存在或附加。

在此,还需要说明的是,如果没有特殊说明,术语“连接”在本文不仅可以指直接连接,也可以表示存在中间物的间接连接。

在下文中,将参考附图描述本申请的实施例。在附图中,相同的附图标记代表相同或类似的部件,或者相同或类似的步骤。

具体通过下述实施例进行详细说明。

本申请实施例提供一种可以由客户端设备执行的程序代码漏洞检测模型训练方法,参见图1,所述的程序代码漏洞检测模型训练方法具体包含有如下内容:

步骤110:将各个训练程序代码分别转换为程序依赖图和抽象语法树;所述训练程序代码包括:C语言程序代码和C++语言程序代码。

步骤120:基于预设的关键节点类型、各个所述训练程序各自对应的所述程序依赖图和抽象语法树生成各个所述训练程序代码各自对应的多个漏洞检测图。

步骤130:基于各个所述训练程序代码中的多个程序代码语句的漏洞标记,对各个所述训练程序代码各自对应的各个所述漏洞检测图进行细粒度分类,得到一个包含多种样本类型的漏洞检测图训练集。

步骤140:基于所述漏洞检测图训练集训练预先构建的异构图神经网络以得到用于进行细粒度漏洞检测图检测并输出细粒度漏洞检测结果的程序代码漏洞检测模型。

具体来说,客户端设备将各个训练程序代码分别转换为程序依赖图和抽象语法树;所述训练程序代码包括:C语言程序代码和C++语言程序代码。

然后基于预设的关键节点类型、各个所述训练程序各自对应的所述程序依赖图和抽象语法树生成各个所述训练程序代码各自对应的多个漏洞检测图。

接着基于各个所述训练程序代码中的多个程序代码语句的漏洞标记,对各个所述训练程序代码各自对应的各个所述漏洞检测图进行细粒度分类,得到一个包含多种样本类型的漏洞检测图训练集。

最后基于所述漏洞检测图训练集训练预先构建的异构图神经网络以得到用于进行细粒度漏洞检测图检测并输出细粒度漏洞检测结果的程序代码漏洞检测模型,从而能够有效提高程序代码漏洞检测的准确性,以及有效提升程序代码漏洞检测的泛化性。

为了有效生成漏洞检测图,步骤120包括:

步骤121:基于各个所述训练程序各自对应的所述程序依赖图和抽象语法树创建各个所述训练程序各自对应的的代码图;

对步骤121而言,包括:

将各个所述训练程序代码中的各个语句作为对应的程序代码节点;

基于各个所述训练程序各自对应的抽象语法树对各个所述训练程序各自对应的各个所述程序代码节点进行类型标注;

基于各个所述训练程序各自对应的程序依赖图和各个所述程序代码节点的类型,对各个所述训练程序各自对应的各个所述程序代码节点中存在联系的节点进行连接,得到各个所述训练程序各自对应的代码图。

步骤122:对各个所述代码图中的属于所述关键节点类型的各个关键程序代码节点分别进行遍历,得到各个所述训练程序代码各自对应的各个所述漏洞检测图。

对步骤122而言,包括:

对各个所述代码图中的各个所述关键程序代码节点分别进行向前遍历及向后遍历,直至遍历完与各个所述关键程序代码节点存在依赖关系的多个程序代码节点;

在各个所述代码图中删除除了与各个所述关键程序代码节点存在依赖关系的多个程序代码节点外的各个程序代码节点,得到各个所述训练程序代码各自对应的各个所述漏洞检测图。

具体来说,客户端设备首先基于开源软件Joern对C和C++代码进行程序分析。Joern将逐一解析输入的源代码文件,然后为每一个源代码文件生成对应的程序依赖图(Program Dependence Graph,PDG)和抽象语法树(Abstract Syntax Tree,AST)。PDG中包含程序的控制依赖关系和数据依赖关系,将为漏洞检测图提供边类型信息。AST中包含程序语句的类型信息,将为漏洞检测图提供节点类型信息。系统为漏洞检测图定义了4种节点类型,分别是条件判断类型、表达式类型、定义类型和普通类型,每种节点类型的描述如表1所示;另外,为漏洞检测图定义了2种边类型,分别是控制依赖边(Control Dependency Edge,CDE)和数据依赖边(Data Dependency Edge,DDE)。漏洞检测图中的节点特征为节点所对应的代码语句,并经过自然语言处理模型将程序语言转换为数学向量表达;漏洞检测图中的边没有特征。对于一个代码文件,系统将每一个代码语句映射到一张图的一个节点,然后根据该代码语句的类型对图中的节点进行节点类型标注。之后,系统根据代码语句间存在的联系,确定该联系为具体的CDE类型或DDE类型,基于确定的类型为图添加边连接,从而得到对应的代码图。

表1漏洞检测图的节点类型

在得到代码图之后,客户端设备根据代码图中的属于关键节点类型的关键程序代码节点对代码图进行切片。具体切片方法为:如图2所示,对于一张代码图中的一个关键程序代码节点(即图2中的程序关键节点),系统将基于该关键程序代码节点执行向前和向后遍历,直至遍历到最先和最后一个与该关键程序代码节点有依赖关系的节点;如图3所示,系统将保留代码图中所有被遍历到的节点和边,删除没有被遍历到的节点和边;经过删除后的代码图称为漏洞检测图(即图4)。其中,关键节点类型包括:函数调用节点、数组操作节点、指针操作节点和运算符操作节点。

其中,与关键程序代码节点有依赖关系的节点包括:与关键程序代码节点直接连接的各个直接节点,如图2中的节点1、3、4、13和14。与关键程序代码节点间接连接的间接节点定义为:间接节点与直接节点之间的边的方向,与直接节点和关键程序代码节点之间的边的方向一致,如图2中的节点17,且该间接节点可依次连接其他间接节点,满足其他间接节点和该间接节点之间的边的方向,与前述方向一致即可。

另外,图2、3和4中的data, dataLen和result表示DDE(即数据依赖边)关系中具体的变量名称。例如:节点1节点4,存在DDE,由节点1指向节点4。源代码中,

节点1对应的代码语句为:“void main(char * data)”,存在data变量;节点4对应的代码语句为:“int dataLen;”,并且在后续语句中,dataLen变量被赋值了data变量的长度。因此节点4数据依赖于节点1,具体的数据依赖变量为变量data。

在训练集中,每一个训练程序代码都标记有漏洞行号(漏洞标记)。对于一个漏洞检测图,若图中包含漏洞节点(在代码文件中标记的漏洞行号对应的节点),系统就标记这个漏洞检测图为漏洞训练样本;否则,系统标记这个漏洞检测图为良性训练样本。对于每个漏洞训练样本,系统根据样本中关键程序代码节点的类别对样本进行细粒度标记。例如,若一个漏洞训练样本的关键程序代码节点的类型为函数调用类型,系统就标记这个漏洞样本为函数调用类型漏洞样本。因此,细粒度标记可生成5种训练样本,分别是良性样本、函数调用漏洞样本、数组操作漏洞样本、指针操作漏洞样本和运算符操作漏洞样本。系统根据上述5种类别进行细粒度漏洞识别。

客户端设备使用异构图卷积算子搭建异构图神经网络模型。异构图卷积算子可为漏洞检测图中不同的元路径设置不同的图卷积消息传递模式,实现在不同的元路径中进行独立学习。客户端设备搭建的异构图神经网络模型包括异2层异构图卷积层、1层激活层、1层读出层和1层Softmax层,具体结构如图5所示。异构图卷积层对漏洞检测图进行学习,并更新模型的参数,该模型参数包括用于对节点特征进行线性变换的矩阵和用于计算节点重要性分数的向量;激活层为网络增加非线性,防止模型出现梯度消失或梯度爆炸;读出层将属于同一个漏洞检测图的节点的特征向量聚合,为每一个漏洞检测图生成一个特征矩阵;Softmax层对每个漏洞检测图的特征矩阵进行检测,然后输出漏洞检测结果。

其中,漏洞检测结果包括:函数调用漏洞、数组操作漏洞、指针操作漏洞、运算符操作漏洞或无漏洞。

需要说明的是,模型在SARD数据集上进行训练。SARD数据集包括367128个代码文件,共有180种CWE(常见缺陷列表)类型,是多漏洞类型数据集。模型在SARD数据集上的二分类漏洞检测F1值达到95.4%,细粒度漏洞检测F1值达到88.8%。对比现有软件漏洞检测方案,本系统的漏洞识别性能提示明显,检测耗时相对较少。经测试,训练好的模型在多个开源软件代码上进行漏洞检测,漏洞检测的平均真阳性率达到79.8%。

其中,所述F1指数表示精确率和召回率的调和平均数,计算公式为:F1指数=2×(精确率×召回率) / (精确率+召回率)。

本申请实施例还提供一种可以由客户端设备执行的程序代码漏洞检测方法,参见图6,所述的程序代码漏洞检测方法具体包含有如下内容:

步骤210:将目标程序转换为程序依赖图和抽象语法树。

步骤220:基于预设的关键节点类型、所述程序依赖图和抽象语法树生成所述目标程序对应的多个漏洞检测图。

步骤230:将所述目标程序对应的多个漏洞检测图输入权利要求1-6任一项所述的程序漏洞检测模型训练方法训练得到的程序漏洞检测模型,以使该程序漏洞检测模型输出得到所述目标程序对应的漏洞检测结果。

具体来说,客户端设备首先将目标程序转换为程序依赖图和抽象语法树。然后基于预设的关键节点类型、程序依赖图和抽象语法树生成目标程序对应的多个漏洞检测图。

最后将目标程序对应的多个漏洞检测图输入前述实施例所述的程序漏洞检测模型训练方法训练得到的程序漏洞检测模型,以使该程序漏洞检测模型输出得到目标程序对应的漏洞检测结果,从而能够有效提高程序代码漏洞检测的准确性,以及有效提升程序代码漏洞检测的泛化性。

综上所述,本申请提供一种程序代码漏洞检测模型训练方法及检测方法,所述程序代码漏洞检测模型训练方法包括将各个训练程序代码分别转换为程序依赖图和抽象语法树;基于预设的关键节点类型、各个训练程序各自对应的程序依赖图和抽象语法树生成多个漏洞检测图;基于各个训练程序代码中的多个程序代码语句的漏洞标记,对各个漏洞检测图进行细粒度分类,得到一个包含多种样本类型的漏洞检测图训练集;基于漏洞检测图训练集训练预先构建的异构图神经网络以得到用于进行细粒度漏洞检测图检测并输出细粒度漏洞检测结果的程序代码漏洞检测模型。本申请能够有效提高程序代码漏洞检测的准确性、有效提升细粒度漏洞检测的多样性,以及有效提升程序代码漏洞检测的泛化性。

本申请实施例还提供了一种电子设备,例如中心服务器,该电子设备可以包括处理器、存储器、接收器及发送器,处理器用于执行上述实施例提及的程序代码漏洞检测模型训练方法或程序代码漏洞检测方法,其中处理器和存储器可以通过总线或者其他方式连接,以通过总线连接为例。该接收器可通过有线或无线方式与处理器、存储器连接。

处理器可以为中央处理器(Central Processing Unit,CPU)。处理器还可以为其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等芯片,或者上述各类芯片的组合。

存储器作为一种非暂态计算机可读存储介质,可用于存储非暂态软件程序代码、非暂态计算机可执行程序代码以及模块,如本申请实施例中的程序代码漏洞检测模型训练方法或程序代码漏洞检测方法对应的程序代码指令/模块。处理器通过运行存储在存储器中的非暂态软件程序代码、指令以及模块,从而执行处理器的各种功能应用以及数据处理,即实现上述方法实施例中的程序代码漏洞检测模型训练方法或程序代码漏洞检测方法。

存储器可以包括存储程序代码区和存储数据区,其中,存储程序代码区可存储操作系统、至少一个功能所需要的应用程序代码;存储数据区可存储处理器所创建的数据等。此外,存储器可以包括高速随机存取存储器,还可以包括非暂态存储器,例如至少一个磁盘存储器件、闪存器件、或其他非暂态固态存储器件。在一些实施例中,存储器可选包括相对于处理器远程设置的存储器,这些远程存储器可以通过网络连接至处理器。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

所述一个或者多个模块存储在所述存储器中,当被所述处理器执行时,执行实施例中的程序代码漏洞检测模型训练方法或程序代码漏洞检测方法。

在本申请的一些实施例中,用户设备可以包括处理器、存储器和收发单元,该收发单元可包括接收器和发送器,处理器、存储器、接收器和发送器可通过总线系统连接,存储器用于存储计算机指令,处理器用于执行存储器中存储的计算机指令,以控制收发单元收发信号。

作为一种实现方式,本申请中接收器和发送器的功能可以考虑通过收发电路或者收发的专用芯片来实现,处理器可以考虑通过专用处理芯片、处理电路或通用芯片实现。

作为另一种实现方式,可以考虑使用通用计算机的方式来实现本申请实施例提供的服务器。即将实现处理器,接收器和发送器功能的程序代码代码存储在存储器中,通用处理器通过执行存储器中的代码来实现处理器,接收器和发送器的功能。

本申请实施例还提供一种计算机可读存储介质,其上存储有计算机程序代码,该计算机程序代码被处理器执行时以实现前述的程序代码漏洞检测模型训练方法或程序代码漏洞检测方法的步骤。该计算机可读存储介质可以是有形存储介质,诸如随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、软盘、硬盘、可移动存储盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质。

本领域普通技术人员应该可以明白,结合本文中所公开的实施方式描述的各示例性的组成部分、系统和方法,能够以硬件、软件或者二者的结合来实现。具体究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。当以硬件方式实现时,其可以例如是电子电路、专用集成电路(ASIC)、适当的固件、插件、功能卡等等。当以软件方式实现时,本申请的元素是被用于执行所需任务的程序代码或者代码段。程序代码或者代码段可以存储在机器可读介质中,或者通过载波中携带的数据信号在传输介质或者通信链路上传送。

需要明确的是,本申请并不局限于上文所描述并在图中示出的特定配置和处理。为了简明起见,这里省略了对已知方法的详细描述。在上述实施例中,描述和示出了若干具体的步骤作为示例。但是,本申请的方法过程并不限于所描述和示出的具体步骤,本领域的技术人员可以在领会本申请的精神后,作出各种改变、修改和添加,或者改变步骤之间的顺序。

本申请中,针对一个实施方式描述和/或例示的特征,可以在一个或更多个其它实施方式中以相同方式或以类似方式使用,和/或与其他实施方式的特征相结合或代替其他实施方式的特征。

以上所述仅为本申请的优选实施例,并不用于限制本申请,对于本领域的技术人员来说,本申请实施例可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

相关技术
  • 一种皱皮木瓜低温浓缩系统和方法
  • 一种皱皮木瓜加工装置与方法
  • 一种皱皮木瓜果脯的加工方法
技术分类

06120116545298