CN114692155B - 基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法 - Google Patents
基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法 Download PDFInfo
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/562—Static detection
- G06F21/563—Static detection by source code analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/36—Creation of semantic tools, e.g. ontology or thesauri
- G06F16/367—Ontology
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
Abstract
本发明属于网络安全技术领域,公开了基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法,本发明首先生成源代码的代码图谱,然后基于漏洞模式、数据依赖、控制依赖,从源代码漏洞图谱中提取漏洞代码子图,得到标注数据集,然后从漏洞代码子图中提取六种特征,整合得到漏洞代码子图的向量表示,最后将漏洞代码子图的向量表示输入到分类模型进行训练,利用标签信息对分类模型进行优化,生成漏洞代码检测模型。漏洞代码检测模型能够对漏洞代码进行多分类漏洞检测,保证在软件开发过程中代码的安全性。
Description
技术领域
本发明属于网络安全技术领域,特别涉及一种基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法。
背景技术
随着信息化时代的到来,计算机系统广泛使用,各个平台软件的质量参差不齐,良莠不齐,软件中往往隐藏了严重的安全漏洞。这些漏洞通常是由于软件开发人员在编写代码时使用了不规范的编程模式引起的。这些漏洞一旦被攻击者利用,会严重破坏系统的稳定性和安全性,因此,针对软件的安全性考量变得十分重要。由于现有的开源软件和代码复用的风气盛行,这些带有缺陷和漏洞的代码一旦被公开开源出去,会得到迅速的传播,很可能造成某一领域的重大软件安全事故。事实证明,软件代码漏洞无论在政治上、经济上、军事上都占有举足轻重的地位,一旦被恶人利用,讲给国家安全带来巨大的威胁。因此,软件代码安全性评估日益受到个人、组织以及国家的重视。
针对上述问题和现状,近几年出现许多代码漏洞检测相关的研究和方法。传统的代码漏洞检测方法基于模式匹配的方式,不能够获取足够的漏洞代码相关的特征。也有的研究从源代码文件的角度出发,以整个源代码文件或代码中的函数为粒度,结合机器学习模型提取漏洞代码的特征,由于研究粒度较粗,引入了过多的噪声,导致提取到的特征不够细致全面。有的研究方法只关注单一的代码漏洞的检测,不能够识别多种漏洞类型。
综上所述,目前并没有一种代码漏洞检测方法,能够细粒度的,自动对漏洞特征进行提取,并对多种漏洞类型进行检测。
发明内容
针对现有技术存在的不足,本发明提供一种基于知识图谱的漏洞代码图谱构建及代码漏洞检测方法,从研究程序源代码的角度出发,构建源代码知识图谱,从源代码知识图谱中提取漏洞代码子图,然后利用词向量模型对漏洞代码进行向量化表示,最后利用深度学习模型对漏洞特征进行自动提取,得到漏洞代码检测模型,能够对漏洞代码进行多分类漏洞检测,从而在软件开发过程中保证代码的安全性。
为了解决上述技术问题,本发明采用的技术方案是:
首先,本发明提供一种基于知识图谱的漏洞代码图谱构建方法,包括以下步骤:
S1、获取漏洞代码相关信息:包括漏洞源代码文件、漏洞发布日期、漏洞补丁方案、漏洞所处的代码仓库地址、代码仓库提交日志、代码仓库issue信息;
S2、对漏洞源代码文件的处理:将漏洞源代码文件处理成抽象语法树,利用抽象语法树的深度遍历算法,从抽象语法树中提取实体、关系信息,构建源代码图谱,进而抽取生成漏洞代码子图;
S3、对漏洞代码相关文字信息的处理:基于获取到的漏洞代码相关信息数据,利用自然语言处理技术,从代码文档、issue、补丁方案中提取出与代码相关的实体节点和实体间关系信息,保存记录到数据库中;
S4、对前两部分的到的实体和关系进行实体关系融合:通过步骤S1可以得到源代码实体关系,通过步骤S2得到文档实体关系,将两者进行实体关系融合,整合源代码和文档中的信息;
S5、构造标注数据集D:得到漏洞代码子图以后,将漏洞代码子图和爬取的数据进行对齐,对每一个漏洞代码子图进行人工标注,对于有漏洞的代码子图标注上对应的漏洞类型,没有漏洞的代码子图标注0。
进一步的,步骤S2的具体步骤如下:
S21、处理漏洞源代码文件,提取源代码文件的抽象语法树;
S22、实体类型定义及实体间关系定义:结合源代码文件的抽象语法树信息,定义构建源代码知识图谱必备的实体类型信息和实体间关系信息;
S23、遍历抽象语法树生成源代码图谱:利用代码图谱生成算法,结合实体类型定义及实体间关系定义,抽取生成源代码图谱,存入图数据库;
S24、利用漏洞代码子图生成算法,从上一步骤生成的源代码图谱中抽取生成漏洞代码子图。
进一步的,步骤S24的漏洞代码子图生成算法如下:
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构造标注数据集,其中,表示数据集中的第i条数据,共条标注数据;表示第i个漏洞代码子图,,n代表漏洞的种类数量,,表示第i个漏洞代码子图的漏洞标签,当且仅当G i 包含第j种漏洞;,其中,表示第i个漏洞代码图谱中的第j个节点,表示第i个漏洞代码图谱共有个节点;,其中,表示第i个漏洞代码图谱中的第j条边,表示第i个漏洞代码图谱共有条边。
然后,本发明提供一种基于知识图谱的代码漏洞检测方法,数据输入是经过如前所述的基于知识图谱的漏洞代码图谱构建方法处理好的标注数据集D,通过引入代码相关的特征,对漏洞代码子图进行分类,包括以下步骤:
S6、获取节点特征:利用神经网络模型分别提取节点包含的属性值的特征,然后对节点的不同属性特征进行加和,得到节点特征,最后经过变换函数,把所有节点特征变换到同一纬度的同一特征空间中,得到最终的节点特征;漏洞代码图谱的节点特征,其中,,表示表示漏洞代码图谱中每一个节点的节点特征,所有节点特征组成了漏洞代码图谱的节点特征,可由下式得到:
S8、获取节点度特征:节点的入度特征,出度特征,其中,表示第i个代码图谱的第j个节点的入度特征,,表示第i个代码图谱的第j个节点的出度特征,;引入节点的入度特征和出度特征,更新节点特征向量,更新后得到的节点特征向量为:
其中,表示节点n i,j 和n i,k 之间有通路,表示节点n i,j 和n i,k 之间无通路,表示节点n i,j 和n i,k 之间的最短路径;为了引入节点空间特征,从中学习得到标量,则节点空间特征,在所有层内共享;
S11、获取边特征:为了提取边的特征,对于每一个有序节点对,首先找到n i,j 和n i,k 之间的最短路径:,其中t表示路径中包含t条边,,则漏洞代码子图G i 的边特征,其中,m i 表示漏洞代码子图G i 有m i 个节点,具体的:
其中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、利用漏洞代码子图生成算法,从上一步骤生成的源代码图谱中抽取生成漏洞代码子图。
漏洞代码子图生成算法如下:
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。具体的,对于标注数据集,其中,表示数据集中的第i条数据,共条标注数据;表示第i个漏洞代码子图,,n代表漏洞的种类数量,,表示第i个漏洞代码子图的漏洞标签,当且仅当G i 包含第j种漏洞;,其中,表示第i个漏洞代码图谱中的第j个节点,表示第i个漏洞代码图谱共有个节点;,其中,表示第i个漏洞代码图谱中的第j条边,表示第i个漏洞代码图谱共有条边。
本发明在构建漏洞代码图谱内容方面,不仅仅考虑了源代码中的信息,而且融合了代码文档、issue以及补丁方案等信息,为后续的代码漏洞检测以及代码优化提供支撑。
在构建漏洞代码图谱方式方面,本发明针对源代码的处理,首先是生成代码图谱,然后结合了传统的模式匹配的方式,为代码图谱中的实体打上对应的漏洞标签,避免重复生成冗余节点,能够在提升漏洞代码图谱构建效率的同时,保证准确率。
实施例2
本实施例介绍基于知识图谱的代码漏洞检测方法,数据输入是经过实施例1的方法处理好的标注数据集,其中,表示数据集中的第i条数据,共条标注数据;表示第i个漏洞代码子图,,n代表漏洞的种类数量,,表示第i个漏洞代码子图的漏洞标签,当且仅当G i 包含第j种漏洞。,其中,表示第i个漏洞代码图谱中的第j个节点,表示第i个漏洞代码图谱共有个节点;,其中,表示第i个漏洞代码图谱中的第j条边,表示第i个漏洞代码图谱共有条边。通过引入代码相关的特征,对漏洞代码子图进行分类。图2 表示了代码漏洞检测模型训练过程,通过图1所示步骤得到了漏洞代码子图,在进行代码漏洞检测模型的训练之前,由于漏洞代码子图的规模大小并不统一,不便训练,因此首先进行对漏洞代码子图进行数据预处理操作,数据预处理的目的是为了使漏洞代码子图的规模大小一致。(数据预处理的策略为:首先获得所有漏洞代码子图的规模分布,提取规模分布最大的那个规模数当作数据预处理以后的漏洞代码子图规模,记为M。对于漏洞代码子图的规模小于M的,对其进行节点填充,使其规模等于M,填充的节点的属性为空;对于漏洞代码子图的规模大于M的,对其进行拆分,使拆分后的漏洞代码子图的规模等于M)。
经过数据预处理以后,对漏洞代码子图提取特征,包括节点特征、节点度特征、代码特征、边特征、空间特征以及位置特征;然后结合深度学习模型,得到漏洞代码图谱的向量表示;最后送入分类模型进行训练,根据标签信息对分类模型优化,得到代码漏洞检测模型。该模型用于后续的代码漏洞检测。
图3代表了代码漏洞检测过程,对于待检测的源代码文件,首先生成源代码图谱,然后从中提取出所有可能包含漏洞的漏洞代码子图,即候选漏洞代码图谱,然后利用图2所示步骤得到的代码漏洞检测模型对候选漏洞代码图谱进行漏洞检测,得到检测结果,检测结果包括漏洞类型、漏洞代码位置、漏洞代码子图。
下面结合图2和图3,详细介绍代码漏洞检测方法的流程,包括以下步骤:
S6、获取节点特征:节点特征作为整个模型训练的基础,需要尽可能表达出节点所有的信息。利用任意的神经网络模型分别提取节点包含的属性值的特征,然后对节点的不同属性特征进行加和,得到节点特征,最后经过变换函数,把所有节点特征变换到同一纬度的同一特征空间中,得到最终的节点特征。
具体的,节点n i 的属性特征,其中,u表示节点属性的个数,是通过任意神经网络模型得到的节点的属性特征向量。漏洞代码图谱的节点特征,其中,,表示漏洞代码图谱中每一个节点的节点特征,所有节点特征组成了漏洞代码图谱的节点特征,可由下式得到:
变换函数f可以使用任何的变换函数,如下式,其中W f 是需要学习的权重参数。
S8、 获取节点度特征:代码图谱中是一个有向图,图中的每一个节点都有它的出度outdegree和入度indegree,通常认为度越大的节点在图谱中越重要。节点的入度特征,出度特征,其中,表示第i个代码图谱的第j个节点的入度特征,,表示第i个代码图谱的第j个节点的出度特征,;引入节点的入度特征和出度特征,更新节点特征向量,更新后得到的节点特征向量 为:
其中,表示节点n i,j 和n i,k 之间有通路,表示节点n i,j 和n i,k 之间无通路,表示节点n i,j 和n i,k 之间的最短路径;为了引入节点空间特征,从中学习得到标量,则节点空间特征,在所有层内共享;
S11、获取边特征:代码图谱中不仅包含了节点信息,还包含了节点之间的关系信息,这些信息存储在图中的边上,这些边都有不同的类型t i ,不同类型又有不同的权重w i 。为了提取边的特征,对于每一个有序节点对,首先找到n i,j 和n i,k 之间的最短路径:,其中t表示路径 中包含t条边,,则漏洞代码子图G i 的边特征
其中w l 是第l个边的权重,t l 是第l个边的类型值;
S12、利用上述步骤S6- 步骤S11获得的特征计算得到图向量表示;
其中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、利用漏洞代码子图生成算法,从上一步骤生成的源代码图谱中抽取生成漏洞代码子图;漏洞代码子图生成算法如下:
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得到文档实体关系,将两者进行实体关系融合,整合源代码和文档中的信息;
2.根据权利要求1所述的基于知识图谱的漏洞代码图谱构建方法,其特征在于,步骤S3中,基于获取到的代码文档、issue、补丁方案数据,利用自然语言处理技术,得到文档、issue、补丁方案中的实体、关系信息,具体是:在构建代码图谱的过程中,记录代码实体的名字,根据得到的实体名字,训练实体识别模型,从而得到代码文档、issue、补丁方案中的实体;结合上下文信息,最终得到实体间的关系名字;对于得到的实体,添加属性信息,用于保存所有的文字信息,为以后的代码漏洞检测和代码优化提供支撑。
3.根据权利要求1所述的基于知识图谱的漏洞代码图谱构建方法,其特征在于,步骤S4具体的融合策略为:对于名字相同的两个实体,将两个实体的关系同步到一个实体,同时保留两个实体的属性信息,融合结束以后删除冗余节点。
4.基于知识图谱的代码漏洞检测方法,其特征在于,数据输入是经过权利要求1所述的基于知识图谱的漏洞代码图谱构建方法处理好的标注数据集D,通过引入代码相关的特征,对漏洞代码子图进行分类,包括以下步骤:
S6、获取节点特征:利用神经网络模型分别提取节点包含的属性值的特征,然后对节点的不同属性特征进行加和,得到节点特征,最后经过变换函数,把所有节点特征变换到同一纬度的同一特征空间中,得到最终的节点特征;漏洞代码图谱的节点特征,其中,,表示漏洞代码图谱中每一个节点的节点特征,可由下式得到:
S8、获取节点度特征:节点的入度特征,出度特征,其中,表示第i个代码图谱的第j个节点的入度特征, ,表示第i个代码图谱的第j个节点的出度特征,;引入节点的入度特征和出度特征,更新节点特征向量,更新后得到的节点特征向量为:
其中, 表示节点n i,j 和n i,k 之间有通路,表示节点n i,j 和n i,k 之间无通路,表示节点n i,j 和n i,k 之间的最短路径;为了引入节点空间特征,从中学习得到标量,则节点空间特征,在所有层内共享;
S11、获取边特征:为了提取边的特征,对于每一个有序节点对,首先找到n i,j 和n i,k 之间的最短路径:,其中t表示路径中包含t条边,,则漏洞代码子图G i 的边特征 ,其中,m i 表示漏洞代码子图G i 有m i 个节点,具体的:
其中w l 是第l个边的权重,t l 是第l个边的类型值;
S12、利用步骤S6- 步骤S11获得的六种特征计算得到图向量表示;
S13、得到图向量以后,将其输入到分类模型中对模型进行训练,根据标签信息对分类模型进行优化,最终得到代码漏洞检测模型,用于后续的代码漏洞检测;
S14、对于新的漏洞代码图谱,得到它们的图向量表示,然后送入分类模型,即可给出检测结果。
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)
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)
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)
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 | 东南大学 | 基于知识图谱的开源软件漏洞挖掘方法 |
-
2022
- 2022-05-30 CN CN202210595809.8A patent/CN114692155B/zh active Active
Patent Citations (3)
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)
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 |