CN114692155B - 基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法 - Google Patents

基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法 Download PDF

Info

Publication number
CN114692155B
CN114692155B CN202210595809.8A CN202210595809A CN114692155B CN 114692155 B CN114692155 B CN 114692155B CN 202210595809 A CN202210595809 A CN 202210595809A CN 114692155 B CN114692155 B CN 114692155B
Authority
CN
China
Prior art keywords
code
vulnerability
node
nodes
graph
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202210595809.8A
Other languages
English (en)
Other versions
CN114692155A (zh
Inventor
王晓东
王健
魏志强
李凯航
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Qingdao Jari Industry Control Technology Co ltd
Original Assignee
Ocean University of China
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Ocean University of China filed Critical Ocean University of China
Priority to CN202210595809.8A priority Critical patent/CN114692155B/zh
Publication of CN114692155A publication Critical patent/CN114692155A/zh
Application granted granted Critical
Publication of CN114692155B publication Critical patent/CN114692155B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • G06F21/563Static detection by source code analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/30Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
    • G06F16/36Creation of semantic tools, e.g. ontology or thesauri
    • G06F16/367Ontology
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis

Abstract

本发明属于网络安全技术领域,公开了基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法,本发明首先生成源代码的代码图谱,然后基于漏洞模式、数据依赖、控制依赖,从源代码漏洞图谱中提取漏洞代码子图,得到标注数据集,然后从漏洞代码子图中提取六种特征,整合得到漏洞代码子图的向量表示,最后将漏洞代码子图的向量表示输入到分类模型进行训练,利用标签信息对分类模型进行优化,生成漏洞代码检测模型。漏洞代码检测模型能够对漏洞代码进行多分类漏洞检测,保证在软件开发过程中代码的安全性。

Description

基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法
技术领域
本发明属于网络安全技术领域,特别涉及一种基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法。
背景技术
随着信息化时代的到来,计算机系统广泛使用,各个平台软件的质量参差不齐,良莠不齐,软件中往往隐藏了严重的安全漏洞。这些漏洞通常是由于软件开发人员在编写代码时使用了不规范的编程模式引起的。这些漏洞一旦被攻击者利用,会严重破坏系统的稳定性和安全性,因此,针对软件的安全性考量变得十分重要。由于现有的开源软件和代码复用的风气盛行,这些带有缺陷和漏洞的代码一旦被公开开源出去,会得到迅速的传播,很可能造成某一领域的重大软件安全事故。事实证明,软件代码漏洞无论在政治上、经济上、军事上都占有举足轻重的地位,一旦被恶人利用,讲给国家安全带来巨大的威胁。因此,软件代码安全性评估日益受到个人、组织以及国家的重视。
针对上述问题和现状,近几年出现许多代码漏洞检测相关的研究和方法。传统的代码漏洞检测方法基于模式匹配的方式,不能够获取足够的漏洞代码相关的特征。也有的研究从源代码文件的角度出发,以整个源代码文件或代码中的函数为粒度,结合机器学习模型提取漏洞代码的特征,由于研究粒度较粗,引入了过多的噪声,导致提取到的特征不够细致全面。有的研究方法只关注单一的代码漏洞的检测,不能够识别多种漏洞类型。
综上所述,目前并没有一种代码漏洞检测方法,能够细粒度的,自动对漏洞特征进行提取,并对多种漏洞类型进行检测。
发明内容
针对现有技术存在的不足,本发明提供一种基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法,从研究程序源代码的角度出发,构建源代码知识图谱,从源代码知识图谱中提取漏洞代码子图,然后利用词向量模型对漏洞代码进行向量化表示,最后利用深度学习模型对漏洞特征进行自动提取,得到漏洞代码检测模型,能够对漏洞代码进行多分类漏洞检测,从而在软件开发过程中保证代码的安全性。
为了解决上述技术问题,本发明采用的技术方案是:
首先,本发明提供一种基于知识图谱的漏洞代码图谱构建方法,包括以下步骤:
S1、获取漏洞代码相关信息:包括漏洞源代码文件、漏洞发布日期、漏洞补丁方案、漏洞所处的代码仓库地址、代码仓库提交日志、代码仓库issue信息;
S2、对漏洞源代码文件的处理:将漏洞源代码文件处理成抽象语法树,利用抽象语法树的深度遍历算法,从抽象语法树中提取实体、关系信息,构建源代码图谱,进而抽取生成漏洞代码子图;
S3、对漏洞代码相关文字信息的处理:基于获取到的漏洞代码相关信息数据,利用自然语言处理技术,从代码文档、issue、补丁方案中提取出与代码相关的实体节点和实体间关系信息,保存记录到数据库中;
S4、对前两部分的到的实体和关系进行实体关系融合:通过步骤S1可以得到源代码实体关系,通过步骤S2得到文档实体关系,将两者进行实体关系融合,整合源代码和文档中的信息;
S5、构造标注数据集D:得到漏洞代码子图以后,将漏洞代码子图和爬取的数据进行对齐,对每一个漏洞代码子图进行人工标注,对于有漏洞的代码子图标注上对应的漏洞类型,没有漏洞的代码子图标注0。
进一步的,步骤S2的具体步骤如下:
S21、处理漏洞源代码文件,提取源代码文件的抽象语法树;
S22、实体类型定义及实体间关系定义:结合源代码文件的抽象语法树信息,定义构建源代码知识图谱必备的实体类型信息和实体间关系信息;
S23、遍历抽象语法树生成源代码图谱:利用代码图谱生成算法,结合实体类型定义及实体间关系定义,抽取生成源代码图谱,存入图数据库;
S24、利用漏洞代码子图生成算法,从上一步骤生成的源代码图谱中抽取生成漏洞代码子图。
进一步的,步骤S24的漏洞代码子图生成算法如下:
记漏洞代码子图
Figure 67867DEST_PATH_IMAGE001
,其中
Figure 657112DEST_PATH_IMAGE002
Figure 905690DEST_PATH_IMAGE003
代表漏洞代码子图的数量,
Figure 769741DEST_PATH_IMAGE004
,代表漏洞代码子图中节点的集合,
Figure 318534DEST_PATH_IMAGE005
,代表漏洞代码子图中边的集合;路径
Figure 609838DEST_PATH_IMAGE006
,其中
Figure 548976DEST_PATH_IMAGE007
Figure 216717DEST_PATH_IMAGE008
代表路径的数量;
S241、根据不同漏洞代码的符号特征,找到漏洞代码定义、赋值、声明节点n i,j ,把n i,j 加入到N i 中;
S242、查询源代码图谱中从文件节点到N i 中每个节点的路径P j ,得到路径上的所有节点N j ,如果n j,k 不存在于N i 中,就把n j,k 加入到N i 中,同时保留他们之间的关系;
S243、查询源代码图谱中所有与N i 中每个节点有数据依赖和控制依赖的节点n,如果n不存在于N i 中,也把n加入到N i 中;
S244、给N i 中所有的节点n i,j 添加标签,所有带标签的节点组成漏洞代码子图。
进一步的,步骤S3中,基于获取到的代码文档、issue、补丁方案数据,利用自然语言处理技术,得到文档、issue、补丁方案中的实体、关系信息,具体是:在构建代码图谱的过程中,记录代码实体的名字,根据得到的实体名字,训练实体识别模型,从而得到代码文档、issue、补丁方案中的实体;结合上下文信息,最终得到实体间的关系名字;对于得到的实体,添加属性信息,用于保存所有的文字信息,为以后的代码漏洞检测和代码优化提供支撑。
进一步的,步骤S4具体的融合策略为:对于名字相同的两个实体,将两个实体的关系同步到一个实体,同时保留两个实体的属性信息,融合结束以后删除冗余节点。
进一步的,步骤S5构造标注数据集
Figure 354438DEST_PATH_IMAGE009
,其中
Figure 76363DEST_PATH_IMAGE010
,表示数据集中的第i条数据,共
Figure 299534DEST_PATH_IMAGE011
条标注数据;
Figure 708649DEST_PATH_IMAGE012
表示第i个漏洞代码子图,
Figure 700876DEST_PATH_IMAGE013
,n代表漏洞的种类数量,
Figure 599562DEST_PATH_IMAGE014
,表示第i个漏洞代码子图的漏洞标签,
Figure 575608DEST_PATH_IMAGE015
当且仅当G i 包含第j种漏洞;
Figure 319573DEST_PATH_IMAGE016
,其中
Figure 635148DEST_PATH_IMAGE017
,表示第i个漏洞代码图谱中的第j个节点,
Figure 439156DEST_PATH_IMAGE018
表示第i个漏洞代码图谱共有
Figure 636919DEST_PATH_IMAGE018
个节点;
Figure 450155DEST_PATH_IMAGE019
,其中
Figure 885815DEST_PATH_IMAGE020
,表示第i个漏洞代码图谱中的第j条边,
Figure 126304DEST_PATH_IMAGE021
表示第i个漏洞代码图谱共有
Figure 14625DEST_PATH_IMAGE021
条边。
然后,本发明提供一种基于知识图谱的代码漏洞检测方法,数据输入是经过如前所述的基于知识图谱的漏洞代码图谱构建方法处理好的标注数据集D,通过引入代码相关的特征,对漏洞代码子图进行分类,包括以下步骤:
S6、获取节点特征:利用神经网络模型分别提取节点包含的属性值的特征,然后对节点的不同属性特征进行加和,得到节点特征,最后经过变换函数,把所有节点特征变换到同一纬度的同一特征空间中,得到最终的节点特征;漏洞代码图谱的节点特征
Figure 569234DEST_PATH_IMAGE022
,其中
Figure 656139DEST_PATH_IMAGE023
Figure 270791DEST_PATH_IMAGE024
Figure 443147DEST_PATH_IMAGE025
表示表示漏洞代码图谱中每一个节点的节点特征,所有节点特征组成了漏洞代码图谱的节点特征,可由下式得到:
Figure 535867DEST_PATH_IMAGE026
经过变换函数f以后,得到的最终的节点特征向量
Figure 946120DEST_PATH_IMAGE027
可由下式子得到:
Figure 793990DEST_PATH_IMAGE028
S7、获取节点代码文本特征:代码是以源代码文本的形式保存在节点中,使用文本向量模型得到代码文本特征,具体的节点代码文本特征
Figure 188063DEST_PATH_IMAGE029
,其中
Figure 350054DEST_PATH_IMAGE030
Figure 77795DEST_PATH_IMAGE031
,更新节点特征向量
Figure 830988DEST_PATH_IMAGE032
,更新后得到的节点特征向量
Figure 977935DEST_PATH_IMAGE033
为:
Figure 678038DEST_PATH_IMAGE034
S8、获取节点度特征:节点的入度特征
Figure 328462DEST_PATH_IMAGE035
,出度特征
Figure 455818DEST_PATH_IMAGE036
,其中
Figure 824483DEST_PATH_IMAGE037
Figure 859435DEST_PATH_IMAGE038
表示第i个代码图谱的第j个节点的入度特征,
Figure 98786DEST_PATH_IMAGE039
Figure 928202DEST_PATH_IMAGE040
表示第i个代码图谱的第j个节点的出度特征,
Figure 49742DEST_PATH_IMAGE041
;引入节点的入度特征和出度特征,更新节点特征向量
Figure 91647DEST_PATH_IMAGE042
,更新后得到的节点特征向量
Figure 716663DEST_PATH_IMAGE043
为:
Figure 982560DEST_PATH_IMAGE044
S9、获取节点位置特征:构建的代码图谱中,节点作为代码的信息表示,包含了当前节点代表的代码在整个代码文件中的位置信息,包括行号和列号,按照行号由小到大对节点进行排序,提取节点位置特征
Figure 529079DEST_PATH_IMAGE045
S10、获取节点空间特征:引入函数
Figure 374675DEST_PATH_IMAGE046
用于衡量漏洞代码子图G i 中节点n i,j n i,k 之间的空间关系,具体的:
Figure 854198DEST_PATH_IMAGE047
其中,
Figure 556574DEST_PATH_IMAGE048
表示节点n i,j n i,k 之间有通路,
Figure 324810DEST_PATH_IMAGE049
表示节点n i,j n i,k 之间无通路,
Figure 505256DEST_PATH_IMAGE050
表示节点n i,j n i,k 之间的最短路径;为了引入节点空间特征,从
Figure 308127DEST_PATH_IMAGE051
中学习得到标量
Figure 915826DEST_PATH_IMAGE052
,则节点空间特征
Figure 233675DEST_PATH_IMAGE053
,在所有层内共享;
S11、获取边特征:为了提取边的特征,对于每一个有序节点对
Figure 149635DEST_PATH_IMAGE054
,首先找到n i,j n i,k 之间的最短路径:
Figure 869329DEST_PATH_IMAGE055
,其中t表示路径
Figure 851192DEST_PATH_IMAGE056
中包含t条边,
Figure 390757DEST_PATH_IMAGE057
,则漏洞代码子图G i 的边特征
Figure 178585DEST_PATH_IMAGE058
,其中
Figure 690469DEST_PATH_IMAGE059
m i 表示漏洞代码子图G i m i 个节点,具体的:
Figure 639970DEST_PATH_IMAGE060
其中w l 是第l个边的权重,t l 是第l个边的类型值;
S12、利用步骤S6- 步骤S11获得的六种特征计算得到图向量表示;
S13、得到图向量以后,将其输入到分类模型中对模型进行训练,根据标签信息对分类模型进行优化,最终得到代码漏洞检测模型,用于后续的代码漏洞检测;
S14、对于新的漏洞代码图谱,得到它们的图向量表示,然后送入分类模型,即可给出检测结果。
与现有技术相比,本发明优点在于:
本发明首先生成源代码的代码图谱,然后基于漏洞模式、数据依赖、控制依赖,从源代码漏洞图谱中提取漏洞代码子图,然后利用词向量模型生成漏洞代码的向量表示,最后利用深度学习模型对漏洞特征自动进行提取,生成漏洞代码检测模型,能够对漏洞代码进行多分类漏洞检测;本发明的方法适用于所有的高级编程语言。
本发明从代码图谱中提取漏洞代码子图的时候考虑到了前向数据依赖、后向数据依赖前向控制依赖和后向控制依赖,能够尽可能保留足够多的语法和语义信息,定义的实体类型和实体间关系类型较为完备,生成的代码图谱具有很好的准确性。
本发明在构建漏洞代码图谱内容方面,不仅仅考虑的源代码中的信息,而且融合了代码文档、issue以及补丁方案等信息,为后续的代码漏洞检测以及代码优化提供支撑。
本发明在构建漏洞代码图谱方式方面,本发明针对源代码的处理,首先是生成代码图谱,然后结合了传统的模式匹配的方式,为代码图谱中的实体打上对应的漏洞标签,避免重复生成冗余节点,能够在提升漏洞代码图谱构建效率的同时,保证准确率。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为漏洞代码图谱构建流程图;
图2为代码漏洞检测模型训练图;
图3为代码漏洞检测流程图;
图4为代码图谱及漏洞代码子图;
图5为代码漏洞检测模型架构图。
具体实施方式
下面结合附图及具体实施例对本发明作进一步的说明。
本发明主要针对软件开发过程中的代码安全性问题,提出了一种基于知识图谱的代码漏洞检测方法,主要包括两部分工作,漏洞代码图谱构建及代码漏洞检测,下面逐一进行介绍。
实施例1
结合图1所示,本实施例介绍基于知识图谱的漏洞代码图谱构建方法,包括以下步骤:
S1、获取漏洞代码相关信息:
采用分布式增量爬虫框架(采用分布式增量爬虫框架获取漏洞相关信息,获取到的信息有助于提高漏洞代码图谱的信息丰富程度,帮助代码漏洞检测模型更好的提取漏洞特征,提高模型的准确性),从国家安全漏洞库、软件保障参考数据集及Github中,针对不同的高级编程语言,分别获取漏洞代码相关信息。获取的漏洞代码相关信息包括漏洞源代码文件、漏洞发布日期、漏洞补丁方案、漏洞所处的代码仓库地址、代码仓库提交日志、代码仓库issue等信息。将获取到的漏洞代码相关存储到本地漏洞代码数据仓库中。获取的漏洞代码相关信息具有很重要的作用,如漏洞源代码文件是本发明构建漏洞代码图谱的基础;漏洞补丁方案可以帮助修复漏洞;漏洞代码仓库提交日志结合漏洞发布日期可以定位漏洞出现的原因;代码仓库issue包含了提问用户和漏洞所处的代码仓库之间的关联关系。
S2、对漏洞源代码文件的处理:
将漏洞源代码文件处理成抽象语法树,利用抽象语法树的深度遍历算法,从抽象语法树中提取实体、关系信息,构建源代码图谱,进而抽取生成漏洞代码子图。
具体步骤如下:
S21、处理漏洞源代码文件,提取源代码文件的抽象语法树;
S22、实体类型定义及实体间关系定义:结合源代码文件的抽象语法树信息,定义构建源代码知识图谱必备的实体类型信息和实体间关系信息。
总共提出了28种代码实体定义及16种实体间关系定义,所提出的定义不仅能够从代码语句层面完整的表示出代码的结构信息,还包含了代码的逻辑调用关系信息。
28种实体类型:File(源代码文件),Decl(声明),Method(方法),Param(方法的参数),Func_Call(方法调用),Struct(方法中的结构体),For(方法中的For循环),For_Init(For循环变量的初始值),For_Cond(For循环的循环条件),For_Next(For循环满足条件以后的操作),While(While循环),While_Cond(While循环的条件),DoWhile(DoWhile循环),DoWhile_Cond(DoWhile循环的条件),Switch(Switch分支),Switch_Cond(Switch分支的条件),Case(Switch分支中的Case),Default(Switch分支中的Default),If(If分支),If_Cond(If分支的条件),If_True(If分支判断为True的操作),If_Fasle(If分支判断为False的操作),Label(Goto的标记),Goto(Goto跳转),UnaryOp(一元运算),BinaryOp(二元运算),Assignment(赋值),Return(返回值)。每个实体类型又包含8种属性:id(实体序号)、loc(实体在源代码文件中的位置,包括行号和列号)、code(实体的源代码文本)、func(实体所属于的方法名)、indegree(图谱中节点的入度)、outdegree(图谱中节点的出度)、type(节点类型)、name(节点名字)。
16种实体间关系类型:has_method(源代码中包含Method),has_compound(实体包含关系),has_param(Method包含Param),for_condition(For循环条件),for_init(For循环的条件初始化),for_next(For循环满足条件后),if_condition(If分支条件),if_true(If分支满足条件后),if_false(If分支不满足条件后),while_condition(While循环条件),call_function(函数调用关系),dowhile_cond(DoWhile分支条件),switch_cond(Switch分支条件),control_dependence(控制依赖关系),data_dependence(数据依赖关系),invoke(库函数/API调用关系)。每个实体间关系类型又包含3种属性:id(关系序号)、type(关系类型)、weight(权重)。
S23、遍历抽象语法树生成源代码图谱:利用代码图谱生成算法,结合实体类型定义及实体间关系定义,抽取生成源代码图谱,存入图数据库。
代码图谱生成算法如算法1所示,重点关注源代码文件及其内部组成部分之间的关系,具体的过程描述如下:
(1)读取源代码文件,利用工具生成源代码抽象语法树;
(2)创建File节点,并添加到图谱中;
(3)遍历抽象语法树,根据抽象语法树的节点类型进行不同的操作。如果是方法类型,创建Method节点,并在File节点和Method节点之间创建一条从File指向Method的关系,关系名为has_method;如果方法体不为空,调用算法2 resolve_compound,详细解析方法体内部的实体和实体关系;如果是生命类型,创建Decl节点,并在File节点和Decl节点之间创建一条从File指向Decl的关系,关系名为has_decl;如果是类型定义类型,创建Typedef节点,并在File节点和Typedef节点之间创建一条从File指向Typedef的关系,关系名为has_typedef;如果是Pragma类型,创建Pragma节点,并在File节点和Pragma节点之间创建一条从File指向Pragma的关系,关系名为has_pragma。
解析实体关系的算法如算法2所示,重点关注方法体内部的关系,包括循环体,分支体,同时提取数据依赖和控制依赖关系,具体的过程描述如下:
(1)判断输入节点source是不是Compound类型,如果不是,程序返回。
(2)获取方法名字,用于添加到节点的属性信息中去。
(3)遍历输入节点,根据不同的类型进行不同的操作。如果是FuncCall类型,创建FuncCall节点,并创建从source节点指向FuncCall节点的call_function关系。如果是While节点,创建While节点和While_Cond节点,并创建从source节点指向While节点的has_compound关系,创建从While节点指向While_Cond节点的while_cond关系,同时根据while条件创建数据依赖和控制依赖关系,如果存在循环体,递归调用算法2。如果是DoWhile节点,创建DoWhile节点和DoWhile_Cond节点,并创建从source节点指向DoWhile节点的has_compound关系,创建从DoWhile节点指向DoWhile_Cond节点的dowhile_cond关系,同时根据dowhile条件创建数据依赖和控制依赖关系,如果存在循环体,递归调用算法2。如果是For节点,创建For节点、For_Init节点、For_Cond节点、For_Next节点,并创建从source节点指向For节点的has_compound关系,从For节点指向For_Init节点的for_init关系,从For节点指向For_Cond节点的for_cond关系,从For节点指向For_Next节点的for_next关系,同时根据for循环条件,创建数据依赖和控制依赖关系,如果存在循环体,递归调用算法2。如果是If节点,创建If节点、If_Cond节点、If_True节点、If_False节点,并创建从source节点指向If节点的has_compound关系,从If节点指向If_Cond节点的if_cond关系,从If节点指向If_True节点的if_true关系,从If节点指向If_False节点的if_false关系,同时根据if条件创建数据依赖和控制依赖关系。如果存在if_true和if_false代码块,递归调用算法2。如果是Switch节点,创建Switch节点、Switch_Cond节点,并创建从source节点指向Switch节点的has_compound关系,从Switch节点指向Switch_Cond节点的switch_cond关系,同时根据switch条件创建数据依赖和控制依赖关系。如果存在case代码块,递归调用算法2。如果是Decl类型,创建Decl节点,并创建source节点指向Decl节点的has_compound关系,如果声明有初始值,创建数据依赖关系。如果是赋值语句,创建Assignment节点,创建从source节点指向Assignment节点的has_compound关系,并根据赋值语句创建控制依赖关系。如果是Return类型,创建Return节点,并创建从source指向Return节点的has_compound关系。
算法1 代码图谱生成算法
Algorithm1:ast_parser
Input:source code files
Output:Nodes、Relationships
1. f = read source code files
2. ast = pycparser.get_ast(f)
3. create File
4. for i in range(ast.ext.length)
5. type = type(ast.ext[i])
6. if(type is Method)
7. add Method & create R<File, has_method, Method>
8. if(method.body)
9. resolve_compound(method.body)
10. if(type is Decl)
11. add Decl & create R<File, has_decl, Decl>
12. if(type is Typedef)
13. add Typedef & create R<File, has_typedef, Typedef>
14. if(type is Pragma)
15. add Pragma & create R<File, has_pragma, Pragma>
16. end for
算法2 解析实体间关系算法
Algorithm2:resolve_compound
Input:node
Output:Nodes、Relationships
1. if node is not instance of Compound
2. return
3. funcname = get_func_name()
4. while(node.length>0)
5. type = type(node)
6. if(type is FuncCall)
7. add FuncCall & create R<Mehod, call_function, FuncCall>
8. if(type is While)
9. add While & create R<Method, has_compound, While>
10. add While_Cond & create R<While, while_cond, While_Cond>
11. handle_cond_and_init(while_cond,While,‘control_denpence’,funcname)
12. if(while.stmt)
13. resolve_compound(while.stmt)
14. if(type is DoWhile)
15. add DoWhile & create R<Method, has_compound, DoWhile>
16. add DoWhile_Cond & create R<DoWhile, cond, DoWhile_Cond>
17. handle_cond_and_init(dowhile_cond,DoWhile,’control_denpendence’,funcname)
18. if(dowhile.stmt)
19. resolve_compound(dowhile.stmt)
20. if(type is For)
21. add For & create R<Method, has_compound, For>
22. add For_Init & create R<For, for_init, For_Init>
23. add For_Cond & create R<For, for_cond, For_Cond >
24. handle_cond_and_init(for_cond,For,’control_denpendence’,funcname)
25. add For_Next & create R<For, for_next, For_Next>
26. if(for.stmt)
27. resolve_compound(for.stmt)
28. if(type is If)
29. add If & create R<Method, has_compound, If>
30. add If_Cond & create R<If, if_cond, If_Cond>
31. handle_cond_and_init(if_cond,If,’control_dependence’,funcname)
32. if(if.true)
33. add If_True & create R<If, if_true, If_True>
34. resolve_compound(if.true)
35. if(if.false)
36. add If_False & R<If, if_false, If_False>
37. resolve_compound(if.false)
38. if(type is Switch)
39. add Switch & R<Method, has_compound, Switch>
40. add Switch_Cond & create R<Switch, switch_cond, Switch_Cond>
41. handle_cond_and_init(switch_cond,Switch,’control_denpendence’,funcname)
42. if(switch.stmt)
43. resolve_compound(switch.stmt)
44. if(type is Decl)
45. add Decl & create R<Method, has_compound, Decl>
46. if(decl.init)
47. handle_decl_and_assignment_init(decl.init,Decl,’data_dependence’)
48. if(type is Assignment)
49. add Assignment & create R<Method, has_compound, Assignment>
50. handle_decl_and_assignment_init(assignment,Assignment,’data_dependence’)
51. if(type is Return)
52. add Return & create R<Method, has_compound, Return>
53. end while
S24、利用漏洞代码子图生成算法,从上一步骤生成的源代码图谱中抽取生成漏洞代码子图。
记漏洞代码子图
Figure 870094DEST_PATH_IMAGE001
,其中
Figure 196033DEST_PATH_IMAGE002
Figure 624741DEST_PATH_IMAGE003
代表漏洞代码子图的数量,
Figure 948406DEST_PATH_IMAGE004
,代表漏洞代码子图中节点的集合,
Figure 728143DEST_PATH_IMAGE005
,代表漏洞代码子图中边的集合;路径
Figure 795456DEST_PATH_IMAGE006
,其中
Figure 78670DEST_PATH_IMAGE007
Figure 635553DEST_PATH_IMAGE008
代表路径的数量。
漏洞代码子图生成算法如下:
S241、根据不同漏洞代码的符号特征,找到漏洞代码定义、赋值、声明节点n i,j ,把n i,j 加入到N i 中;
S242、查询源代码图谱中从文件节点到N i 中每个节点的路径P j ,得到路径上的所有节点N j ,如果n j,k 不存在于N i 中,就把n j,k 加入到N i 中,同时保留他们之间的关系;
S243、查询源代码图谱中所有与N i 中每个节点有数据依赖和控制依赖的节点n,如果n不存在于N i 中,也把n加入到N i 中;
S244、给N i 中所有的节点n i,j 添加标签,所有带标签的节点组成漏洞代码子图。
漏洞代码子图生成算法generate如算法3所示。
算法3 漏洞代码子图生成算法
Algorithm3:generate
Input:code graph、tokens
Output:nodes_list
1. node_list = [ ]
2. nodes = get_nodes_by_tokens
3. for i in range(nodes.length)
4. path = get_path(File, nodes[i])
5. path_nodes = path.nodes
6. for j in range(path_nodes.length)
7. if(path_nodes[j] not in node_list)
8. node_list.append(path_nodes[j])
9. for i in range(nodes.length)
10. nodes = get_nodes(nodes[i])
11. for j in range(nodes.length)
12. if(nodes[j] not in node_list)
13. node_list.append(nodes[j])
14. end for
15. return node_list
代码图谱及漏洞代码子图如图4所示,其中双线圈节点构成的图代表漏洞代码子图。图中每个双线圈为漏洞代码图谱节点、每个单线圈为代码图谱节点、节点之间的边表示节点间关系,关系旁边的英文表示不同的关系名称,详细的关系释义参照步骤S22定义的代码实体定义及实体间关系定义。具体的,has_method表示源代码中包含方法,has_compound表示实体包含关系,if_cond表示If分支的条件,if_true表示If分支满足条件,data_dependenceb表示数据依赖关系,control_dependence表示控制依赖关系。
S3、对代码文档、issue、补丁方案等漏洞代码相关文字信息的处理:
基于获取到的漏洞代码相关信息数据(代码文档、issue、补丁方案等数据),利用自然语言处理技术,从代码文档、issue、补丁方案中提取出与代码相关的实体节点和实体间关系信息,保存记录到数据库中。具体的方案是:在构建代码图谱的过程中,记录代码实体的名字,根据得到的实体名字,训练实体识别模型,从而得到代码文档、issue、补丁方案中的实体;结合上下文信息,最终得到实体间的关系名字;对于得到的实体,添加属性信息,用于保存所有的文字信息,为以后的代码漏洞检测和代码优化提供支撑。
S4、对前两部分的到的实体和关系进行实体关系融合:
通过步骤S1可以得到源代码实体关系,通过步骤S2得到文档实体关系,将两者进行实体关系融合,整合源代码和文档中的信息;具体的融合策略为:对于名字相同的两个实体,将两个实体的关系同步到一个实体,同时保留两个实体的属性信息,融合结束以后删除冗余节点。
S5、构造标注数据集D:
得到漏洞代码子图以后,将漏洞代码子图和爬取的数据进行对齐,对每一个漏洞代码子图进行人工标注,对于有漏洞的代码子图标注上对应的漏洞类型,没有漏洞的代码子图标注0。具体的,对于标注数据集
Figure 574690DEST_PATH_IMAGE009
,其中
Figure 508011DEST_PATH_IMAGE010
,表示数据集中的第i条数据,共
Figure 583415DEST_PATH_IMAGE011
条标注数据;
Figure 576779DEST_PATH_IMAGE012
表示第i个漏洞代码子图,
Figure 3212DEST_PATH_IMAGE013
,n代表漏洞的种类数量,
Figure 209065DEST_PATH_IMAGE014
,表示第i个漏洞代码子图的漏洞标签,
Figure 466871DEST_PATH_IMAGE015
当且仅当G i 包含第j种漏洞;
Figure 851977DEST_PATH_IMAGE016
,其中
Figure 296865DEST_PATH_IMAGE017
,表示第i个漏洞代码图谱中的第j个节点,
Figure 509671DEST_PATH_IMAGE018
表示第i个漏洞代码图谱共有
Figure 887563DEST_PATH_IMAGE018
个节点;
Figure 894833DEST_PATH_IMAGE019
,其中
Figure 358176DEST_PATH_IMAGE020
,表示第i个漏洞代码图谱中的第j条边,
Figure 109094DEST_PATH_IMAGE021
表示第i个漏洞代码图谱共有
Figure 75913DEST_PATH_IMAGE021
条边。
本发明在构建漏洞代码图谱内容方面,不仅仅考虑了源代码中的信息,而且融合了代码文档、issue以及补丁方案等信息,为后续的代码漏洞检测以及代码优化提供支撑。
在构建漏洞代码图谱方式方面,本发明针对源代码的处理,首先是生成代码图谱,然后结合了传统的模式匹配的方式,为代码图谱中的实体打上对应的漏洞标签,避免重复生成冗余节点,能够在提升漏洞代码图谱构建效率的同时,保证准确率。
实施例2
本实施例介绍基于知识图谱的代码漏洞检测方法,数据输入是经过实施例1的方法处理好的标注数据集
Figure 519664DEST_PATH_IMAGE009
,其中
Figure 204723DEST_PATH_IMAGE010
,表示数据集中的第i条数据,共
Figure 431436DEST_PATH_IMAGE011
条标注数据;
Figure 518341DEST_PATH_IMAGE012
表示第i个漏洞代码子图,
Figure 132993DEST_PATH_IMAGE013
,n代表漏洞的种类数量,
Figure 305348DEST_PATH_IMAGE014
,表示第i个漏洞代码子图的漏洞标签,
Figure 398069DEST_PATH_IMAGE015
当且仅当G i 包含第j种漏洞。
Figure 605060DEST_PATH_IMAGE016
,其中
Figure 125034DEST_PATH_IMAGE017
,表示第i个漏洞代码图谱中的第j个节点,
Figure 784685DEST_PATH_IMAGE018
表示第i个漏洞代码图谱共有
Figure 681097DEST_PATH_IMAGE061
个节点;
Figure 477015DEST_PATH_IMAGE019
,其中
Figure 489927DEST_PATH_IMAGE020
,表示第i个漏洞代码图谱中的第j条边,
Figure 840137DEST_PATH_IMAGE021
表示第i个漏洞代码图谱共有
Figure 71398DEST_PATH_IMAGE021
条边。通过引入代码相关的特征,对漏洞代码子图进行分类。图2 表示了代码漏洞检测模型训练过程,通过图1所示步骤得到了漏洞代码子图,在进行代码漏洞检测模型的训练之前,由于漏洞代码子图的规模大小并不统一,不便训练,因此首先进行对漏洞代码子图进行数据预处理操作,数据预处理的目的是为了使漏洞代码子图的规模大小一致。(数据预处理的策略为:首先获得所有漏洞代码子图的规模分布,提取规模分布最大的那个规模数当作数据预处理以后的漏洞代码子图规模,记为M。对于漏洞代码子图的规模小于M的,对其进行节点填充,使其规模等于M,填充的节点的属性为空;对于漏洞代码子图的规模大于M的,对其进行拆分,使拆分后的漏洞代码子图的规模等于M)。
经过数据预处理以后,对漏洞代码子图提取特征,包括节点特征、节点度特征、代码特征、边特征、空间特征以及位置特征;然后结合深度学习模型,得到漏洞代码图谱的向量表示;最后送入分类模型进行训练,根据标签信息对分类模型优化,得到代码漏洞检测模型。该模型用于后续的代码漏洞检测。
图3代表了代码漏洞检测过程,对于待检测的源代码文件,首先生成源代码图谱,然后从中提取出所有可能包含漏洞的漏洞代码子图,即候选漏洞代码图谱,然后利用图2所示步骤得到的代码漏洞检测模型对候选漏洞代码图谱进行漏洞检测,得到检测结果,检测结果包括漏洞类型、漏洞代码位置、漏洞代码子图。
下面结合图2和图3,详细介绍代码漏洞检测方法的流程,包括以下步骤:
S6、获取节点特征:节点特征作为整个模型训练的基础,需要尽可能表达出节点所有的信息。利用任意的神经网络模型分别提取节点包含的属性值的特征,然后对节点的不同属性特征进行加和,得到节点特征,最后经过变换函数,把所有节点特征变换到同一纬度的同一特征空间中,得到最终的节点特征。
具体的,节点n i 的属性特征
Figure 190664DEST_PATH_IMAGE062
,其中
Figure 318020DEST_PATH_IMAGE063
u表示节点属性的个数,
Figure 686684DEST_PATH_IMAGE064
是通过任意神经网络模型得到的节点的属性特征向量。漏洞代码图谱的节点特征
Figure 987216DEST_PATH_IMAGE065
,其中
Figure 695409DEST_PATH_IMAGE023
Figure 55983DEST_PATH_IMAGE024
Figure 115206DEST_PATH_IMAGE025
表示漏洞代码图谱中每一个节点的节点特征,所有节点特征组成了漏洞代码图谱的节点特征,可由下式得到:
Figure 953849DEST_PATH_IMAGE066
经过变换函数f以后,得到的最终的节点特征向量
Figure 578865DEST_PATH_IMAGE027
可由下式子得到:
Figure 313603DEST_PATH_IMAGE067
变换函数f可以使用任何的变换函数,如下式,其中W f 是需要学习的权重参数。
Figure 594543DEST_PATH_IMAGE068
S7、获取节点代码文本特征:代码是以源代码文本的形式保存在节点中,使用文本向量模型得到代码文本特征,具体的节点代码文本特征
Figure 236876DEST_PATH_IMAGE069
,其中
Figure 185241DEST_PATH_IMAGE030
Figure 622038DEST_PATH_IMAGE031
,更新节点特征向量
Figure 452591DEST_PATH_IMAGE032
,更新后得到的节点特征向量
Figure 570720DEST_PATH_IMAGE033
为:
Figure 170329DEST_PATH_IMAGE070
S8、 获取节点度特征:代码图谱中是一个有向图,图中的每一个节点都有它的出度outdegree和入度indegree,通常认为度越大的节点在图谱中越重要。节点的入度特征
Figure 43607DEST_PATH_IMAGE035
,出度特征
Figure 299139DEST_PATH_IMAGE036
,其中
Figure 277416DEST_PATH_IMAGE037
Figure 934793DEST_PATH_IMAGE038
表示第i个代码图谱的第j个节点的入度特征,
Figure 978973DEST_PATH_IMAGE039
Figure 518538DEST_PATH_IMAGE040
表示第i个代码图谱的第j个节点的出度特征,
Figure 244049DEST_PATH_IMAGE041
;引入节点的入度特征和出度特征,更新节点特征向量
Figure 818250DEST_PATH_IMAGE042
,更新后得到的节点特征向量
Figure 971013DEST_PATH_IMAGE043
为:
Figure 732296DEST_PATH_IMAGE044
S9、获取节点位置特征:构建的代码图谱中,节点作为代码的信息表示,包含了当前节点代表的代码在整个代码文件中的位置信息,包括行号和列号,按照行号由小到大对节点进行排序,提取节点位置特征
Figure 527077DEST_PATH_IMAGE045
S10、获取节点空间特征:对于代码图谱这种图结构来说,节点之间通过边连接,为了提取代码图谱中的空间信息,引入函数
Figure 690205DEST_PATH_IMAGE046
用于衡量漏洞代码子图G i 中节点n i,j n i,k 之间的空间关系,具体的:
Figure 76187DEST_PATH_IMAGE071
其中,
Figure 793607DEST_PATH_IMAGE048
表示节点n i,j n i,k 之间有通路,
Figure 923237DEST_PATH_IMAGE049
表示节点n i,j n i,k 之间无通路,
Figure 940872DEST_PATH_IMAGE072
表示节点n i,j n i,k 之间的最短路径;为了引入节点空间特征,从
Figure 701017DEST_PATH_IMAGE051
中学习得到标量
Figure 702471DEST_PATH_IMAGE052
,则节点空间特征
Figure 307896DEST_PATH_IMAGE073
,在所有层内共享;
S11、获取边特征:代码图谱中不仅包含了节点信息,还包含了节点之间的关系信息,这些信息存储在图中的边上,这些边都有不同的类型t i ,不同类型又有不同的权重w i 。为了提取边的特征,对于每一个有序节点对
Figure 711196DEST_PATH_IMAGE054
,首先找到n i,j n i,k 之间的最短路径:
Figure 642243DEST_PATH_IMAGE074
,其中t表示路径
Figure 599834DEST_PATH_IMAGE056
中包含t条边,
Figure 540108DEST_PATH_IMAGE057
,则漏洞代码子图G i 的边特征
Figure 532335DEST_PATH_IMAGE058
,其中
Figure 165442DEST_PATH_IMAGE059
m i 表示漏洞代码子图G i m i 个节点,具体的:
Figure 338891DEST_PATH_IMAGE075
其中w l 是第l个边的权重,t l 是第l个边的类型值;
S12、利用上述步骤S6- 步骤S11获得的特征计算得到图向量表示;
模型的输入是代码图谱的节点特征
Figure 614015DEST_PATH_IMAGE076
,其中
Figure 460748DEST_PATH_IMAGE077
d是隐藏层的维度,
Figure 733597DEST_PATH_IMAGE078
,是在位置i的隐层表示。输入
Figure 931361DEST_PATH_IMAGE079
,并通过三个矩阵
Figure 947858DEST_PATH_IMAGE080
Figure 383519DEST_PATH_IMAGE081
Figure 358428DEST_PATH_IMAGE082
,来转换到对应的表示Q,K,V。即:
Figure 309066DEST_PATH_IMAGE083
那么对于每一个代码图谱,模型的输出
Figure 863676DEST_PATH_IMAGE084
为:
Figure 96391DEST_PATH_IMAGE086
其中READOUT函数用于把图中的所有节点特征向量整合成一个图向量。
S13、得到图向量以后,将其输入到分类模型中对模型进行训练,根据标签信息对分类模型进行优化,最终得到代码漏洞检测模型,用于后续的代码漏洞检测;
S14、对于新的漏洞代码图谱,得到它们的图向量表示,然后送入分类模型,即可给出检测结果。
本实施例涉及的基于知识图谱的代码漏洞检测模型架构如图5所示,通过引入代码相关的特征:代码文本特征(code encoding)、代码节点位置特征(position encoding)、代码节点度特征(degree encoding),对漏洞代码子图进行分类,提高代码漏洞检测准确率。图5中,n1,n2,n3,n4,n5表示5个代码图谱节点,右侧的V、K、Q是三个变量,右侧的Linear表示数学运算中的线性运算,MatMul表示数学运算中的点乘,Scale表示数学运算中的放缩操作,SoftMax也是一种数学运算。
综上所述,本发明从代码的表现方式入手,提出构建代码知识图谱来对代码进行中间表示,为了用于代码漏洞检测,从代码知识图谱中提取出漏洞代码子图,以图谱的方式对漏洞代码进行表示,直观的显示出程序中与漏洞相关的代码之间的依赖关系。为了自动获取漏洞特征,深度学习模型对漏洞进行多分类,提出的方法同时适用于各类高级编程语言。
本发明首先生成源代码的代码图谱,然后基于漏洞模式、数据依赖、控制依赖,从源代码漏洞图谱中提取漏洞代码子图,得到标注数据集,然后从漏洞代码子图中提取六种特征,整合得到漏洞代码子图的向量表示,最后将漏洞代码子图的向量表示输入到分类模型进行训练,利用标签信息对分类模型进行优化,生成漏洞代码检测模型。漏洞代码检测模型能够对漏洞代码进行多分类漏洞检测,保证在软件开发过程中代码的安全性。
当然,上述说明并非是对本发明的限制,本发明也并不限于上述举例,本技术领域的普通技术人员,在本发明的实质范围内,做出的变化、改型、添加或替换,都应属于本发明的保护范围。

Claims (4)

1.基于知识图谱的漏洞代码图谱构建方法,其特征在于,包括以下步骤:
S1、获取漏洞代码相关信息:包括漏洞源代码文件、漏洞发布日期、漏洞补丁方案、漏洞所处的代码仓库地址、代码仓库提交日志、代码仓库issue信息;
S2、对漏洞源代码文件的处理:将漏洞源代码文件处理成抽象语法树,利用抽象语法树的深度遍历算法,从抽象语法树中提取实体、关系信息,构建源代码图谱,进而抽取生成漏洞代码子图;步骤S2的具体步骤如下:
S21、处理漏洞源代码文件,提取源代码文件的抽象语法树;
S22、实体类型定义及实体间关系定义:结合源代码文件的抽象语法树信息,定义构建源代码知识图谱必备的实体类型信息和实体间关系信息;
S23、遍历抽象语法树生成源代码图谱:利用代码图谱生成算法,结合实体类型定义及实体间关系定义,抽取生成源代码图谱,存入图数据库;
S24、利用漏洞代码子图生成算法,从上一步骤生成的源代码图谱中抽取生成漏洞代码子图;漏洞代码子图生成算法如下:
记漏洞代码子图
Figure DEST_PATH_IMAGE001
,其中
Figure DEST_PATH_IMAGE002
Figure DEST_PATH_IMAGE003
代表漏洞代码子图的数量,
Figure DEST_PATH_IMAGE004
,代表漏洞代码子图中节点的集合,
Figure DEST_PATH_IMAGE005
,代表漏洞代码子图中边的集合;路径
Figure DEST_PATH_IMAGE006
,其中
Figure DEST_PATH_IMAGE007
Figure DEST_PATH_IMAGE008
代表路径的数量;
S241、根据不同漏洞代码的符号特征,找到漏洞代码定义、赋值、声明节点n i,j ,把n i,j 加入到N i 中;
S242、查询源代码图谱中从文件节点到N i 中每个节点的路径P j ,得到路径上的所有节点N j ,如果n j,k 不存在于N i 中,就把n j,k 加入到N i 中,同时保留他们之间的关系;
S243、查询源代码图谱中所有与N i 中每个节点有数据依赖和控制依赖的节点n,如果n不存在于N i 中,也把n加入到N i 中;
S244、给N i 中所有的节点n i,j 添加标签,所有带标签的节点组成漏洞代码子图;
S3、对漏洞代码相关文字信息的处理:基于获取到的漏洞代码相关信息数据,利用自然语言处理技术,从代码文档、issue、补丁方案中提取出与代码相关的实体节点和实体间关系信息,保存记录到数据库中;
S4、对前两部分的到的实体和关系进行实体关系融合:通过步骤S1可以得到源代码实体关系,通过步骤S2得到文档实体关系,将两者进行实体关系融合,整合源代码和文档中的信息;
S5、构造标注数据集D:得到漏洞代码子图以后,将漏洞代码子图和爬取的数据进行对齐,对每一个漏洞代码子图进行人工标注,对于有漏洞的代码子图标注上对应的漏洞类型,没有漏洞的代码子图标注0;构造的标注数据集
Figure DEST_PATH_IMAGE009
,其中
Figure DEST_PATH_IMAGE010
,表示数据集中的第i条数据,共
Figure DEST_PATH_IMAGE011
条标注数据;
Figure DEST_PATH_IMAGE012
表示第i个漏洞代码子图,
Figure DEST_PATH_IMAGE013
,n代表漏洞的种类数量,
Figure DEST_PATH_IMAGE014
,表示第i个漏洞代码子图的漏洞标签,
Figure DEST_PATH_IMAGE015
当且仅当G i 包含第j种漏洞;
Figure DEST_PATH_IMAGE016
,其中
Figure DEST_PATH_IMAGE017
,表示第i个漏洞代码图谱中的第j个节点,
Figure DEST_PATH_IMAGE018
表示第i个漏洞代码图谱共有
Figure DEST_PATH_IMAGE019
个节点;
Figure DEST_PATH_IMAGE020
,其中
Figure DEST_PATH_IMAGE021
,表示第i个漏洞代码图谱中的第j条边,
Figure DEST_PATH_IMAGE022
表示第i个漏洞代码图谱共有
Figure 360180DEST_PATH_IMAGE022
条边。
2.根据权利要求1所述的基于知识图谱的漏洞代码图谱构建方法,其特征在于,步骤S3中,基于获取到的代码文档、issue、补丁方案数据,利用自然语言处理技术,得到文档、issue、补丁方案中的实体、关系信息,具体是:在构建代码图谱的过程中,记录代码实体的名字,根据得到的实体名字,训练实体识别模型,从而得到代码文档、issue、补丁方案中的实体;结合上下文信息,最终得到实体间的关系名字;对于得到的实体,添加属性信息,用于保存所有的文字信息,为以后的代码漏洞检测和代码优化提供支撑。
3.根据权利要求1所述的基于知识图谱的漏洞代码图谱构建方法,其特征在于,步骤S4具体的融合策略为:对于名字相同的两个实体,将两个实体的关系同步到一个实体,同时保留两个实体的属性信息,融合结束以后删除冗余节点。
4.基于知识图谱的代码漏洞检测方法,其特征在于,数据输入是经过权利要求1所述的基于知识图谱的漏洞代码图谱构建方法处理好的标注数据集D,通过引入代码相关的特征,对漏洞代码子图进行分类,包括以下步骤:
S6、获取节点特征:利用神经网络模型分别提取节点包含的属性值的特征,然后对节点的不同属性特征进行加和,得到节点特征,最后经过变换函数,把所有节点特征变换到同一纬度的同一特征空间中,得到最终的节点特征;漏洞代码图谱的节点特征
Figure DEST_PATH_IMAGE023
,其中
Figure DEST_PATH_IMAGE024
Figure DEST_PATH_IMAGE025
Figure DEST_PATH_IMAGE026
表示漏洞代码图谱中每一个节点的节点特征,可由下式得到:
Figure DEST_PATH_IMAGE027
经过变换函数f以后,得到的最终的节点特征向量
Figure DEST_PATH_IMAGE028
可由下式子得到:
Figure DEST_PATH_IMAGE029
S7、获取节点代码文本特征:代码是以源代码文本的形式保存在节点中,使用文本向量模型得到代码文本特征,具体的节点代码文本特征
Figure DEST_PATH_IMAGE030
,其中
Figure DEST_PATH_IMAGE031
Figure DEST_PATH_IMAGE032
,更新节点特征向量
Figure DEST_PATH_IMAGE033
,更新后得到的节点特征向量
Figure DEST_PATH_IMAGE034
为:
Figure DEST_PATH_IMAGE035
S8、获取节点度特征:节点的入度特征
Figure DEST_PATH_IMAGE036
,出度特征
Figure DEST_PATH_IMAGE037
,其中
Figure DEST_PATH_IMAGE038
Figure DEST_PATH_IMAGE039
表示第i个代码图谱的第j个节点的入度特征,
Figure DEST_PATH_IMAGE040
Figure DEST_PATH_IMAGE041
表示第i个代码图谱的第j个节点的出度特征,
Figure DEST_PATH_IMAGE042
;引入节点的入度特征和出度特征,更新节点特征向量
Figure DEST_PATH_IMAGE043
,更新后得到的节点特征向量
Figure DEST_PATH_IMAGE044
为:
Figure DEST_PATH_IMAGE045
S9、获取节点位置特征:构建的代码图谱中,节点作为代码的信息表示,包含了当前节点代表的代码在整个代码文件中的位置信息,包括行号和列号,按照行号由小到大对节点进行排序,提取节点位置特征
Figure DEST_PATH_IMAGE046
S10、获取节点空间特征:引入函数
Figure DEST_PATH_IMAGE047
用于衡量漏洞代码子图G i 中节点n i,j n i,k 之间的空间关系,具体的:
Figure DEST_PATH_IMAGE048
其中,
Figure DEST_PATH_IMAGE049
表示节点n i,j n i,k 之间有通路,
Figure DEST_PATH_IMAGE050
表示节点n i,j n i,k 之间无通路,
Figure DEST_PATH_IMAGE051
表示节点n i,j n i,k 之间的最短路径;为了引入节点空间特征,从
Figure DEST_PATH_IMAGE052
中学习得到标量
Figure DEST_PATH_IMAGE053
,则节点空间特征
Figure DEST_PATH_IMAGE054
,在所有层内共享;
S11、获取边特征:为了提取边的特征,对于每一个有序节点对
Figure DEST_PATH_IMAGE055
,首先找到n i,j n i,k 之间的最短路径:
Figure DEST_PATH_IMAGE056
,其中t表示路径
Figure DEST_PATH_IMAGE057
中包含t条边,
Figure DEST_PATH_IMAGE058
,则漏洞代码子图G i 的边特征
Figure DEST_PATH_IMAGE059
,其中
Figure DEST_PATH_IMAGE060
m i 表示漏洞代码子图G i m i 个节点,具体的:
Figure DEST_PATH_IMAGE061
其中w l 是第l个边的权重,t l 是第l个边的类型值;
S12、利用步骤S6- 步骤S11获得的六种特征计算得到图向量表示;
S13、得到图向量以后,将其输入到分类模型中对模型进行训练,根据标签信息对分类模型进行优化,最终得到代码漏洞检测模型,用于后续的代码漏洞检测;
S14、对于新的漏洞代码图谱,得到它们的图向量表示,然后送入分类模型,即可给出检测结果。
CN202210595809.8A 2022-05-30 2022-05-30 基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法 Active CN114692155B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210595809.8A CN114692155B (zh) 2022-05-30 2022-05-30 基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210595809.8A CN114692155B (zh) 2022-05-30 2022-05-30 基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法

Publications (2)

Publication Number Publication Date
CN114692155A CN114692155A (zh) 2022-07-01
CN114692155B true CN114692155B (zh) 2022-08-23

Family

ID=82144776

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210595809.8A Active CN114692155B (zh) 2022-05-30 2022-05-30 基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法

Country Status (1)

Country Link
CN (1) CN114692155B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115357904B (zh) * 2022-07-29 2024-04-02 南京航空航天大学 一种基于程序切片和图神经网络的多类漏洞检测方法
CN115543402B (zh) * 2022-11-21 2023-03-24 北京大学 一种基于代码提交的软件知识图谱增量更新方法
CN116756052B (zh) * 2023-08-18 2023-11-14 建信金融科技有限责任公司 一种数据处理方法和装置
CN117235108A (zh) * 2023-11-14 2023-12-15 云筑信息科技(成都)有限公司 一种基于图神经网络的nl2sql生成方法
CN117235746B (zh) * 2023-11-15 2024-03-01 深圳海云安网络安全技术有限公司 一种基于多维ast融合检测的源代码安全管控平台

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110245496A (zh) * 2019-05-27 2019-09-17 华中科技大学 一种源代码漏洞检测方法及检测器和其训练方法及系统
CN112187716A (zh) * 2020-08-26 2021-01-05 中国科学院信息工程研究所 一种网络攻击中恶意代码的知识图谱展示方法
CN113656805A (zh) * 2021-07-22 2021-11-16 扬州大学 一种面向多源漏洞信息的事件图谱自动构建方法及系统

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11568055B2 (en) * 2019-08-23 2023-01-31 Praetorian System and method for automatically detecting a security vulnerability in a source code using a machine learning model
CN111460450B (zh) * 2020-03-11 2023-02-10 西北大学 一种基于图卷积网络的源代码漏洞检测方法
CN111881300A (zh) * 2020-07-03 2020-11-03 扬州大学 面向第三方库依赖的知识图谱构建方法及系统
CN112613038B (zh) * 2020-11-27 2023-12-08 中山大学 一种基于知识图谱的安全漏洞分析方法
CN112671716B (zh) * 2020-12-03 2022-07-05 中国电子科技网络信息安全有限公司 基于图谱的漏洞知识挖掘方法及系统
CN113239358A (zh) * 2021-03-11 2021-08-10 东南大学 基于知识图谱的开源软件漏洞挖掘方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110245496A (zh) * 2019-05-27 2019-09-17 华中科技大学 一种源代码漏洞检测方法及检测器和其训练方法及系统
CN112187716A (zh) * 2020-08-26 2021-01-05 中国科学院信息工程研究所 一种网络攻击中恶意代码的知识图谱展示方法
CN113656805A (zh) * 2021-07-22 2021-11-16 扬州大学 一种面向多源漏洞信息的事件图谱自动构建方法及系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
面向网络空间安全情报的知识图谱综述;董聪等;《信息安全学报》;20200930(第05期);全文 *

Also Published As

Publication number Publication date
CN114692155A (zh) 2022-07-01

Similar Documents

Publication Publication Date Title
CN114692155B (zh) 基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法
CN108446540B (zh) 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统
US11321364B2 (en) System and method for analysis and determination of relationships from a variety of data sources
US9053180B2 (en) Identifying common data objects representing solutions to a problem in different disciplines
US8589366B1 (en) Data extraction using templates
US20160275180A1 (en) System and method for storing and searching data extracted from text documents
US10210249B2 (en) Method and system of text synthesis based on extracted information in the form of an RDF graph making use of templates
JP2001167087A (ja) 構造化文書検索装置,構造化文書検索方法,構造化文書検索用プログラム記録媒体および構造化文書検索用インデックス作成方法
CN107203468A (zh) 一种基于ast的软件版本演化对比分析方法
JP2023509437A (ja) 様々なデータソースから関係を分析し特定するためのシステムおよび方法
CN113254507B (zh) 一种数据资产目录智能构建盘点方法
US20200250015A1 (en) Api mashup exploration and recommendation
US7159171B2 (en) Structured document management system, structured document management method, search device and search method
CN113508385B (zh) 使用子例程图谱进行形式语言处理的方法和系统
CN115033890A (zh) 一种基于对比学习的源代码漏洞检测方法及系统
JP2008299723A (ja) プログラム検証方法、プログラム検証装置
Wetzels et al. Branch Decomposition‐Independent Edit Distances for Merge Trees
CN117195233A (zh) 面向开源软件供应链的物料清单sbom+分析方法及装置
Ba et al. Integration of web sources under uncertainty and dependencies using probabilistic XML
CN115237978A (zh) 一种开源威胁情报聚合平台
Viuginov et al. A machine learning based automatic folding of dynamically typed languages
Embury et al. Incorporating domain-specific information quality constraints into database queries
Carme et al. The lixto project: Exploring new frontiers of web data extraction
Rajbhoj et al. DocToModel: Automated Authoring of Models from Diverse Requirements Specification Documents
Noh An XML plagiarism detection model for procedural programming languages

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
TR01 Transfer of patent right

Effective date of registration: 20230919

Address after: Room 101, East Building, No. 27, Shandong Road, Shinan District, Qingdao, Shandong 266000

Patentee after: QINGDAO JARI INDUSTRY CONTROL TECHNOLOGY CO.,LTD.

Address before: 266100 Shandong Province, Qingdao city Laoshan District Songling Road No. 238

Patentee before: OCEAN University OF CHINA

TR01 Transfer of patent right