一种代码漏洞检测方法、装置、设备及介质与流程

未命名 09-29 阅读:93 评论:0


1.本技术涉及网络安全技术领域,具体涉及一种代码漏洞检测方法、装置、设备及介质。


背景技术:

2.随着互联网、云计算等技术的快速发展,各类软件项目在信息化社会中发挥着重要作用。软件项目在开发阶段需对软件项目的编程代码进行漏洞检测,以规避软件安全问题的产生。
3.常见的代码漏洞检测方式主要包括下述两种:一种是依靠人工审计漏洞,这种方式耗时较长且是否存在漏洞完全依靠审计人员的主观判断。另一种是依靠漏洞审计工具对源代码进行检测,通过检测源代码中是否存在满足检索规则的代码内容以确定是否存在代码漏洞。这种检测方式的精度与漏洞审计工具中预置的检索规则强相关,并由于缺少对可能存在漏洞代码处的上下文语义分析,存在误报率较高且通用性较差的问题。


技术实现要素:

4.本技术实施例提供一种代码漏洞检测方法、装置、设备及介质。用于提高代码审计过程中的漏洞检测精度。
5.为达到上述目的,本技术实施例的技术方案是这样实现的:
6.第一方面,本技术实施例提供了一种代码漏洞检测方法,所述方法包括:
7.响应于检测指示,从待测代码中确定与目标字段具备代码逻辑关系的代码序列;
8.根据所述目标字段的字段权重确定所述代码序列对应的权重序列;
9.将所述权重序列输入已训练的检测网络得到所述待测代码是否存在漏洞的检测结果。
10.在一些可能的实施例中,所述目标字段包括表征函数的第一字段;所述从待测代码中确定与目标字段具备代码逻辑关系的代码序列,包括:
11.生成所述待测代码的代码属性图;
12.基于所述代码属性图中表征所述第一字段的第一图节点确定与所述第一字段具备代码逻辑关系的代码序列。
13.在一些可能的实施例中,所述基于所述代码属性图中表征所述第一字段的第一图节点确定与所述第一字段具备代码逻辑关系的代码序列,包括:
14.针对任一第一图节点,根据所述代码属性图指示的函数调用关系从所述代码属性图内各图节点中选定直接和/或间接调用所述第一图节点的第二图节点;
15.基于所述第一图节点和所述第二图节点从所述待测代码中确定所述代码序列。
16.在一些可能的实施例中,所述基于所述第一图节点和所述第二图节点从所述待测代码中确定所述代码序列,包括:
17.根据所述第一图节点和所述第二图节点对从所述待测代码回溯,得到多个代码片
段;其中,任一代码片段至少包含一个第一图节点或第二节图点,任一代码片段为所述待测代码内的一行代码;
18.根据各所述代码片段确定所述代码序列。
19.在一些可能的实施例中,所述根据各所述代码片段确定所述代码序列,包括:
20.将各所述代码片段按照在所述待测代码中由前到后的出现顺序进行排序,得到所述代码序列。
21.在一些可能的实施例中,所述根据所述目标字段的字段权重确定所述代码序列对应的权重序列,包括:
22.针对任一代码序列内的每个代码片段,根据所述代码片段中包含的目标字段的字段权重确定所述代码片段的片段权重;
23.根据各所述代码片段在代码序列内的排列顺序对各所述代码片段的片段权重进行排序,得到所述代码序列的权重序列。
24.在一些可能的实施例中,所述目标字段还包括表征变量的第二字段;所述根据所述代码片段中包含的目标字段的字段权重确定所述代码片段的片段权重,包括:
25.确定所述代码片段中包含的第一字段和第二字段,并对所述包含的第一字段和第二字段的字段权重求和;
26.若字段权重的求和结果大于第一阈值,则将预设权重作为所述代码片段的片段权重;否则,将所述求和结果作为所述代码片段的片段权重。
27.在一些可能的实施例中,所述检测网络是通过下述方式训练得到的:
28.采用预设数量的训练样本对基础检测网络进行多轮迭代训练,每轮迭代过程中根据本轮得到的检测损失值和损失阈值进行比对,直至任一轮的检测损失值小于所述损失阈值时停止迭代并确定所述基础检测网络为已训练的检测网络;其中,每轮迭代过程如下:
29.根据当前网络参数对本轮输入的训练样本进行特征识别,得到表征所述训练样本是否存在指定类型漏洞的本轮检测结果;
30.基于预设损失函数,根据所述本轮检测结果和所述训练样本的样本标签进行比对得到本轮的检测损失值。
31.在一些可能的实施例中,所述训练样本是通过下述方式构建的:
32.从历史代码中确定存在代码漏洞的漏洞代码序列;并对每个漏洞代码序列的代码漏洞进行修正,得到每个漏洞代码序列对应的修正代码序列;
33.针对任一漏洞代码序列,根据所述漏洞代码序列包含目标字段的字段权重确定第一权重序列;并根据所述漏洞代码序列对应修正代码序列包含的标字段的字段权重确定第二权重序列;
34.将所述漏洞代码序列的第一权重序列作为训练样本,并将所述漏洞代码序列的第二权重序列作为所述训练样本的样本标签。
35.在一些可能的实施例中,所述代码属性图是通过下述方式确定的:
36.根据所述待测代码的语言类型确定具备所述语言类型的特性命名规则的问题字段;并利用代码分析工具确定所述待测代码的抽象语法树;
37.将所述抽象语法树内各树节点包含的问题字段剔除和/或替换为预设字段,并采用逆文档词频算法tf-idf对各所述树节点进行归一化处理;
38.根据归一化处理后的抽象语法树构建所述代码属性图。
39.在一些可能的实施例中,所述抽象语法树内任一树节点均设有多种节点属性;所述根据归一化处理后的抽象语法树构建所述代码属性图之前,所述方法还包括:
40.针对任一树节点的每种节点属性,根据所述节点属性的属性信息确定所述节点属性的属性权重;其中,所述属性信息包括所述抽象语法树的节点总数、包含所述节点属性的树节点数量、所述树节点的节点属性数量、所述树节点的赋值结果是否为空、以及所述节点属性的属性类型中的部分或全部;
41.若所述属性权重低于第二阈值则通过剔除所述树节点的所述节点属性以降低所述抽象语法树的数据量。
42.第二方面,本技术实施例提供了一种代码漏洞检测装置,所述装置包括:
43.指示单元,被配置为执行响应于检测指示,从待测代码中确定与目标字段具备代码逻辑关系的代码序列;
44.权重单元,被配置为执行根据所述目标字段的字段权重确定所述代码序列对应的权重序列;
45.检测单元,被配置为执行将所述权重序列输入已训练的检测网络得到所述待测代码是否存在漏洞的检测结果。
46.在一些可能的实施例中,所述目标字段包括表征函数的第一字段;执行所述从待测代码中确定与目标字段具备代码逻辑关系的代码序列,所述指示单元被配置为:
47.生成所述待测代码的代码属性图;
48.基于所述代码属性图中表征所述第一字段的第一图节点确定与所述第一字段具备代码逻辑关系的代码序列。
49.在一些可能的实施例中,执行所述基于所述代码属性图中表征所述第一字段的第一图节点确定与所述第一字段具备代码逻辑关系的代码序列,所述指示单元被配置为:
50.针对任一第一图节点,根据所述代码属性图指示的函数调用关系从所述代码属性图内各图节点中选定直接和/或间接调用所述第一图节点的第二图节点;
51.基于所述第一图节点和所述第二图节点从所述待测代码中确定所述代码序列。
52.在一些可能的实施例中,执行所述基于所述第一图节点和所述第二图节点从所述待测代码中确定所述代码序列,所述指示单元被配置为:
53.根据所述第一图节点和所述第二图节点对从所述待测代码回溯,得到多个代码片段;其中,任一代码片段至少包含一个第一图节点或第二节图点,任一代码片段为所述待测代码内的一行代码;
54.根据各所述代码片段确定所述代码序列。
55.在一些可能的实施例中,执行所述根据各所述代码片段确定所述代码序列,所述指示单元被配置为:
56.将各所述代码片段按照在所述待测代码中由前到后的出现顺序进行排序,得到所述代码序列。
57.在一些可能的实施例中,执行所述根据所述目标字段的字段权重确定所述代码序列对应的权重序列,所述权重单元被配置为:
58.针对任一代码序列内的每个代码片段,根据所述代码片段中包含的目标字段的字
段权重确定所述代码片段的片段权重;
59.根据各所述代码片段在代码序列内的排列顺序对各所述代码片段的片段权重进行排序,得到所述代码序列的权重序列。
60.在一些可能的实施例中,所述目标字段还包括表征变量的第二字段;执行所述根据所述代码片段中包含的目标字段的字段权重确定所述代码片段的片段权重,所述权重单元被配置为:
61.确定所述代码片段中包含的第一字段和第二字段,并对所述包含的第一字段和第二字段的字段权重求和;
62.若字段权重的求和结果大于第一阈值,则将预设权重作为所述代码片段的片段权重;否则,将所述求和结果作为所述代码片段的片段权重。
63.在一些可能的实施例中,所述检测网络是通过下述方式训练得到的:
64.采用预设数量的训练样本对基础检测网络进行多轮迭代训练,每轮迭代过程中根据本轮得到的检测损失值和损失阈值进行比对,直至任一轮的检测损失值小于所述损失阈值时停止迭代并确定所述基础检测网络为已训练的检测网络;其中,每轮迭代过程如下:
65.根据当前网络参数对本轮输入的训练样本进行特征识别,得到表征所述训练样本是否存在指定类型漏洞的本轮检测结果;
66.基于预设损失函数,根据所述本轮检测结果和所述训练样本的样本标签进行比对得到本轮的检测损失值。
67.在一些可能的实施例中,所述训练样本是通过下述方式构建的:
68.从历史代码中确定存在代码漏洞的漏洞代码序列;并对每个漏洞代码序列的代码漏洞进行修正,得到每个漏洞代码序列对应的修正代码序列;
69.针对任一漏洞代码序列,根据所述漏洞代码序列包含目标字段的字段权重确定第一权重序列;并根据所述漏洞代码序列对应修正代码序列包含的标字段的字段权重确定第二权重序列;
70.将所述漏洞代码序列的第一权重序列作为训练样本,并将所述漏洞代码序列的第二权重序列作为所述训练样本的样本标签。
71.在一些可能的实施例中,所述代码属性图是通过下述方式确定的:
72.根据所述待测代码的语言类型确定具备所述语言类型的特性命名规则的问题字段;并利用代码分析工具确定所述待测代码的抽象语法树;
73.将所述抽象语法树内各树节点包含的问题字段剔除和/或替换为预设字段,并采用逆文档词频算法tf-idf对各所述树节点进行归一化处理;
74.根据归一化处理后的抽象语法树构建所述代码属性图。
75.在一些可能的实施例中,所述抽象语法树内任一树节点均设有多种节点属性;执行所述根据归一化处理后的抽象语法树构建所述代码属性图之前,所述指示单元还被配置为:
76.针对任一树节点的每种节点属性,根据所述节点属性的属性信息确定所述节点属性的属性权重;其中,所述属性信息包括所述抽象语法树的节点总数、包含所述节点属性的树节点数量、所述树节点的节点属性数量、所述树节点的赋值结果是否为空、以及所述节点属性的属性类型中的部分或全部;
77.若所述属性权重低于第二阈值则通过剔除所述树节点的所述节点属性以降低所述抽象语法树的数据量。
78.第三方面,本技术实施例提供一种电子设备,包括:
79.存储器,用于存储程序指令;
80.处理器,用于调用所述存储器中存储的程序指令,按照获得的程序指令执行第一方面中任一项所述的方法包括的步骤。
81.第四方面,本技术实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被计算机执行时,使所述计算机执行第一方面中任一项所述的方法。
82.第五方面,本技术实施例提供了一种计算机程序产品,所述计算机程序产品包括:计算机程序代码,当所述计算机程序代码在计算机上运行时,使得计算机执行第一方面任一项所述的方法。
83.本技术实施例中,通过在确定待测代码的代码属性图之后,基于预设的目标字段对待测代码的代码属性图进行检测以从该代码属性图内各节点中选定与目标字段的字段含义相同的第一节点。接下来从待测代码中确定调用该第一节点的代码序列,该代码序列是根据待测代码中与第一节点具备调用关系的代码内容中确定的,具备丰富的第一节点上下文语义。进一步的,通过根据该代码序列内包含的目标字段对应的预设权重确定该代码序列的权重序列,并将权重序列输入已训练的检测网络得到待测代码针对第一节点的函数调用逻辑是否存在漏洞的检测结果,以此提高代码漏洞的检测精度。
84.本技术的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本公开而了解。本技术的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
附图说明
85.图1为本技术实施例提供的一种代码漏洞检测方法的整体流程图;
86.图2为本技术实施例提供的各指定字段含义在c#中对应字段的示意图;
87.图3为本技术实施例提供的对树内节点进行问题字段的剔除示意图;
88.图4为本技术实施例提供的剔除不重要的节点属性的示意图;
89.图5为本技术实施例提供的抽象语法树示意图;
90.图6为本技术实施例提供的代码属性图示意图;
91.图7为本技术实施例提供的代码序列的获取流程图;
92.图8为本技术实施例提供的代码序列的获取流程的示意图;
93.图9为本技术实施例提供的权重序列的获取流程的示意图;
94.图10为本技术实施例提供的网络结构示意图;
95.图11为本技术实施例提供的特征提取模块的结构示意图;
96.图12为本技术实施例提供的训练样本获取流程图;
97.图13为本技术实施例提供的确定训练样本和样本标签的示意图;
98.图14为本技术实施例提供的一种代码漏洞检测装置140的结构图;
99.图15为本技术实施例提供的电子设备示意图。
具体实施方式
100.为使本技术的目的、技术方案和优点更加清楚明白,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。在不冲突的情况下,本技术中的实施例及实施例中的特征可以相互任意组合。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以按不同于此处的顺序执行所示出或描述的步骤。
101.本技术的说明书和权利要求书及上述附图中的术语“第一”和“第二”是用于区别不同对象,而非用于描述特定顺序。此外,术语“包括”以及它们任何变形,意图在于覆盖不排他的保护。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。本技术中的“多个”可以表示至少两个,例如可以是两个、三个或者更多,本技术实施例不做限制。
102.前文已提及,目前非人工的代码漏洞检测方式主要通过检测源代码中是否存在满足检索规则的代码内容来确定是否存在代码漏洞。主要包括基于符号审计和基于语法审计两种。
103.基于符号的审计方式是使用中间语言并结合符号执行和约束求解来检测漏洞。具体利用符号执行工具生成能够触发漏洞的具体输入,并通过对输入验证来分析代码中是否存在对应漏洞。但由于符号变量的引入会使程序执行到路径分支时无法执行原本的路径走向。故需引入约束求解器以告知正确的路径走向。但约束求解器无法穷尽所有形式的约束这会降低其漏洞检测精度。并且代码体量越大在检测过程中符号执行路径的数量就会越大这会存在路径爆炸风险,故上述检测方式通常无法在大规模程序中执行。
104.基于语法的审计方式主要是在词法语法解析的基础上对源代码建模,通过数据流分析、污点分析传统分析策略确定代码是否存在漏洞。由于策略的生成主要依赖相关人员的主观设定,且该方法缺乏对可能存在漏洞代码处的上下文语义分析,如果可能存在漏洞代码处的上下文中有例如数据验证等防护措施则即便调用逻辑存在漏洞也不会被检测出来,存在误报率较高的问题。
105.为解决上述问题,本技术的发明构思为:从待测代码中确定与目标字段具备代码逻辑关系的代码序列,并根据该目标字段的字段权重确定代码序列对应的权重序列。最后通过将权重序列输入已训练的检测网络得到待测代码是否存在漏洞的检测结果,以此提高代码漏洞的检测精度。
106.具体如图1所示,图1示出了本技术实施例提供的一种代码漏洞检测方法的整体流程,具体包括:
107.步骤101:响应于检测指示,从待测代码中确定与目标字段具备代码逻辑关系的代码序列;
108.为便于理解本技术的技术方案,预先对上述目标字段进行解释说明。
109.本技术实施例设有包含多个目标字段的漏洞规则库。库内针对开发常用的多种编程语言类型设置对应的目标字段。建库时,结合目前常见的代码漏洞类型确定了具备较高
概率引发代码漏洞的多个指定字段含义。针对每个指定字段含义,确定开发环境常用的各编程语言类型下用于表征其含义的目标字段。并基于各指定字段含义在各变成语言类型下对应的目标字段构建上述漏洞规则库。
110.具体的,本技术实施例中选用下述8种漏洞类型,包括命令注入漏洞、sql注入漏洞、缓冲区溢出漏洞、xpath注入漏洞、xml注入漏洞、跨站脚本漏洞、内存泄露漏洞、路径遍历漏洞。并结合目前常见的代码漏洞类型确定了具备较高概率引发上述8种类型的代码漏洞的多个指定字段含义。
111.本技术实施例设置的指定字段含义包括如类型声明方法声明、构造函数声明、属性声明、变量声明、命名空间声明、参数声明、表达式语句、if语句、for循环语句、while循环语句、do-while循环语句、switch语句、return语句、await表达式、lambda表达式、用于表示变量、类型、方法等名称的标识符节点、用于表示如整数、浮点数、字符串等常量值的字面量表达式节点、用于表示如加减乘除等二元操作符的二元表达式节点、用于表示方法调用的调用表达式节点、用于表示新建对象的对象创建表达式节点以及用于表示访问对象属性或方法的表达式节点等,这些指定字段含义在各种语言类型的代码中的函数调用逻辑均可能触发前述8种类型的代码漏洞。
112.任一指定字段含义在开发环境中常用的编程语言类型(c#、c/c++、java、python和php)中均有表征该指定字段含义的待处理字段。例如“包”这一指定字段含义,在java中以字段“package”命名,而在c#中则以字段“namespace”命名。即,针对“包”这一指定字段含义,在java中有“package”作为其对应的待处理字段,在c#中有“namespace”作为其对应的待处理字段。可见,每个指定字段含义在各种语言类型的代码中均能找到其对应的待处理字段。
113.上述指定字段含义可分为用于函数定义和用于声明变量两类。当指定字段含义用于函数定义时,将该指定字段含义在每种编程语言类型下对应的目标字段作为第一字段。当该指定字段含义用于声明变量时,将该指定字段含义在每种编程语言类型下对应的目标字段作为第二字段。由此,库内各目标字段按照字段含义可划分为表征函数的第一字段和表征变量的第二字段。
114.前述步骤101的目的在于从待测代码中确定与库内目标字段具备代码逻辑关系(例如引用了某一目标字段、直接和/或间接调用了某一目标字段)的待测序列。在执行步骤101时,包括下述步骤s11和s12:
115.步骤s11生成待测代码的代码属性图;
116.实施时,利用代码分析工具对待测代码的抽象语法树进行提取,继而根据抽象语法树确定待测代码的代码属性图。代码属性图是结合了抽象语法树ast的一种以节点和边的关系来表达代码逻辑的数据结构。考虑到实际开发阶段一个项目可能包含多种编程语言,为节约内存占用提高代码属性图的提取速率,本技术实施例对前述每一指定字段含义在不同编程语言中对应目标字段的字段名进行归一化处理。
117.具体的,预先根据待测代码的语言类型确定具备语言类型的特性命名规则的问题字段,并利用代码分析工具确定待测代码的抽象语法树。通过将抽象语法树内各树节点包含的问题字段剔除和/或替换为预设字段,并采用逆文档词频算法tf-idf对各树节点进行归一化处理,最后根据归一化处理后的抽象语法树构建代码属性图。
118.为便于理解上述代码属性图的获取流程,接下来以编程语言c#为例进行说明。具体如图2所示,图2中示出了上述每种指定字段含义在c#中对应的,表征该指定字段含义的待处理字段。
119.实施时,可通过microsoft.codeanalysis.csharp.syntax工具提取抽象语法树内表征每种指定字段含义的树节点。每个树节点即为代码中与该指定字段含义对应的待处理字段。
120.接下来将待处理字段中的问题字段进行剔除和/或替换,例如可将c#中如syntax、statement、declaration、attribute等具备特性命名规则的字段作为问题字段。以图3示出的树节点“classdeclarationsyntax”为例,其在c#中的指定字段含义为“类型声明”。通过将classdeclarationsyntax中的问题字段declaration和attribute剔除得到处理后的树节点class。
121.下面对上述常见的每种语言类型的代码如何进行问题字段的剔除进行分别说明:
122.c/c++中可利用org.eclipse.cdt工具库提取抽象语法树内表征每种指定字段含义的树节点。并将节点中具备特性命名规则的问题字段(如“cast”、“expression”等)剔除。例如剔除树节点“castliteralexpression”中的cast前缀和expression后缀得到literal。
123.java中可利用org.eclipse.jdt工具库提取抽象语法树内表征每种指定字段含义的树节点。并将节点中具备特性命名规则的问题字段(如“statement”、“expression”等)剔除。例如剔除树节点“postfixexpression”中的expression后缀得到postfix。
124.python的问题字段主要为“ast.”,通过将python代码对应抽象语法树内表征每种指定字段含义的树节点中ast.前缀剔除即可。例如树节点“ast.index”剔除ast.前缀得到index。
125.php中可利用optparse.optionparser工具库提取抽象语法树内表征每种指定字段含义的树节点。并将节点中具备特性命名规则的问题字段替换为预设字段,例如将具备function后缀的字段,如“scalar_magicconst_function”、“expr_arrowfunction”、“stmt_function”等替换为预设字段“functioncall”。再例如将具备list后缀的字段,如“expr_list”替换为预设字段“list”。
126.通过上述流程对每种语言类型代码对应抽象语法树中的问题字段进行处理之后,针对任一指定字段含义在不同语言类型的代码中的表示仍会存在差别,即同一指定字段含义在不同语言类型的抽象语法树中显示的节点不同。为进一步节约内存,本技术实施例采用逆文档词频算法tf-idf对不同语言类型的抽象语法树内各节点进行归类,使各指定字段含义在不同语言类型的抽象语法树中显示的节点相同。
127.其中,nltk是自然语义处理库,其用于对词干提取并剔除不影响词性的小尾巴,例如“functiondef”剔除不影响词性的后缀“def”得到function。通过上述处理后,针对每种指定字段含义,在不同语言类型代码对应的抽象语法树中的树节点命名相同。由此能够大幅降低抽象语法树的节点数据量,降低内存占用的同时,提高计算效率。
128.需要说明的是,抽象语法树的提取流程是利用现有代码分析工具进行提取的,目前的提取规则会为抽象语法树内各节点设置对应的节点属性。这些节点属性主要包括如节点的名称、节点类型以及该节点在待处理代码内的位置信息等。
129.为进一步降低内存占用,通过上述流程对抽象语法树进行归一化之后,针对任一
节点的每种节点属性,根据节点属性的属性信息确定节点属性的属性权重;若属性权重低于第二阈值,则剔除节点的节点属性以降低抽象语法树的数据量。
130.其中,上述属性信息包括抽象语法树的节点总数n、抽象语法树内包含节点属性的节点数量p、节点中的节点属性数量m、节点属性的属性类型t1以及赋值结果是否为空t2中的部分或全部。
131.具体如图4所示,针对抽象语法树内每个树节点,预先遍历该树节点的每种节点属性对应的属性信息。以图4示出的节点id:5为例,其具备的节点属性包括节点类型type包括节点名称name两种。
132.对节点id:5进行处理时,针对任一节点属性,确定该节点属性对应的属性信息。以节点属性:节点类型type为例,图4示出的抽象语法树内共计100个节点,节点属性中具备节点类型的节点有100个,即节点总数n为100,包含该节点属性的节点数量p为100。另由于该节点id:5的节点属性包括上述type和name两种故m为2。
133.此外,本技术实施例针对每种数据类型设置对应的权重,例如整型int对应权重0.8、字符串string对应权重0.75。若该树节点a的节点类型为字符串string则确定其t1为0.75。t2则是根据树内各节点赋值结果不为空的个数与节点总数的比值。
134.通过上述流程确定树节点a的节点类型type的属性信息n、m、p、t1和t2之后,通过下述公式(1)确定节点a的节点类型type的属性权重w:
135.w=(p*t1*t2)/(m*n) 公式(1)
136.若w小于第二阈值则确定该节点属性的重要性较低,此时将该节点属性丢弃即可。通过上述流程剔除抽象语法树内各树节点中重要性较低的节点属性之后,根据现有代码分析工具将该抽象语法树转化为对应的代码属性图即可,由此可进一步降低代码属性图占用的内存空间。
137.为便于理解上述流程接下来如图5和图6所示,图5示出了对某个项目中224~240行代码对应的抽象语法树。抽象语法树是由程序代码组成的树状结构,其中每个树节点代表代码中的一个语法元素(如变量、函数、操作符等),没有边的概念。以图中圈选树节点中的节点id:1即表征224行代码中表征函数定义的字段“def commonparse”。
138.节点id:1直连的树节点有节点id:2和节点id:3。其中,节点id:2表征“def commonparse”字段的参数(param_of_func)、节点id:3表征“def commonparse”字段的返回值(return_of_func)。其中,“def commonparse”字段的参数即为224行代码中为“def commonparse”的赋值结果“confpath”。“def commonparse”字段的返回值即为240行代码中返回的“ipportlist”。
139.图6中示出的代码属性图即为对图5示出的抽象语法树进行前述归一化处理并剔除不重要节点属性后构建的。例如图5示出的224~225行代码在抽象语法树中对应的节点为id:1~6,而在代码属性图中对应的节点则“block(try)”之前的五个节点。代码属性图是由多个节点和边组成的图形结构,其中节点代表代码中的所有元素(如变量、函数、注释等),边表示节点间的调用关系。相比于抽象语法树,代码属性图能够更简洁、更直接的记录每处代码所表征的语义信息和上下文信息。
140.步骤s12:基于该代码属性图中表征第一字段的第一图节点确定与该第一字段具备代码逻辑关系的代码序列。
141.实施时具体如图7所示,包括下述步骤:
142.步骤701:根据待测代码的语言类型确定第一字段;
143.步骤702:针对任一第一图节点,根据代码属性图指示的函数调用关系从代码属性图内各图节点中选定直接和/或间接调用第一图节点的第二图节点;
144.步骤703:根据第一图节点和第二图节点对从待测代码回溯,得到多个代码片段;其中,任一代码片段至少包含一个第一图节点或第二节图点,任一代码片段为待测代码内的一行代码;
145.代码片段指代程序项目中的一行代码,例如前述图5示出的224~240行代码中,每行代码均为一个代码片段。实际应用中可自行设置代码片段的截取规则,本技术对此不作限定。
146.步骤704:根据各代码片段确定对应的代码序列。
147.实施时,通过将各代码片段按照在待测代码中由前到后的出现顺序进行排序,得到该代码序列。
148.接下来以前述图5中示出的代码为例对前述步骤701~704中示出的代码序列获取流程进行解释说明,具体如图8所示:
149.执行前述步骤701时,根据待测代码的语言类型python从漏洞规则库中确定python下表征函数的各第一字段。接下来以第一字段parse为例进行说明。parse字段的调用通常有可能触发代码漏洞。故通过执行前述步骤702从待测代码的代码属性图中确定表征“parse”的第一图节点,以及与“parse”具备直接和间接调用关系的第二图节点“def commonparse”、“ipportlist”等。
150.本技术实施例中的代码属性图与待测代码间设有跳转接口api,通过代码属性图内任一图节点即可跳转到待测代码中该图节点所在的位置。由此,通过执行前述步骤703根据第一图节点和第二图节点即可从待测代码中确定对应的代码片段。如图8中所示,每行代码片段中会包括任一第一图节点和/或第二图节点。这样即获取了待测代码中与第一字段“parse”具备上下文语义关系的全部内容(即上述根据第一图节点和第二阶段确定的代码片段)。
151.最后通过执行步骤704根据各代码片段在待测代码中由前到后的出现顺序进行排序,得到调用第一字段的代码序列。即按照每个代码片段在待测代码内的行号由小到达进行排序,即得到图8最终示出的代码序列。
152.步骤102:根据所述目标字段的字段权重确定所述代码序列对应的权重序列;
153.本技术实施例的漏洞规则库内每一目标字段均设有对应的字段权重,该字段权重用于表征该目标字段对于引发代码漏洞的影响程度。在执行步骤102时,针对任一代码序列内的每个代码片段,根据该代码片段中包含的目标字段的字段权重确定代码片段的片段权重。并根据各代码片段在代码序列内的排列顺序对各代码片段的片段权重进行排序,得到代码序列的权重序列。
154.为便于理解上述权重序列的获取流程,接下来以前述图8中示出的代码序列1为例进行说明,具体如图9所示。
155.根据前述图8示出的代码序列1可知,待测代码中与第一字段“parse”具备上下文语义关系的共有行号为17、36、45、182、224、227这6个代码片段。接下来根据排序由前到后
的顺序对每行代码片段进行遍历。
156.实施时针对每一代码片段,确定代码片段中包含的全部目标字段并对全部目标字段的指定字段含义求和。若指定字段含义的求和结果大于第一阈值,则将预设权重作为代码片段的片段权重;否则,将求和结果作为代码片段的片段权重。
157.具体的,以图9中行号为17的代码片段为例进行说明。由于该代码片段中的目标字段仅有作为第二字段的“context”,故将该第二字段context的字段权重3作为该代码片段的片段权重3。另假设该代码片段中不仅包含第二字段context,还包含字段权重为7的第一字段parse,则确定该代码片段中各目标字段的字段权重之和为10,由于该字段权重之和大于第一阈值9,则将预设权重9作为该代码片段的片段权重。相应的,若该字段权重之和未大于第一阈值9,则将该字段权重之和作为该代码片段的片段权重。
158.通过上述流程即可得到上述代码序列1中每一代码片段对应的片段权重。接下来将各代码片段对应的片段权重按照各代码片段在代码序列内的排列顺序进行排序,得到代码序列1的权重序列{3、0、0、0、0、7}。继而通过将该权重序列输入已训练的检测网络进行特征识别,即可得到待测代码中针对“parse”这一函数的调用逻辑是否存在漏洞的检测结果。
159.步骤103:将所述权重序列输入已训练的检测网络得到所述待测代码是否存在漏洞的检测结果。
160.为便于理解本技术技术方案,预先对本技术实施例中检测网络的训练流程进行说明。
161.本技术实施例预先构建如图10所示的基础检测网络。该网络结构包括输入层、特征提取层和输出层三部分。
162.其中,输入层用于接收通过前述流程得到的权重序列。特征提取层则用于对输入的权重序列进行特征提取。为了解决较深的网络需要更多的数据所产生的过拟合现象和梯度消失的现象,本技术实施例在特征提取层中设置了如图11所示的特征提取模块inception。该模块结构在inceptionv2的基础上将n
×
n卷积运算分解成1
×
n和n
×
1两个卷积,使卷积变的更宽而不是更深,这样既增加了网络的非线性能力,也降低了计算成本。
163.特征提取部分共由5个模块组成,模块与模块之间使用步幅为2的3
×
3最大池化层来减小输出高度。第1个模块包含3层的3
×
3卷积层,第2个模块使用2个卷积层,首先接一个64通道的1
×
1卷积层,然后接了一个将通道数扩大3倍的3
×
3卷积层,接下来通过将多个inception块串联的结构以采用多层的不同空间尺寸的卷积操作来深度挖掘数据中的特征,从而进行性能更好稳定性更高的学习分类。
164.输出层要是根据之前卷积层输出的结果来输出分类结果。首先使用一个全局平均池化层来将每个通道的高和宽都变成1,然后接上一个全连接层,输出通道数为2,最后通过sigmoid激活函数构建逻辑回归分类器来计算程序代码的缺陷概率,从而得到分类结果。其中,sigmoid激活函数用于进行自变量(输入)向因变量(输出的)转化。
165.接下来对上述基础检测网络的训练流程进行解释说明,实施时预先通过图12示出的样本构建流程,从历史代码中选定用于训练检测模型的训练样本:
166.步骤121:从历史代码中确定预设数量的漏洞代码序列;其中,漏洞代码序列存在指定类型的代码漏洞;任一漏洞代码序列中包含至少一个第一字段,且漏洞代码序列中包含历史代码中直接和/或间接调用第一字段的全部代码片段;
167.步骤122:针对任一漏洞代码序列,对漏洞代码序列的漏洞进行修正得到修正代码序列;根据漏洞代码序列包含的目标字段的字段权重确定第一权重序列;并根据漏洞代码序列对应修正代码序列包含的目标字段的字段权重确定第二权重序列;
168.步骤123:针对任一漏洞代码序列,将漏洞代码序列的第一权重序列作为训练样本,并将漏洞代码序列的第二权重序列作为训练样本的样本标签。
169.实施时,从历史项目的代码数据中选取包括命令注入、sql注入、缓冲区溢出、xpath注入、xml注入、跨站脚本、内存泄露、路径遍历这8类漏洞的代码数据。
170.然后,针对前述常用的代码语言类型(c#、c/c++、java、python和php),从前述代码数据中针对每种漏洞类型,选择1000组包含该种漏洞类型的代码。进一步的,采用前述代码序列的构建流程对每组代码进行代码序列的构建,得到每组代码对应的漏洞代码序列,并针对每个漏洞代码序列进行漏洞修正由此得到每个漏洞代码序列对应的修正代码序列。
171.接下来如图13所示,采用前述从代码序列中确定对应权重序列相同的方式,针对任一漏洞代码序列,根据该漏洞代码序列内各代码片段确定该漏洞代码序列的第一权重序列。并根据该漏洞代码序列对应修正代码序列内各代码片段确定该漏洞代码序列的第二权重序列。最后针对任一漏洞代码序列,将该漏洞代码序列的第一权重序列作为训练样本,并将该漏洞代码序列的第二权重序列作为训练样本的样本标签。
172.通过上述流程构建包含样本标签的训练样本后,通过该训练样本对基础检测网络进行多轮迭代训练,每轮迭代过程中根据本轮得到的检测损失值和损失阈值进行比对,直至任一轮的检测损失值小于损失阈值时停止迭代并确定基础检测网络为已训练的检测网络。其中,每轮迭代过程如下:
173.根据当前网络参数对本轮输入的训练样本进行特征识别,得到表征训练样本是否存在指定类型漏洞的本轮检测结果;基于预设损失函数,根据本轮检测结果和训练样本的样本标签进行比对得到本轮的检测损失值。
174.通过上述流程训练后的检测网络可配合本技术实施例中通过步骤101~103得到的权重序列使用。具体实施时可直接将等待漏洞审计的代码作为本技术的待测代码,另为提高漏洞检测精度还可预先采用现有的漏洞审计工具对等待漏洞审计的代码进行漏洞筛查。
175.待确定漏洞审计工具指示的可能包含漏洞的问题代码后,通过将代码中的问题代码部分作为本技术实施例中的待测代码,并通过前述步骤101~103的流程得到待测代码中每一第一字段对应的权重序列。最后通过将该权重序列输入到已训练的检测网络中进行特征识别即可得到待测代码中针对该权重序列对应第一字段的函数调用逻辑是否存在漏洞的检测结果。由此可将本技术技术方案与现有漏洞审计工具结合使用以进一步提高漏洞检测精度。
176.基于相同的发明构思,本技术实施例还提供了一种漏洞检测装置140,装置结构具体如图14所示,包括:
177.指示单元141,被配置为执行响应于检测指示,从待测代码中确定与目标字段具备代码逻辑关系的代码序列;
178.权重单元142,被配置为执行根据所述目标字段的字段权重确定所述代码序列对应的权重序列;
179.检测单元143,被配置为执行将所述权重序列输入已训练的检测网络得到所述待测代码是否存在漏洞的检测结果。
180.在一些可能的实施例中,所述目标字段包括表征函数的第一字段;执行所述从待测代码中确定与目标字段具备代码逻辑关系的代码序列,所述指示单元被配置为:
181.生成所述待测代码的代码属性图;
182.基于所述代码属性图中表征所述第一字段的第一图节点确定与所述第一字段具备代码逻辑关系的代码序列。
183.在一些可能的实施例中,执行所述基于所述代码属性图中表征所述第一字段的第一图节点确定与所述第一字段具备代码逻辑关系的代码序列,所述指示单元被配置为:
184.针对任一第一图节点,根据所述代码属性图指示的函数调用关系从所述代码属性图内各图节点中选定直接和/或间接调用所述第一图节点的第二图节点;
185.基于所述第一图节点和所述第二图节点从所述待测代码中确定所述代码序列。
186.在一些可能的实施例中,执行所述基于所述第一图节点和所述第二图节点从所述待测代码中确定所述代码序列,所述指示单元被配置为:
187.根据所述第一图节点和所述第二图节点对从所述待测代码回溯,得到多个代码片段;其中,任一代码片段至少包含一个第一图节点或第二节图点,任一代码片段为所述待测代码内的一行代码;
188.根据各所述代码片段确定所述代码序列。
189.在一些可能的实施例中,执行所述根据各所述代码片段确定所述代码序列,所述指示单元被配置为:
190.将各所述代码片段按照在所述待测代码中由前到后的出现顺序进行排序,得到所述代码序列。
191.在一些可能的实施例中,执行所述根据所述目标字段的字段权重确定所述代码序列对应的权重序列,所述权重单元被配置为:
192.针对任一代码序列内的每个代码片段,根据所述代码片段中包含的目标字段的字段权重确定所述代码片段的片段权重;
193.根据各所述代码片段在代码序列内的排列顺序对各所述代码片段的片段权重进行排序,得到所述代码序列的权重序列。
194.在一些可能的实施例中,所述目标字段还包括表征变量的第二字段;执行所述根据所述代码片段中包含的目标字段的字段权重确定所述代码片段的片段权重,所述权重单元被配置为:
195.确定所述代码片段中包含的第一字段和第二字段,并对所述包含的第一字段和第二字段的字段权重求和;
196.若字段权重的求和结果大于第一阈值,则将预设权重作为所述代码片段的片段权重;否则,将所述求和结果作为所述代码片段的片段权重。
197.在一些可能的实施例中,所述检测网络是通过下述方式训练得到的:
198.采用预设数量的训练样本对基础检测网络进行多轮迭代训练,每轮迭代过程中根据本轮得到的检测损失值和损失阈值进行比对,直至任一轮的检测损失值小于所述损失阈值时停止迭代并确定所述基础检测网络为已训练的检测网络;其中,每轮迭代过程如下:
199.根据当前网络参数对本轮输入的训练样本进行特征识别,得到表征所述训练样本是否存在指定类型漏洞的本轮检测结果;
200.基于预设损失函数,根据所述本轮检测结果和所述训练样本的样本标签进行比对得到本轮的检测损失值。
201.在一些可能的实施例中,所述训练样本是通过下述方式构建的:
202.从历史代码中确定存在代码漏洞的漏洞代码序列;并对每个漏洞代码序列的代码漏洞进行修正,得到每个漏洞代码序列对应的修正代码序列;
203.针对任一漏洞代码序列,根据所述漏洞代码序列包含目标字段的字段权重确定第一权重序列;并根据所述漏洞代码序列对应修正代码序列包含的标字段的字段权重确定第二权重序列;
204.将所述漏洞代码序列的第一权重序列作为训练样本,并将所述漏洞代码序列的第二权重序列作为所述训练样本的样本标签。
205.在一些可能的实施例中,所述代码属性图是通过下述方式确定的:
206.根据所述待测代码的语言类型确定具备所述语言类型的特性命名规则的问题字段;并利用代码分析工具确定所述待测代码的抽象语法树;
207.将所述抽象语法树内各树节点包含的问题字段剔除和/或替换为预设字段,并采用逆文档词频算法tf-idf对各所述树节点进行归一化处理;
208.根据归一化处理后的抽象语法树构建所述代码属性图。
209.在一些可能的实施例中,所述抽象语法树内任一树节点均设有多种节点属性;执行所述根据归一化处理后的抽象语法树构建所述代码属性图之前,所述指示单元还被配置为:
210.针对任一树节点的每种节点属性,根据所述节点属性的属性信息确定所述节点属性的属性权重;其中,所述属性信息包括所述抽象语法树的节点总数、包含所述节点属性的树节点数量、所述树节点的节点属性数量、所述树节点的赋值结果是否为空、以及所述节点属性的属性类型中的部分或全部;
211.若所述属性权重低于第二阈值则通过剔除所述树节点的所述节点属性以降低所述抽象语法树的数据量。
212.下面参照图15来描述根据本技术的这种实施方式的电子设备130。图15显示的电子设备130仅仅是一个示例,不应对本技术实施例的功能和使用范围带来任何限制。
213.如图15所示,电子设备130以通用电子设备的形式表现。电子设备130的组件可以包括但不限于:上述至少一个处理器131、上述至少一个存储器132、连接不同系统组件(包括存储器132和处理器131)的总线133。
214.总线133表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器、外围总线、处理器或者使用多种总线结构中的任意总线结构的局域总线。
215.存储器132可以包括易失性存储器形式的可读介质,例如随机存取存储器(ram)1321和/或高速缓存存储器1322,还可以进一步包括只读存储器(rom)1323。
216.存储器132还可以包括具有一组(至少一个)程序模块1324的程序/实用工具1325,这样的程序模块1324包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
217.电子设备130也可以与一个或多个外部设备134(例如键盘、指向设备等)通信,还可与一个或者多个使得用户能与电子设备130交互的设备通信,和/或与使得该电子设备130能与一个或多个其它电子设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(i/o)接口135进行。并且,电子设备130还可以通过网络适配器136与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。如图所示,网络适配器136通过总线133与用于电子设备130的其它模块通信。应当理解,尽管图中未示出,可以结合电子设备130使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理器、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储系统等。
218.在示例性实施例中,还提供了一种包括指令的计算机可读存储介质,例如包括指令的存储器132,上述指令可由上述装置的处理器131执行以完成上述方法。可选地,计算机可读存储介质可以是rom、随机存取存储器(ram)、cd-rom、磁带、软盘和光数据存储设备等。
219.在示例性实施例中,还提供一种计算机程序产品,包括计算机程序/指令,所述计算机程序/指令被处理器131执行时实现如本技术提供的一种代码漏洞检测方法中的任一方法。
220.在示例性实施例中,本技术提供的一种代码漏洞检测方法的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当程序产品在计算机设备上运行时,程序代码用于使计算机设备执行本说明书上述描述的根据本技术各种示例性实施方式的一种代码漏洞检测方法中的步骤。
221.程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。
222.本技术的实施方式的用于代码漏洞检测的程序产品可以采用便携式紧凑盘只读存储器(cd-rom)并包括程序代码,并可以在电子设备上运行。然而,本技术的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
223.可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
224.可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、有线、光缆、rf等等,或者上述的任意合适的组合。
225.可以以一种或多种程序设计语言的任意组合来编写用于执行本技术操作的程序代码,程序设计语言包括面向对象的程序设计语言—诸如java、c++等,还包括常规的过程式程序设计语言—诸如语言或类似的程序设计语言。程序代码可以完全地在用户电子设备
上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户电子设备上部分在远程电子设备上执行、或者完全在远程电子设备或服务端上执行。在涉及远程电子设备的情形中,远程电子设备可以通过任意种类的网络——包括局域网(lan)或广域网(wan)—连接到用户电子设备,或者,可以连接到外部电子设备(例如利用因特网服务提供商来通过因特网连接)。
226.应当注意,尽管在上文详细描述中提及了装置的若干单元或子单元,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本技术的实施方式,上文描述的两个或更多单元的特征和功能可以在一个单元中具体化。反之,上文描述的一个单元的特征和功能可以进一步划分为由多个单元来具体化。
227.此外,尽管在附图中以特定顺序描述了本技术方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
228.本领域内的技术人员应明白,本技术的实施例可提供为方法、系统、或计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本技术可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
229.本技术是参照根据本技术实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程图像缩放设备的处理器以产生一个机器,使得通过计算机或其他可编程图像缩放设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
230.这些计算机程序指令也可存储在能引导计算机或其他可编程图像缩放设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
231.这些计算机程序指令也可装载到计算机或其他可编程图像缩放设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
232.尽管已描述了本技术的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本技术范围的所有变更和修改。
233.显然,本领域的技术人员可以对本技术进行各种改动和变型而不脱离本技术的范围。这样,倘若本技术的这些修改和变型属于本技术权利要求及其等同技术的范围之内,则本技术也意图包含这些改动和变型在内。

技术特征:
1.一种代码漏洞检测方法,其特征在于,所述方法包括:响应于检测指示,从待测代码中确定与目标字段具备代码逻辑关系的代码序列;根据所述目标字段的字段权重确定所述代码序列对应的权重序列;将所述权重序列输入已训练的检测网络得到所述待测代码是否存在漏洞的检测结果。2.根据权利要求1所述的方法,其特征在于,所述目标字段包括表征函数的第一字段;所述从待测代码中确定与目标字段具备代码逻辑关系的代码序列,包括:生成所述待测代码的代码属性图;基于所述代码属性图中表征所述第一字段的第一图节点确定与所述第一字段具备代码逻辑关系的代码序列。3.根据权利要求2所述的方法,其特征在于,所述基于所述代码属性图中表征所述第一字段的第一图节点确定与所述第一字段具备代码逻辑关系的代码序列,包括:针对任一第一图节点,根据所述代码属性图指示的函数调用关系从所述代码属性图内各图节点中选定直接和/或间接调用所述第一图节点的第二图节点;基于所述第一图节点和所述第二图节点从所述待测代码中确定所述代码序列。4.根据权利要求3所述的方法,其特征在于,所述基于所述第一图节点和所述第二图节点从所述待测代码中确定所述代码序列,包括:根据所述第一图节点和所述第二图节点对从所述待测代码回溯,得到多个代码片段;其中,任一代码片段至少包含一个第一图节点或第二节图点,任一代码片段为所述待测代码内的一行代码;根据各所述代码片段确定所述代码序列。5.根据权利要求4所述的方法,其特征在于,所述根据各所述代码片段确定所述代码序列,包括:将各所述代码片段按照在所述待测代码中由前到后的出现顺序进行排序,得到所述代码序列。6.根据权利要求4所述的方法,其特征在于,所述根据所述目标字段的字段权重确定所述代码序列对应的权重序列,包括:针对任一代码序列内的每个代码片段,根据所述代码片段中包含的目标字段的字段权重确定所述代码片段的片段权重;根据各所述代码片段在代码序列内的排列顺序对各所述代码片段的片段权重进行排序,得到所述代码序列的权重序列。7.根据权利要求6所述的方法,其特征在于,所述目标字段还包括表征变量的第二字段;所述根据所述代码片段中包含的目标字段的字段权重确定所述代码片段的片段权重,包括:确定所述代码片段中包含的第一字段和第二字段,并对所述包含的第一字段和第二字段的字段权重求和;若字段权重的求和结果大于第一阈值,则将预设权重作为所述代码片段的片段权重;否则,将所述求和结果作为所述代码片段的片段权重。8.根据权利要求1所述的方法,其特征在于,所述检测网络是通过下述方式训练得到的:
采用预设数量的训练样本对基础检测网络进行多轮迭代训练,每轮迭代过程中根据本轮得到的检测损失值和损失阈值进行比对,直至任一轮的检测损失值小于所述损失阈值时停止迭代并确定所述基础检测网络为已训练的检测网络;其中,每轮迭代过程如下:根据当前网络参数对本轮输入的训练样本进行特征识别,得到表征所述训练样本是否存在指定类型漏洞的本轮检测结果;基于预设损失函数,根据所述本轮检测结果和所述训练样本的样本标签进行比对得到本轮的检测损失值。9.根据权利要求8所述的方法,其特征在于,所述训练样本是通过下述方式构建的:从历史代码中确定存在代码漏洞的漏洞代码序列;并对每个漏洞代码序列的代码漏洞进行修正,得到每个漏洞代码序列对应的修正代码序列;针对任一漏洞代码序列,根据所述漏洞代码序列包含目标字段的字段权重确定第一权重序列;并根据所述漏洞代码序列对应修正代码序列包含的标字段的字段权重确定第二权重序列;将所述漏洞代码序列的第一权重序列作为训练样本,并将所述漏洞代码序列的第二权重序列作为所述训练样本的样本标签。10.根据权利要求2所述的方法,其特征在于,所述代码属性图是通过下述方式确定的:根据所述待测代码的语言类型确定具备所述语言类型的特性命名规则的问题字段;并利用代码分析工具确定所述待测代码的抽象语法树;将所述抽象语法树内各树节点包含的问题字段剔除和/或替换为预设字段,并采用逆文档词频算法tf-idf对各所述树节点进行归一化处理;根据归一化处理后的抽象语法树构建所述代码属性图。11.根据权利要求10所述的方法,其特征在于,所述抽象语法树内任一树节点均设有多种节点属性;所述根据归一化处理后的抽象语法树构建所述代码属性图之前,所述方法还包括:针对任一树节点的每种节点属性,根据所述节点属性的属性信息确定所述节点属性的属性权重;其中,所述属性信息包括所述抽象语法树的节点总数、包含所述节点属性的树节点数量、所述树节点的节点属性数量、所述树节点的赋值结果是否为空、以及所述节点属性的属性类型中的部分或全部;若所述属性权重低于第二阈值则通过剔除所述树节点的所述节点属性以降低所述抽象语法树的数据量。12.一种代码漏洞检测装置,其特征在于,所述装置包括:指示单元,被配置为执行响应于检测指示,从待测代码中确定与目标字段具备代码逻辑关系的代码序列;权重单元,被配置为执行根据所述目标字段的字段权重确定所述代码序列对应的权重序列;检测单元,被配置为执行将所述权重序列输入已训练的检测网络得到所述待测代码是否存在漏洞的检测结果。13.一种电子设备,其特征在于,包括:存储器,用于存储程序指令;
处理器,用于调用所述存储器中存储的程序指令,按照获得的程序指令执行权利要求1-11中任一项所述的方法包括的步骤。

技术总结
本申请公开了一种代码漏洞检测方法、装置、设备及介质,涉及网络安全技术领域,用于提高代码漏洞的检测精度。该方法包括:响应于检测指示,从待测代码中确定与目标字段具备代码逻辑关系的代码序列;根据所述目标字段的字段权重确定所述代码序列对应的权重序列;将所述权重序列输入已训练的检测网络得到所述待测代码是否存在漏洞的检测结果。代码是否存在漏洞的检测结果。代码是否存在漏洞的检测结果。


技术研发人员:古琳莹 刘荣华 樊志甲 张晶晶
受保护的技术使用者:北京神州绿盟科技有限公司
技术研发日:2023.06.29
技术公布日:2023/9/23
版权声明

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

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

航空商城 https://mall.aerohome.com.cn/

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

分享:

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

评论

相关推荐