CN110909364A - 面向源代码双极性软件安全漏洞图谱构建方法 - Google Patents
面向源代码双极性软件安全漏洞图谱构建方法 Download PDFInfo
- Publication number
- CN110909364A CN110909364A CN201911212479.4A CN201911212479A CN110909364A CN 110909364 A CN110909364 A CN 110909364A CN 201911212479 A CN201911212479 A CN 201911212479A CN 110909364 A CN110909364 A CN 110909364A
- Authority
- CN
- China
- Prior art keywords
- vulnerability
- map
- source code
- extraction
- sub
- 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.)
- Granted
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/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2458—Special types of queries, e.g. statistical queries, fuzzy queries or distributed queries
- G06F16/2465—Query processing support for facilitating data mining operations in structured databases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/95—Retrieval from the web
- G06F16/951—Indexing; Web crawling techniques
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2216/00—Indexing scheme relating to additional aspects of information retrieval not explicitly covered by G06F16/00 and subgroups
- G06F2216/03—Data mining
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Data Mining & Analysis (AREA)
- Fuzzy Systems (AREA)
- Mathematical Physics (AREA)
- Probability & Statistics with Applications (AREA)
- Computational Linguistics (AREA)
- Computing Systems (AREA)
- Debugging And Monitoring (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种面向源代码双极性软件安全漏洞图谱构建方法,解决当前漏洞图模型中漏洞特征单一,语义信息匮乏,漏洞挖掘精度低的问题。技术方案是:通过爬虫获取漏洞源代码;对漏洞源代码预处理;数据分析提取与抽取,包括特征提取,实体抽取和关系抽取;漏洞图谱构建,包括子图为漏洞图谱的基本单元,漏洞图谱可视化及存储;漏洞图谱优化,通过对子图剪枝去除大量的冗余信息,达到漏洞图谱优化。本发明构建的漏洞图谱通过对比将漏洞的正反向特性同时展现出来,体现特征项之间错综复杂关系,丰富了现有的语义结构信息,为研究漏洞的成因提供了可靠依据,提高了漏洞挖掘精度,保障了系统软件的安全性,用于计算机安全漏洞挖掘及管理。
Description
技术领域
本发明属于计算机信息安全技术领域,主要涉及软件安全漏洞的图谱构建,具体是一种面向源代码双极性软件安全漏洞图谱构建方法,用于计算机安全漏洞挖掘及管理。
背景技术
随着计算机系统的广泛使用,软件中隐藏的缺陷可能导致安全漏洞,这些漏洞通常是由于开发者在编写代码的时候遗留或者处理不当引起的,攻击者通过这些漏洞潜在地破坏系统和应用程序。每年有大量的漏洞被公开并提交给国家漏洞库,根据国家安全漏洞库NVD(National Vulnerability Database)统计,这些数据在逐年增高。由于开源软件和代码重用的盛行,这些漏洞可以被迅速的传播。实践证明,这些漏洞无论从政治上、经济上、军事上都带来巨大的影响力,给国家安全带来巨大的威胁。因此,围绕软件安全漏洞的研究日益受到个人、组织以及国家的重视。
源代码的漏洞特征可以采用空间向量模型、序列模型和图模型表示。传统的漏洞模式挖掘算法中,数据流图、控制流图、函数调用图、抽象语法树等从不同的角度揭示了漏洞的静态特征或者是动态特性。但是由于实际漏洞形成原因和表现方式异常复杂,图模型表示方法缺乏足够的语义信息,难以表达出完整的漏洞特征,漏洞和漏洞补丁之间的关系,特征项之间错综复杂的关系,以及爆发点难以展现出来。
漏洞是产生网络安全问题的根源之一,目前对于漏洞研究主要从漏洞库的建设和漏洞挖掘发展水平两方面进行衡量。漏洞库的建设是为了对已知漏洞通过找到补丁代码进行修复,漏洞挖掘是综合各种应用技术和工具,尽可能找到软件中存在的漏洞。现有的漏洞库中记录信息粒度较粗,可用信息较少,漏洞挖掘技术大都针对特定的程序设计语言或者漏洞类型,漏洞源代码的标注不够丰富,对漏洞模式描述不完整,所使用的漏洞挖掘算法效率较低,安全漏洞的误报率和漏报率较高。
综上所述,针对面向源代码漏洞图谱构建,现有的研究仅仅是对漏洞图谱的应用方面,且仅对漏洞图谱的单面考虑漏洞特征,仅仅展现出漏洞节点的相关特征,并没有展现出补丁节点的相关特征,其次缺乏足够的语义特征,导致构建的漏洞图谱不够全面,深入。截止目前,还没有一种漏洞图谱构建方法,用于网络安全问题。
发明内容
本发明为了克服上述现有技术的不足,提出了一种能够体现漏洞正向特征和反向特征的面向源代码双极性软件安全漏洞图谱构建方法。
本发明是一种面向源代码双极性软件安全漏洞图谱的构建方法,其特征在于,包括有如下步骤:
(1)漏洞源代码获取:将国家安全漏洞库NVD(National VulnerabilityDatabase)中的漏洞源代码通过爬虫的方式下载并获取到漏洞源代码的数据,该数据包括漏洞代码和补丁代码,将获取到的漏洞源代码数据存储在本地漏洞源代码仓库;
(2)数据预处理:将漏洞源代码数据通过自然语言预处理NLP(Natural LanguagePreprocessing)技术,剔除其中无用信息和干扰信息,得到预处理数据;
(3)数据分析提取与抽取:对预处理数据依次进行特征提取,实体抽取,关系抽取;经特征提取,得到漏洞源代码的根节点分类,根节点是以CWE-编号进行分类,在根节点分类中以CVE-编号为子节点;经实体抽取,得到了漏洞源代码的实体,包括漏洞实体和补丁实体,每个实体为一个节点;经过关系抽取,得到漏洞源代码中实体和实体之间的关系,其中包括控制依赖、数据流依赖、赋值传参、引用传参、声明依赖和函数调用依赖,任意两实体间关系为一条边;
(4)漏洞图谱构建:以漏洞源代码中的所有实体集合为节点集,实体和实体的关系的所有集合为边集,构建生成面向源代码双极性软件安全漏洞图谱;漏洞图谱中实线表示漏洞的节点和节点关系,虚线表示补丁的节点和节点的关系,漏洞图谱将漏洞的正向特征和反向特征表现出来;生成的漏洞图谱存储在Neo4j数据库中;所述漏洞图谱由许多个子图构成,子图是以漏洞补丁代码增减位置为出发点,以CVE-编号构成的漏洞图谱基本单元,通过CWE-编号将其中所有子图连接构成完整的漏洞图谱;
(5)漏洞图谱优化:通过优化公式逐一计算判断每一子图的超图得分上限值,对子图剪枝进行漏洞图谱优化,按照同样的方法遍历漏洞图谱的所有子图,完成漏洞图谱整体优化。
本发明充分发挥双极性漏洞图谱的优势,构建的图谱直观清晰明了。
与现有技术相比,本发明的主要优点有:
1.展示漏洞的正向特性和反向特性:现有的网络漏洞图模型中,绝大多数展现的是单一的漏洞特征,仅仅展现出漏洞节点的相关特征,并没有展现出补丁节点的特征,本发明构建的漏洞图谱能够通过对比的方式将漏洞的正向特性和反向特性展现出来,体现特征项之间错综的复杂关系,为研究漏洞的成因提供了可靠依据,有效提高了漏洞挖掘的精度。
2.丰富现有的语义信息:语义信息对于漏洞挖掘的精度有着重要作用,现有的漏洞挖掘技术语义结构信息相对较少,本发明构建的漏洞图谱语义信息包括CWE-编号,CVE-编号、编程语言、属性、版本信息、代码行号和节点类型,丰富了现有的语义结构信息,能够表达完整的漏洞结构特征,为漏洞挖掘提供了强有力的保障。
3.不局限某种特定的语言:现有对于漏洞挖掘生成的图谱局限性较大,绝大多数是针对某一种特定的语言,如C、C++和Java以及其他编程语言。本发明构建的漏洞图谱生成的图为一种中间表示,不再局限于某种特定的语言。
附图说明
图1为本发明的漏洞图谱构建方法的流程图;
图2为本发明提供的漏洞源代码获取网络爬虫流程图;
图3为本发明中面向源代码软件安全漏洞图谱中子图示意图;
图4为图3的中文版示意图。
具体实施方式
为了便于本领域的研究人员理解和实施,下面结合附图以及实施的实例对本发明详细的描述。
实施例1
随着互联网技术的不断发展,软件中隐藏的缺陷可能导致安全漏洞,这些漏洞通常是由于开发者在编写代码时候遗留或者处理不当的引起的,攻击者潜在地破坏系统和应用程序,给国家带来巨大的威胁。漏洞图谱是为了描述刻画漏洞的相关语义结构特征,将漏洞的复杂特征表示出来,用于研究漏洞的形成原因和漏洞挖掘。
现有研究对漏洞库中记录信息粒度较粗,可用信息较少,漏洞挖掘技术大都针对特定的程序设计语言或者漏洞类型,漏洞源代码的标注不够丰富,对漏洞模式描述不完整,所使用的漏洞挖掘算法效率较低,安全漏洞的误报率和漏报率较高。
本发明针对这种现状展开了研究,提出一种面向源代码双极性软件安全漏洞图谱的构建方法,参见图1,包括有如下步骤:
(1)漏洞源代码获取:将国家安全漏洞库NVD(National VulnerabilityDatabase)中的漏洞源代码通过爬虫的方式下载并获取到漏洞源代码的数据,该数据包括漏洞代码和补丁代码,将获取到的漏洞源代码数据存储在本地漏洞源代码仓库。
(2)数据预处理:将爬虫获取到的漏洞源代码数据通过自然语言预处理NLP(Natural Language Preprocessing)技术,剔除其中无用信息和干扰信息,得到预处理数据,预处理后的信息仍旧存储在本地漏洞源代码数据库。
(3)数据分析提取与抽取:对预处理数据依次进行特征提取,实体抽取,关系抽取;经特征提取,得到漏洞源代码的根节点分类,根节点是以CWE-编号进行分类,在根节点分类中以CVE-编号为子节点进行分类。经本发明实体抽取,得到了漏洞源代码的实体,包括漏洞实体和补丁实体,每个实体为一个节点。再经过关系抽取,得到漏洞源代码中实体和实体之间的关系,其中包括控制依赖、数据流依赖、赋值传参、引用传参、声明依赖和函数调用依赖。任意两实体间关系为一条边,实体和实体之间的关系可以为一对多,也可以是多对多。
(4)漏洞图谱构建:本发明以漏洞源代码中的所有实体集合为节点集,实体和实体的关系的所有集合为边集,用上述节点集和边集共同构建生成面向源代码双极性软件安全漏洞图谱。漏洞图谱中实线表示漏洞的节点和节点关系,虚线表示补丁的节点和节点的关系,漏洞图谱将漏洞的正向特征和反向特征表现出来;生成的漏洞图谱存储在Neo4j数据库中。本发明的漏洞图谱由许多个子图构成,子图是以漏洞补丁代码增减位置为出发点,以CVE-编号构成的漏洞图谱的基本单元,本发明通过CWE-编号将其中所有子图连接构成完整的漏洞图谱。
(5)漏洞图谱优化:由步骤(4)得到的图谱缺乏层次性和逻辑性,存在大量的冗余信息,影响后续通过图谱进行漏洞挖掘的精度,故需要通过优化公式逐一计算判断每一子图的超图得分上限值,对子图剪枝进行漏洞图谱优化,按照同样的方法遍历漏洞图谱的所有子图,完成漏洞图谱整体优化。以此完成面向源代码双极性软件安全漏洞图谱的构建。
本发明提出了一种面向源代码双极性软件安全漏洞图谱的构建方法的整体技术方案。本发明设计思路是首先获取漏洞源代码,将获取到的漏洞源代码进行预处理,其次对预处理后的漏洞源代码依次进行特征提取,实体抽取,关系抽取,通过实体抽取到得到的实体为节点集,关系抽取得到的实体和实体之间的关系为边集,用上述节点集和边集共同构建生成面向源代码双极性软件安全漏洞图谱,最后对生成的漏洞图谱进行优化,存储在Neo4j数据库中。得到的效果是通过漏洞图谱将漏洞的正向特征和反向特征可视化展示出来,能够体现特征项之间错综的复杂关系,为研究漏洞的成因提供了可靠依据,解决当前漏洞语义结构不完整,漏洞挖掘算法效率低下,安全漏洞的误报率和漏报率较高的问题。
实施例2
面向源代码双极性软件安全漏洞图谱的构建方法同实施例1,步骤(3)中所述的数据分析提取与抽取,包括如下步骤:
3.1)特征提取
特征提取的漏洞源代码包括漏洞代码和补丁代码,将预处理数据经文本挖掘的方法进行特征提取;得到以CWE-编号为根节点,CVE-编号为子节点的树形分类。其中得到的特征分类中CWE-编号可以按照漏洞类型继续划分为目录遍历、不正确输入验证、缓冲区溢出、跨站脚本攻击、SQL注入、信息曝光和资源管理错误。
3.2)实体抽取
实体抽取又称为命名实体识别,经特征提取得到的树形分类进行实体识别,实体识别分为三类,其中包括节点类型,语句和属性;在实体抽取的过程中,以漏洞补丁代码增减位置为出发点,每一行代码为一条语句,进行实体识别,遍历循环出发点的定义,得到整个漏洞代码和补丁代码中的节点类型、语句和属性。
3.3)关系抽取
实体抽取识别出来的实体还需要进行关系抽取,在此过程中需要定义数据依赖、控制依赖、赋值传参、引用传参、声明依赖和函数调用依赖的关系。按照定义逐一对每个实体进行关系抽取,遍历循环整个实体,得到实体和实体之间的关系,实体和实体之间的关系可以是一对多,也可以是多对多。在此过程中是以补丁代码增减的位置为出发点,在遍历循环函数过程中,寻找定义该变量节点,数据传传递的方向,返回值,函数的相关调用,直至循环遍历结束。
本发明CWE-编号为根节点,CVE-编号为叶子节点的树形分类,再依次进行实体抽取和关系抽取的过程中是以漏洞补丁代码增减位置为出发点,在遍历的过程中,首先考虑的是漏洞补丁增减函数定义节点和数据流方向,此过程中不仅仅能够大大减少工作量,而且等同于对漏洞代码进行了筛选,提高了漏洞图谱遍历效率,为后续图谱生成做铺垫。
实施例3
面向源代码双极性软件安全漏洞图谱的构建方法同实例1-2,本发明步骤(4)中所述的漏洞图谱构建,包括有如下步骤:
4.1)子图为漏洞图谱的基本单元
子图是以漏洞补丁代码增减位置为出发点,以CVE-编号为依据构成的单元,也就是说子图是以漏洞补丁代码增减位置为出发点,以所有CVE-编号的子节点形成的单元,是漏洞图谱的基本组成。对子图节点和节点之间的关系进行分析,在子图中节点之间的关系可以是一对多,也可以是多对多的关系,如附图3所示,用不同形状的箭头来表示节点和节点的关系。
子图和子图中通过CWE-编号构成完整的漏洞图谱,G=g1∪g2∪…∪gn表示,其中gn为第n个子图,n为任意子图的序号,N为子图的总数,n取值范围为正整数,即当N=n,N的个数随CWE-编号的个数变化而变化。
4.2)定义点集、边集和图
将实体抽取得到了构成点集,用V表示,将关系抽取得到的边集用E表示,漏洞图谱用G表示,漏洞图谱中的子图用g表示,∪为并集计算符号,漏洞图谱表示为G=(V,E)=g1∪g2∪…∪gn。
4.3)循环遍历子图
以漏洞补丁增减位置为出发点,此时last=NULL;执行路径中的每一条语句记为s;循环遍历得到点的集合为:V(g)=V(g)∪{s},边的集合为:E(g)=E(g)∪{<last,s>},一直循环直到last=s,结束循环。
4.4)漏洞图谱可视化及存储
通过Python调用Graphviz库可视化生成漏洞图谱子图,漏洞图谱中用不同形状的箭头表示节点和节点的关系,实线代表漏洞节点和节点间的关系,虚线表示补丁节点和节点的关系,通过对比的方式将漏洞的正向特征和反向特征表现出来,体现特征项之间错综的复杂关系。由于Neo4j是一种图形数据库,具有遍历速度快,稳定性优良的优点,故生成的图谱存放在Neo4j数据库中。
本发明以漏洞源代码中的实体为节点集,实体和实体的关系为边集,形成双极性软件安全漏洞图谱,生成的图谱存储在Neo4j数据库中。此过程中,调用Graphviz库,生成的漏洞图谱直观明了,实用性强,由于Neo4j是一种图形数据库,遍历速度快,稳定性优良,具有其他数据库所没有的功能,故存储在Neo4j数据库。
实施例4
面向源代码双极性软件安全漏洞图谱的构建方法同实施例1-3,步骤(5)中漏洞图谱优化,包括如下步骤:
5.1)对子图进行剪枝判断处理:通过优化公式对漏洞图谱中的任意子图的超图得分上限值进行判断,对超过得分上限值部分进行剪枝,对未超过得分上限值予以保留,完成了对子图的处理。
5.2)对所有子图执行优化处理:逐一判断其他子图,对漏洞图谱中其他子图按照上述同样方法逐一进行判断和剪枝,完成所有子图,即漏洞图谱的优化处理,得到G=g1∪g2∪…∪gn。
本发明对子图进行剪枝判断处理,依据此方法对所有的子图通过优化处理,得到的漏洞图谱层次分明,逻辑性强,不存在冗余信息,漏洞图谱准确性高,为后续漏洞挖掘精度以及分析提供了强有力的保障。
实施例5
面向源代码双极性软件安全漏洞图谱的构建方法同实施例1-4,步骤(5)中所述的优化公式,计算公式如下:
其中,GPass表示成功的测试超图用例图,Gfail表示失败的测试超图用例图,表示边在成功测试超图用例图GPass中出现的频率均值,表示边在失败测试超图用例图Gfail中出现的频率均值,表示边在成功测试超图用例图GPass中出现的频率方差,表示边在失败测试超图用例图Gfail中出现的频率方差。
在子图的超图在GPass中出现的次数大于等于零,且小于等于子图g在GPass中出现的次数和在Gfail中出现的次数大于等于零,且小于等于子图g在Gfail中出现的次数的情况下,均属于子图的超图的得分具有一个上限值,需要对该上限值进行剪枝。
在发明中,此优化公式能够剪去冗余的分支,通过判断子图的超图的上限,以此对整个漏洞图谱达到一个优化的目的,此优化公式简洁明了,说服力强,提高了图的遍历速度和效率,提高了后续漏洞挖掘的精度。
下面给出一个更加详细的例子,对本发明进一步说明。
实施例6
面向源代码双极性软件安全漏洞图谱的构建方法同实施例1-5。
如图1所示的流程图,本发明提供了一种面向源代码双极性软件安全漏洞图谱的构建方法,包括以下步骤:
步骤1,漏洞源代码获取
目前公开的漏洞数据库如CNVD、NVD、CNNVD等发布的漏洞信息不全面,仅对于漏洞的影响范围,威胁等级以及相关信息做了简单的描述,没有提供与漏洞代码相关的重要信息。漏洞源代码是构建知识图谱的关键,对于开源软件系统而言,虽然可以找到其漏洞源代码,但由于这些源代码存放位置和发布方式不同,具有异构多源的特点,漏洞代码文件获取也绝非易事。
本发明方案中漏洞源码代码的获取方式是采用网络爬虫的方法,漏洞源代码网络爬虫的基本流程图见图2所示。设计实施的具体的步骤如下:
1a)获取漏洞发布信息,获取漏洞源代码的网址,以及漏洞相关信息链接;
1b)判断是否存在漏洞源代码,如果存在漏洞源代码执行下一步,如果没有漏洞源代码则直接退出;
1c)初始化源代码漏洞的URL;
1d)抓取漏洞代码文件,根据描述中给出的源代码路径,进行抓取。其中抓取的内容包括CWE-编号、CVE-编号、漏洞等级、漏洞类型、发布时间、漏洞源代码和属性;
1e)构建漏洞代码库,将抓取的源代码放到本地漏洞源代码仓库中,也可以放在云端服务器中。
步骤2,数据预处理
由上述步骤,得到了漏洞源代码相关数据,但存在一些无关数据和相关信息的干扰信息。对于无关和干扰信息,需要剔除无关数据和排除干扰信息。主要用是自然语言的预处理NLP(Natural Language Preprocessing)技术,处理的相关方法如下步骤:
2a)剔除无关信息
对于一些漏洞源代码,通过爬虫爬取下来的信息相关性较小,无用信息也被下载。这一部分可以通过正则表达式优化爬虫代码,也可以通过手工的方式进行筛选剔除,剔除后的漏洞源代码仍旧存储在本地漏洞源代码数据库中。
2b)排除干扰信息
对一些爬取到的漏洞源代码仅仅是对版本号的修改,其他漏洞代码和补丁代码没有任何的改变,还存在一些其他的干扰信息,如个别CWE-编号确实存在漏洞源代码,但在该路径下爬取到的漏洞源代码时空的。本设计方案是对存在漏洞补丁代码增减位置为出发点,这些信息对于构建知识漏洞图谱研究的意义较小,且不能有效地说明问题,故这部分干扰信息可以通过手工方式进行排除,对于个别找不到漏洞源码的CWE-编号,通过人工下载它的补丁漏洞。
步骤3,数据分析提取与抽取
由步骤2预处理得到的数据,包括CWE-编号、CVE-编号、编程语言、属性、代码行号及相关信息。根据预处理得到的数据依次进行特征提取,实体抽取,关系抽取,包括如下步骤:
3a)特征提取
将预处理的信息经文本挖掘的方法进行特征提取,得到以CWE-编号为根节点,CVE-编号为叶子节点的树形分类,其中包括漏洞代码和补丁代码。
3b)实体抽取
实体抽取又称为命名实体识别,实体识别分为三类,其中包括节点类型,语句和属性;在实体抽取的过程中以核心函数或者补丁节点位置为出发点,每一行代码为一条语句,遍历循环进行实体识别,得到整个漏洞代码和补丁代码中的节点类型、语句和属性。在节点类型中包括ENTRY(入口),FUNCTION(函数),DECL(声明),ASSIGN(赋值),DECLA(声明赋值),STATEMENT(语句),CALL(函数调用),RETURN(返回值),选择结构用SELECTION和SELECTOR表示。属性中包括CVE-ID(CVE编号),CWE-ID(CWE编号)Language(编程语言),CVSS(漏洞等级),Name(函数名),Type(类型),LineNum(行号)。
3c)关系抽取
关系抽取目的是为了建立起实体和实体的关系,实体和实体之间的关系包括数据依赖、控制依赖、赋值传参、引用传参、声明依赖和函数调用依赖,在生成关系之前首先需要定义其特征关系,V1,V2分别为任意实体中的两个节点,定义方法如下:
①控制依赖:若V2节点的执行依赖于V1节点的执行,且该节点属于V1节点,则为控制依赖。
②数据流依赖:若有一条从V1到V2的路径,且存在一个在V2上的定义在V1上使用的变量,在变量V1上未被重新定义,则为数据依赖关系。
③赋值传参:若从定义结束之后,将值从V1传递给V2节点,则为赋值传参。
④引用传参:若在V1节点的节点,存在一个V2节点在V1上使用,则为引用传参。
⑤声明依赖:从声明某变量的节点V1到后面的各个定义该变量的节点V2间的特殊的关系,则为声明依赖。
⑥函数调用依赖:从函数调用节点V1到被调函数入口节点V2的边,则为函数调用依赖。
按照定义逐一对每个实体进行关系抽取,遍历循环整个实体,得到实体和实体之间的关系,实体和实体之间的关系可以是一对多,也可以是多对多。确定实体和实体之间的关系之后同时也得到了节点类型的定义。
步骤4,漏洞图谱构建
由步骤3数据分析提取与抽取,得到了实体和实体之间的关系。图谱的构建分为以下步骤:
4a)子图为漏洞图谱的基本单元
子图是以漏洞补丁代码增减位置为出发点,以CVE-编号为依据构成的单元,也就是说子图是以漏洞补丁代码增减位置为出发点,以所有CVE-编号的子节点形成的单元,是漏洞图谱的基本组成。对子图节点和节点之间的关系进行分析,在子图中节点之间的关系可以是一对多,也可以是多对多的关系,参见图3,不同形状的箭头来表示节点和节点的关系,其中用空心箭头表示控制依赖,实心箭头表示数据依赖,单刀箭头表示赋值传参,V形箭头表示引用传参,实心箭头后加一个空心圆表示声明依赖,菱形箭头表示函数调用传参。
子图和子图中通过CWE-编号构成完整的漏洞图谱,G=g1∪g2∪…∪gn表示,其中gn为第n个子图,n为任意子图的序号,N为子图的总数,n取值范围为正整数。
4b)定义点集、边集和图
将实体抽取得到了所有点构成点集,用V表示,将关系抽取得到的所有边构成边集用E表示,漏洞图谱用G表示,漏洞图谱中的子图用g表示,漏洞图谱表示为G=(V,E)=g1∪g2∪…∪gn;
4c)循环遍历子图
以漏洞补丁增减位置为出发点,此时last=NULL;执行路径中的每一条语句记为s;循环遍历得到点的集合为:V(g)=V(g)∪{s},边的集合为:E(g)=E(g)∪{<last,s>},一直循环直到last=s,结束循环,通过循环的方法就是加点加边的过程,最后得到子图中所有的点集合所有的边集;
4d)漏洞图谱可视化及存储
通过Python调用Graphviz库可视化展示生成的漏洞图谱,由于Neo4j是一种图形数据库,具有其他数据库不具有的优势,具体如下:①Neo4j以图的结构进行存储,可以存储图的节点、属性和边集;②在Neo4j中,存储节点时使用了Index-free Adjacency技术,提高了图在任何方向上的遍历速度;③稳定性优良。故生成的漏洞图谱存放在Neo4j数据库中。
根据上述步骤以国家安全漏洞库NVD中CVE-2019-12980为例,生成面向源代码双极性漏洞图谱中子图见图3,图4为图3的中文示意图。漏洞图谱中子图分为两极,表示漏洞的正向特征和反向特征。实线来表示漏洞节点之间的关系,虚线表示的是补丁节点之间的关系。用不同形状的箭头代表着不同调用关系,其中包括数据流依赖、控制依赖、赋值依赖、引用传参、声明依赖以及函数调用依赖。节点分为上中下三层,顶层代表的是节点类型,其中包括ENTRY(入口),FUNCTION(函数),DECL(声明),ASSIGN(赋值),DECLA(声明赋值),STATEMENT(语句),CALL(函数调用),选择结构节点包括SELECTION和SELECTOR;中间一层代表执行层中代码中的语句;底层代表的是语句的属性,包括Name(参数名)Type(类型)Value(值)Return(返回参数)LineNum(行号),其中LineNum中用反斜杠分隔开,分别代表的是有漏洞代码的行号和补丁节点的行号,图中用实线和虚线通过对比的方式,将漏洞的正向特征和反向特征展现出来,为后续漏洞挖掘提供了强有力的保障。
步骤5,漏洞图谱优化
由上述得到的图谱缺乏层次性和逻辑性,存在大量的冗余信息,影响后续通过知识图谱进行漏洞挖掘的精度,故需要对图谱进行剪枝达到优化的目的。通过判断g的超图得分上限值进行剪枝,在剪枝的过程中分为以下两个步骤:
5a)对子图进行剪枝判断处理:通过优化公式对漏洞图谱中的任意子图的超图得分上限值进行判断,对超过得分上限值部分进行剪枝,未超过得分上限值予以保留,完成子图的优化处理。
5b)对所有子图执行优化处理:逐一判断其他子图,对漏洞图谱中其他子图按照上述同样方法逐一进行判断和剪枝,完成所有子图,即漏洞图谱的优化处理,得到G=g1∪g2∪…∪gn。
所述中优化公式为:
其中,GPass表示成功的测试超图用例图,Gfail表示失败的测试超图用例图,表示边在成功测试超图用例图GPass中出现的频率均值,表示边在失败测试超图用例图Gfail中出现的频率均值,表示边在成功测试超图用例图GPass中出现的频率方差,表示边在失败测试超图用例图Gfail中出现的频率方差。
在子图的超图在GPass中出现的次数大于等于零,且小于等于子图g在GPass中出现的次数和在Gfail中出现的次数大于等于零,且小于等于子图g在Gfail中出现的次数的情况下,均属于子图的超图的得分具有一个上限值,需要对该上限值进行剪枝,以此达到优化的策略。
简而言之本发明的一种面向源代码双极性软件安全漏洞图谱构建方法,解决当前漏洞图模型中漏洞特征单一,语义信息匮乏,漏洞挖掘精度低的问题。技术方案是:(1)通过爬虫获取漏洞源代码;(2)对漏洞源代码进行预处理;(3)数据分析提取与抽取,主要包括特征提取,实体抽取和关系抽取;(4)漏洞图谱构建,其中包括子图为漏洞图谱的基本单元,漏洞图谱可视化及存储;(5)漏洞图谱优化,通过对子图剪枝去除大量的冗余信息,达到图谱优化。现有的网络漏洞图模型中,绝大多数展现的是单一的漏洞特征,仅仅展现出漏洞节点的相关特征,并没有展现出补丁节点的特征,本发明构建的漏洞图谱能够通过对比的方式将漏洞的正向特性和反向特性展现出来,丰富了现有的语义结构信息,体现特征项之间错综的复杂关系,为研究漏洞的成因提供了可靠依据,有效提高了漏洞挖掘的精度,为软件开发人员提供了可靠依据,提高了软件系统的安全性,用于计算机安全漏洞挖掘及管理。
Claims (5)
1.一种面向源代码双极性软件安全漏洞图谱的构建方法,其特征在于,包括有如下步骤:
(1)漏洞源代码获取:将国家安全漏洞库NVD中的漏洞源代码通过爬虫的方式下载并获取到漏洞源代码的数据,该数据包括漏洞代码和补丁代码,将获取到的漏洞源代码数据存储在本地漏洞源代码仓库;
(2)数据预处理:将漏洞源代码数据通过自然语言预处理NLP技术,剔除其中无用信息和干扰信息,得到预处理数据;
(3)数据分析提取与抽取:对预处理数据依次进行特征提取,实体抽取,关系抽取;经特征提取,得到漏洞源代码的根节点分类,根节点是以CWE-编号进行分类,在根节点分类中以CVE-编号为子节点;经实体抽取,得到了漏洞源代码的实体,其中包括漏洞实体和补丁实体,每个实体为一个节点;经过关系抽取,得到漏洞源代码中实体和实体之间的关系,其中包括控制依赖、数据流依赖、赋值传参、引用传参、声明依赖和函数调用依赖,任意两实体间关系为一条边;
(4)漏洞图谱构建:以漏洞源代码中的所有实体集合为节点集,实体和实体的关系的所有集合为边集,构建生成面向源代码双极性软件安全漏洞图谱;漏洞图谱中实线表示漏洞的节点和节点关系,虚线表示补丁的节点和节点的关系,漏洞图谱将漏洞的正向特征和反向特征表现出来;生成的漏洞图谱存储在Neo4j数据库中;所述漏洞图谱由许多个子图构成,子图是以漏洞补丁代码增减位置为出发点,以CVE-编号构成的漏洞图谱基本单元,通过CWE-编号将其中所有子图连接构成完整的漏洞图谱;
(5)漏洞图谱优化:通过优化公式逐一计算判断每一子图的超图得分上限值,对子图剪枝进行漏洞图谱优化,按照同样的方法遍历漏洞图谱的所有子图,完成漏洞图谱整体优化。
2.根据权利要求1所述的面向源代码双极性软件安全漏洞图谱的构建方法,其特征在于,步骤(3)中所述的数据分析提取与抽取,包括如下步骤:
3.1)特征提取
特征提取的漏洞源代码包括漏洞代码和补丁代码,将预处理数据经文本挖掘的方法同时进行特征提取;得到以CWE-编号为根节点,CVE-编号为子节点的树形分类。
3.2)实体抽取
实体抽取又称为命名实体识别,实体识别分为三类,其中包括节点类型,语句和属性;在实体抽取的过程中,以漏洞补丁代码增减位置为出发点,每一行代码为一条语句,进行实体识别,遍历循环出发点的定义,得到整个漏洞代码和补丁代码中的节点类型、语句和属性;
3.3)关系抽取
定义数据依赖、控制依赖、赋值传参、引用传参、声明依赖和函数调用依赖的关系;按照定义逐一对每个实体进行关系抽取,遍历循环整个实体,得到实体和实体之间的关系。
3.根据权利要求1所述的面向源代码双极性软件安全漏洞图谱的构建方法,其特征在于,步骤(4)中所述的漏洞图谱构建,包括如下步骤:
4.1)子图为漏洞图谱的基本单元
子图是以补丁代码增减位置为出发点,以CVE-编号为依据构成的单元,子图中包括超图,超图就是每一个边可以包含两个以上的点所构成的图;
在子图中节点之间的关系可以是一对多,也可以是多对多的关系,不同形状的箭头来表示节点和节点的关系;
子图和子图中通过CWE-编号构成完整的漏洞图谱,G=g1∪g2∪…∪gn表示N个子图所构成的漏洞图谱,其中gn为第n个子图,n为任意子图的序号,N为子图的总数,n取值范围为正整数,即n∈N+。
4.2)定义点集、边集和图
将实体抽取得到了所有点构成点集,用V表示,将关系抽取得到的所有边构成边集用E表示,漏洞图谱用G表示,漏洞图谱中的子图用g表示,漏洞图谱表示为G=(V,E);
4.3)循环遍历子图
以漏洞补丁增减位置为出发点,此时last=NULL;执行路径中的每一条语句记为s;循环遍历得到点的集合为:V(g)=V(g)∪{s},边的集合为:E(g)=E(g)∪{<last,s>},一直循环直到last=s,结束循环;
4.4)漏洞图谱可视化及存储
通过Python调用Graphviz库可视化生成漏洞图谱子图,漏洞图谱中用不同形状的箭头表示节点和节点的关系,实线代表漏洞节点和节点间的关系,虚线表示补丁节点和节点的关系,通过对比的方式将漏洞的正向特征和反向特征表现出来,体现特征项之间错综的复杂关系,生成的图谱存放在Neo4j数据库中。
4.根据权利要求1所述的面向源代码双极性软件安全漏洞图谱的构建方法,其特征在于,步骤(5)中漏洞图谱优化,包括如下步骤:
5.1)对子图进行剪枝判断处理:通过优化公式对漏洞图谱中的子图的超图得分上限值进行判断,对超过得分上限值部分进行剪枝,未超过得分上限值予以保留;完成子图的优化处理;
5.2)对所有子图执行优化处理:逐一判断其他子图,对漏洞图谱中其他子图按照上述同样方法逐一进行判断和剪枝,完成所有子图,即漏洞图谱的优化处理,得到G=g1∪g2∪…∪gn。
5.根据权利要求4所述的面向源代码双极性软件安全漏洞图谱的构建方法,其特征在于,步骤(5)中所述的优化公式,计算公式如下:
其中,GPass表示成功的测试超图用例图,Gfail表示失败的测试超图用例图,表示边在成功测试超图用例图GPass中出现的频率均值,表示边在失败测试超图用例图Gfail中出现的频率均值,表示边在成功测试超图用例图GPass中出现的频率方差,表示边在失败测试超图用例图Gfail中出现的频率方差;
对任何某一子图g,在子图的超图在GPass中出现的次数大于等于零,且小于等于子图g在GPass中出现的次数和在Gfail中出现的次数大于等于零,且小于等于子图g在Gfail中出现的次数的情况下,均属于子图的超图的得分具有一个上限值,需要对该上限值进行剪枝。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911212479.4A CN110909364B (zh) | 2019-12-02 | 2019-12-02 | 面向源代码双极性软件安全漏洞图谱构建方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911212479.4A CN110909364B (zh) | 2019-12-02 | 2019-12-02 | 面向源代码双极性软件安全漏洞图谱构建方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110909364A true CN110909364A (zh) | 2020-03-24 |
CN110909364B CN110909364B (zh) | 2023-02-10 |
Family
ID=69821272
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911212479.4A Active CN110909364B (zh) | 2019-12-02 | 2019-12-02 | 面向源代码双极性软件安全漏洞图谱构建方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110909364B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111881300A (zh) * | 2020-07-03 | 2020-11-03 | 扬州大学 | 面向第三方库依赖的知识图谱构建方法及系统 |
CN112989814A (zh) * | 2021-02-25 | 2021-06-18 | 中国银联股份有限公司 | 检索图谱构建方法、检索方法、装置、设备及存储介质 |
CN113139192A (zh) * | 2021-04-09 | 2021-07-20 | 扬州大学 | 基于知识图谱的第三方库安全风险分析方法及系统 |
CN113239358A (zh) * | 2021-03-11 | 2021-08-10 | 东南大学 | 基于知识图谱的开源软件漏洞挖掘方法 |
CN113434870A (zh) * | 2021-07-14 | 2021-09-24 | 中国电子科技网络信息安全有限公司 | 基于软件依赖分析的漏洞检测方法、装置、设备及介质 |
CN114969759A (zh) * | 2022-06-07 | 2022-08-30 | 中国软件评测中心(工业和信息化部软件与集成电路促进中心) | 工业机器人系统的资产安全评估方法、装置、终端及介质 |
CN116260637A (zh) * | 2023-02-15 | 2023-06-13 | 中国电子技术标准化研究院 | 渗透测试的路径规划方法、装置、电子设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP3495978A1 (en) * | 2017-12-07 | 2019-06-12 | Virtual Forge GmbH | Method for detecting vulnerabilities in software |
CN109948911A (zh) * | 2019-02-27 | 2019-06-28 | 北京邮电大学 | 一种计算网络产品信息安全风险的评估方法 |
CN110287704A (zh) * | 2019-06-25 | 2019-09-27 | 北京中科微澜科技有限公司 | 一种基于漏洞图谱的漏洞软件依赖关系构建方法 |
-
2019
- 2019-12-02 CN CN201911212479.4A patent/CN110909364B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP3495978A1 (en) * | 2017-12-07 | 2019-06-12 | Virtual Forge GmbH | Method for detecting vulnerabilities in software |
CN109948911A (zh) * | 2019-02-27 | 2019-06-28 | 北京邮电大学 | 一种计算网络产品信息安全风险的评估方法 |
CN110287704A (zh) * | 2019-06-25 | 2019-09-27 | 北京中科微澜科技有限公司 | 一种基于漏洞图谱的漏洞软件依赖关系构建方法 |
Non-Patent Citations (2)
Title |
---|
XIAO HB ET AL.: "Embedding and Predicting Software Security Entity Relationships: A Knowledge Graph Based Approach", 《NEURAL INFORMATION PROCESSING (ICONIP 2019)》 * |
李珍等: "面向源代码的软件漏洞静态检测综述", 《网络与信息安全学报》 * |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111881300A (zh) * | 2020-07-03 | 2020-11-03 | 扬州大学 | 面向第三方库依赖的知识图谱构建方法及系统 |
CN112989814A (zh) * | 2021-02-25 | 2021-06-18 | 中国银联股份有限公司 | 检索图谱构建方法、检索方法、装置、设备及存储介质 |
CN112989814B (zh) * | 2021-02-25 | 2023-08-18 | 中国银联股份有限公司 | 检索图谱构建方法、检索方法、装置、设备及存储介质 |
CN113239358A (zh) * | 2021-03-11 | 2021-08-10 | 东南大学 | 基于知识图谱的开源软件漏洞挖掘方法 |
CN113139192A (zh) * | 2021-04-09 | 2021-07-20 | 扬州大学 | 基于知识图谱的第三方库安全风险分析方法及系统 |
CN113139192B (zh) * | 2021-04-09 | 2024-04-19 | 扬州大学 | 基于知识图谱的第三方库安全风险分析方法及系统 |
CN113434870A (zh) * | 2021-07-14 | 2021-09-24 | 中国电子科技网络信息安全有限公司 | 基于软件依赖分析的漏洞检测方法、装置、设备及介质 |
CN114969759A (zh) * | 2022-06-07 | 2022-08-30 | 中国软件评测中心(工业和信息化部软件与集成电路促进中心) | 工业机器人系统的资产安全评估方法、装置、终端及介质 |
CN114969759B (zh) * | 2022-06-07 | 2024-04-05 | 中国软件评测中心(工业和信息化部软件与集成电路促进中心) | 工业机器人系统的资产安全评估方法、装置、终端及介质 |
CN116260637A (zh) * | 2023-02-15 | 2023-06-13 | 中国电子技术标准化研究院 | 渗透测试的路径规划方法、装置、电子设备及存储介质 |
CN116260637B (zh) * | 2023-02-15 | 2023-11-07 | 中国电子技术标准化研究院 | 渗透测试的路径规划方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110909364B (zh) | 2023-02-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110909364B (zh) | 面向源代码双极性软件安全漏洞图谱构建方法 | |
CN110245496B (zh) | 一种源代码漏洞检测方法及检测器和其训练方法及系统 | |
Fan et al. | Improving data quality: Consistency and accuracy | |
CN111459799B (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 | |
US8200693B2 (en) | Decision logic comparison and review | |
Wang et al. | Cleaning structured event logs: A graph repair approach | |
CN103473400B (zh) | 基于层次依赖建模的软件fmea方法 | |
Bavota et al. | Methodbook: Recommending move method refactorings via relational topic models | |
CN109063421B (zh) | 一种开源许可证合规性分析与冲突性检测方法 | |
CN112131882A (zh) | 一种多源异构网络安全知识图谱构建方法及装置 | |
Jensen et al. | Discovering multidimensional structure in relational data | |
EP3674918B1 (en) | Column lineage and metadata propagation | |
CN108446540A (zh) | 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统 | |
CN112613038B (zh) | 一种基于知识图谱的安全漏洞分析方法 | |
CN110059073B (zh) | 基于子图同构的web数据自动可视化方法 | |
US20100050155A1 (en) | Method, computer program product, and hardware product for providing program individuality analysis for source code programs | |
CN111460450A (zh) | 一种基于图卷积网络的源代码漏洞检测方法 | |
CN112434831A (zh) | 故障排查方法、装置、存储介质及计算机设备 | |
CN114579765B (zh) | 一种基于开源情报分析的网络靶场武器库构建方法 | |
CN116483700A (zh) | 一种基于反馈机制的api误用检测与修正方法 | |
CN116401145A (zh) | 一种源代码静态分析处理方法及装置 | |
Zhu et al. | Ontology-based mission modeling and analysis for system of systems | |
Chen et al. | Research on automatic vulnerability mining model based on knowledge graph | |
CN115277124A (zh) | 基于系统溯源图搜索匹配攻击模式的在线系统及服务器 | |
CN110472125B (zh) | 一种基于网络爬虫的多级页面的级联爬取方法和设备 |
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 |