APP下载

软件安全漏洞知识图谱构建方法

2022-08-16郭军军王正源姚大春王长元

计算机工程与设计 2022年8期
关键词:本体漏洞图谱

郭军军,王 乐,王正源,姚大春,王长元

(1.西安工业大学 计算机科学与工程学院,陕西 西安 710021; 2.长安大学 信息工程学院,陕西 西安 710064)

0 引 言

随着社会信息化的不断发展,软件已成为促进经济增长的支柱产业。软件带来巨大经济效益的同时,风险和挑战并存。2020年上半年,据《第46次中国互联网发展状况统计报告》显示,国家互联网应急中心(CNCERT)检测到我国境内被篡改的网站数量为147 682个,是2019年同期的近3倍,其中包括政府网站581个,较上年同期增长57%。软件安全问题十分严峻,信息窃取、程序崩溃等安全事件层出不穷,尤其是政府单位、医疗机构、科技企业等成为攻击的重要目标,造成较大的负面影响和经济损失[1,2]。

Google公司于2012年提出知识图谱(Knowledge Graph),开启了知识图谱的序章,在信息安全、语义搜索等众多领域具有广泛的应用价值[3-5]。从本质上讲,知识图谱是一种语义网络,旨在描绘客观实体和实体之间的关系,挖掘隐藏在实体之间的语义信息,促进了人工智能的发展,同时也为软件安全研究领域指引了新的研究方向。

本文针对漏洞数据利用价值低、漏洞语义不够丰富、分析手段欠缺等问题,提出一种软件安全漏洞知识图谱构建方法。从碎片化、海量化漏洞数据中提取关键信息,用于构建漏洞知识图谱,提高了漏洞数据利用价值,且丰富了漏洞语义信息,使用Cypher查询结果分析漏洞实体间的关系,提高了分析效率,且能挖掘出隐藏的知识,弥补了分析手段的不足。

1 相关工作与技术

知识图谱(Knowledge Graph)是一种用图模型来刻画知识和建模世界万物之间的关联关系,由节点和边组成[6]。知识图谱构建关键技术包括知识抽取、知识融合以及知识计算。通过知识抽取可以从半结构化及非结构化的数据中提取实体、关系以及属性等;知识融合将多元信息进行整合,获得实体的整体描述;知识计算则是通过推理、分析挖掘隐藏的知识[7]。

本体作为知识图谱实体的抽象表达,其起源于哲学领域,用于描述特定领域的概念、属性、公理等[8]。良好的本体设计有利于知识图谱的构建。例如,谢敏容[9]针对现有的网络安全本体侧重点不同,难以适用于复杂多样系统的网络安全数据源,在现有的基础上,结合网络安全数据,综合考虑了不同维度要素,设计了具有通用性强的网络安全领域本体,为网络安全知识图谱的构建奠定了基础。

在软件安全研究领域中,知识图谱可以用来表示供应商、产品、漏洞等,以及复杂漏洞之间的关系,可应用于漏洞跟踪、推理、挖掘等[10-12]。针对漏洞应用范围的不同,部分学者从不同的角度构建了软件安全漏洞知识图谱。例如,Lin等[13]提出了软件知识图谱,用来表示软件领域、项目和系统中相关知识,节点表示软件知识实体,有向边表示实体之间的各种关系;王飞等[14]详细阐述了代码知识图谱的建模表示、存储与演化管理以及智能化应用等5个方面研究发展趋势,为代码知识图谱进行智能化软件开发提供了保障;Xiao等[15]提出一种知识图谱的嵌入方法,将软件安全实体、关系以及描述信息嵌入到向量空间中,可以预测软件安全实体关系;Zhang等[16]利用知识图谱嵌入的方法提取代码之间的相互关系,结合关键字双向监督机制进行Bug定位;Yin等[17]针对PHP语言Web应用系统进行各种漏洞检测,提出了一种基于知识图谱的半自动化系统,该系统能够有效检查Web系统中常见的漏洞。

2 本体模型设计

知识图谱能够反映出实体和实体之间的关系,而本体(Ontology)是对实体以及实体间的关系的一种抽象性表达,因此优良的本体构建能够明确知识图谱中包含信息和关系的种类。本体通常用五元组来表示,即O=(C,A,R,F,I)。 其中,O表示本体,C表示概念类集合,A表示属性集合,R表示类与类之间的关系集合,F表示公理集合,I表示实例集合。

本文在现有本体构建的基础上[18],总结出本体构建4步法,具体步骤如下:

(1)明确本体的领域和范畴。本文面向的是软件安全领域,范畴是NVD(national vulnerability database)和CVE(common vulnerabilities exposures)软件安全领域内的知识。

(2)考查对现有的软件安全本体进行复用,有利于本体的构建效率。

(3)依据现有数据源的特性,对软件安全领域概念类集合、类之间关系集合以及属性集合3部分的确定。

(4)针对构建的软件安全领域本体评估,检验是否能够覆盖数据源,并不断对本体进行调整、优化和完善。

如图1所示,构建了软件安全漏洞知识图谱的本体模型。其中,概念类包括供应商(Vendor,Ven)、受影响的产品(Product,Prod)、漏洞(Vulnerability,Vul)和漏洞类型(Vulnerability Type,VT);类和类之间的关系包括属于(BelongTO)、影响(Affect)和存在CWE(HasCWE);属性集合包括版本号(Version)、漏洞描述(Description)等;公理集合,通常用于知识推理,如缓冲区溢出会导致程序崩溃;实例集合,如软件安全本体中的“漏洞”类中具体的漏洞,如CVE-2019-12980、CVE-2018-3719等。

以漏洞实例CVE-2017-9796展现实体之间存在的关系,结合形式化定义则如下:

其中Apache表示的是具体厂商,Commons1.2.0表示具体产品以及版本号,该漏洞属于不正确的输入验证,漏洞的本体模型中涵盖了多维数据标签,所有实体的属性标签都是从NVD、CVE等漏洞库中抽取而来。因此,某个特定的CVE-ID漏洞能够直接或间接影响一个以及一系列产品,该产品属于某个供应商,属于某一种类型的漏洞。

3 漏洞知识图谱的构建

漏洞知识图谱构建是以数据的获取为起点,通过网络爬虫进行数据的采集,然后经过知识抽取、知识融合形成统一的知识,最后将获取到的知识存储到Neo4j图数据库中,并实现存储、查询以及可视化展示,构建框架如图2所示。

图1 漏洞知识图谱本体模型

图2 漏洞知识图谱构建框架

3.1 漏洞样本数据采集

漏洞样本数据的采集是构建漏洞知识图谱的第一步,本文主要面向的是NVD和CVE漏洞数据库,这些信息通常是以非结构化的文本形式存在。CVE漏洞披露规范是信息安全行业常用的标准。在CVE中,每个漏洞都有确定的ID、漏洞描述、漏洞来源、发布时间等信息,便于实现数据的共享。一个漏洞在CVE网站中披露,首先安全人员提交漏洞,然后安全专家进行审查和验证,一旦被安全专家确认,将会分配漏洞编号并在CVE站点公布。NVD是与CVE兼容的,收录了所有CVE条目,且提供了除CVE之外的信息,如危害等级、CWE分类等。

目前,软件漏洞以不同的形式存在于不同的位置,具有数据规模庞大,分布不同,种类复杂多样,参差不齐,且异构多源。针对以上漏洞数据的特点,考虑到数据信息量较大,故对于漏洞数据的采集主要以网络爬虫为主,通过深入分析NVD和CVE公开披露的漏洞数据库网站发布机制,获取漏洞信息,一旦发现新漏洞的发布,立即进行爬取,因此具有较强的实时性。

3.2 数据预处理

通过上述步骤获取到的数据存在冗余无序,无层次逻辑关系等问题,不便于漏洞知识图谱的构建,故需要对获取到的数据进行预处理。预处理的具体过程如下:

(1)数据清洗

对于个别漏洞数据,通过网络爬虫获取得到信息相关性较小,无用信息也被下载。对于这一部分信息可以通过优化爬虫代码,也可以通过手工方式进行人工筛选剔除,经处理后的漏洞数据仍存储在本地漏洞源代码数据库中。

(2)数据的分类

经数据清洗后得到的漏洞数据文件杂乱无序,不利于后续的研究,需要对清洗后的漏洞数据进行分类。因漏洞库中每个漏洞都有确定的CWE-ID和CVE-ID,故分类的标准是以CWE-ID为根节点,CVE-ID为叶子节点。

(3)分词

漏洞数据描述中包含了漏洞重要的信息,如受影响的产品、漏洞类型以及部分供应商等,因此在漏洞描述中提取重要的漏洞信息至关重要。文本分词以自然语言为基础,是将连续的字符串序列按照一定规则转为词序列的过程。本文主要通过Python调用SpaCy库进行分词,SpaCy分词具有速度较快,准确率较高,分词是为了便于后续分析及实体识别。

(4)文本特征提取

在自然语言处理中,要将文本数据转为计算机可以理解的一种数据,才能通过模型不断地学习、训练。特征提取作为文本分类中的关键技术,特征提取的质量直接影响到文本分类的效果。词向量作为自然语言处理技术的一种,采用词向量技术对软件安全漏洞训练得到的词向量作为模型的输入,有利于提高模型训练的性能。词向量将待标注序列的每个词进行嵌入处理,并将其转为向量,采用数学表达式获取词的语法和语义相关特征,便于后续实体识别。

3.3 实体识别

目前,主要包括基于规则和词典、基于机器学习的方法以及基于深度学习的方法。面向软件漏洞实体识别主要针对供应商、受影响的产品、漏洞、漏洞类型4类实体进行识别。其中,供应商表示如微软、苹果、思科等公司,供应商的属性标签包括公司名称、编号以及对应的URL链接等;受影响的产品表示的是如谷歌Chrome、360浏览器等,产品的属性标签包括产品名、产品的版本号,如Apache下的分布式内存系统内核Mesos,对应的版本如Mesos 1.1.2、Mesos 1.2.0、Mesos 1.3.0等;漏洞实体则表示的是某一特定的漏洞CVE-ID,如CVE-2018-16976、CVE-2018-18397;漏洞类型的属性标签中包含CWE-ID,例如,CWE-79表示的是跨站脚本攻击,CWE-22表示的是目录遍历等,面向软件的实体以及相关属性具体信息见表1。

表1 面向软件实体及属性

漏洞的相关属性标签主要是来自于公开漏洞库CVE和NVD等信息的分析、总结和归纳,丰富多样的属性标签更有利于分析漏洞的相关特征,挖掘潜在的漏洞之间的关系。本文在漏洞的属性中涵盖了多种标签如漏洞文件名(PathName)、风险数值(Cvss)、编程语言(Language)等漏洞属性信息,具体漏洞描述见表2。

在软件安全领域中,通过对非结构化的文本数据进行大量的研究和分析,得出部分实体及属性具有一定的规则。例如,NVD和CVE漏洞编号遵循特定的命名方式,都是以“CVE+年份+任意数字”,基于规则的实体识别具有高精度、高召回率和可扩展性,因此对于具体某个漏洞编号可以通过设计正则表达式进行提取该实体,不再需要其它的方法进行实体识别,漏洞的其它属性通过漏洞库中分析的相关属性一一对应,部分实体和属性的正则表达式规则模板见表3。

表2 漏洞属性描述

表3 部分实体与属性正则表达式

因NVD、CVE每一个漏洞编号都代表着一种特定的漏洞,每一个特定漏洞都包含漏洞相关描述,而漏洞描述是部分领域专家给出的高质量非结构化文本信息,具有一定的权威性。漏洞描述中涵盖了受影响的产品、漏洞类型以及部分供应商,故需要对这3类实体进行识别,具体如下所示:

(1)实体标注策略

目前,以深度学习为代表的人工智能得到了快速的发展,规范的数据集标注对知识图谱的构建以及计算能力的提升起到了重要作用。针对知识图谱构建的数据集,一方面基于小样本的学习算法已经成为了主流,另一方面,如何统一标注的方法以及标注的质量已经成为了重要的内容。

因漏洞编号具有一定的规则性,故只需要对厂商、产品名和漏洞类型进行实体识别。针对以上3类软件安全领域的相关实体,采用BIOES方法进行标注,Ven、Prod、VT分别表示厂商、产品、漏洞类型,用X表示这3类实体。B-X代表实体的开始部分,I-X表示实体的中间部分,E-X表示实体的结束部分,S-X表示单个字符的实体,O表示其它非实体部分,实体的标注集见表4。

表4 软件安全实体标注集

图3截取了某一特定漏洞描述的标注示例,该漏洞描述中包含了漏洞类型Integer Overflow标记为(B-VT,E-VT),其它与标注无关的词则标记为非实体(O)。尽管手工标注的方法耗费大量时间和精力,但标注的数据集准确,便于后续模型的识别。

图3 部分实体标注示例

(2)实体识别模型

本文通过BiLSTM-CRF进行软件实体识别,该模型使用了通过长短记忆神经网络与CRF相结合的方法进行实体识别,自顶向下包括CRF、前向LSTM网络层、后向LSTM网络层和Embedding层,模型架构如图4所示。

图4 BiLSTM-CRF实体识别模型

首先将特定漏洞的相关描述中的单词为基本单位,经过分词后按照字或者词为输入,对于给定包含n个词的句子s={w1,w2,w3,…wn}, 其中wn表示输入句中的第n个单词,将单词映射到多维连续值的词向量中。经过词向量化后,将初始值传入到BiLSTM网络层中,前向LSTM和后向LSTM分别作为初始的顺序序列和逆序序列。然后通过BiLSTM层进行有监督训练学习,以此获得输入单词序列基本特征,并将预测结果归一化输出提供给最终的CRF层,最后通过CRF层将上一层的输入预测标签进行约束矫正,实现对标签数据的准确分类。

3.4 关系抽取

由于软件安全领域中的实体关系种类繁多,不利于实体关系的抽取。面向软件的漏洞关系抽取主要针对供应商、受影响的产品、漏洞和漏洞类型这4类实体。因此,本文对软件安全实体关系进行了泛化,人工筛选并定义了较为全面的关系种类,能够保证覆盖软件安全实体识别中的实体,所识别出的实体互相都存在着一定的关系。面向软件关系抽取包括属于(BelongTo)、影响(Affect)、存在CWE-ID(HasCWE)详细信息见表5。

表5 面向软件实体之间的关系

3.5 知识融合

知识融合本质就是将多元信息进行整合,完成整体实体的描述,主要的技术包括实体消歧、实体对齐和属性对齐等。因本文所获取的软件安全实体来自于专有的实体知识库,故有效减少了“一词多义”现象,避免了实体之间可能存在的歧义性,因此重点考虑实体对齐和属性融合。

本文的实体和属性来自于NVD和CVE之间交叉互补信息,同一漏洞实体字段信息有所差异。在漏洞知识图谱构建过程中可能因此产生歧义,从而导致实体语义粒度不一致,存在冗余,造成系统较大的开销。因此需要将两个漏洞库之间交叉互补的实体信息进行对齐,统一为本文所构建规范的实体和属性字段。例如,在CVE中字段“CVE-ID”对应的字段是NVD中“CVE_ID”,表示的是具体某一特定的实体,统一规范为“CVE-ID”;CVE中的属性字段“Description”对应是NVD中的“Current Description”,表示的是对特定漏洞的描述,统一规范为“Description”;CVE中的属性字段“Date Record Crated”对应的是NVD中“Published Date”表示的是漏洞的发布时间,统一规范为“Publish Date”,时间格式统一规范为“年-月-日”等,通过对实体对齐,使信息能够更加规范,更加准确,有效减少了系统的开销。在CVE中部分属性字段不存在,但在NVD能够有效的互补,如漏洞类型,该字段是区分漏洞的类型,“Base Score”字段表示的是基础得分等等,CVE和NVD互补提供了丰富可靠的字段信息。此外,部分实体存在异构问题,不同的实体可能指代同一个实体,大量共指性问题造成不必要的开销,如漏洞类型为“Integer Overflow”又称“Wraparound”表示的是整数溢出,统一为“Integer Overflow”。通过知识融合有效地将多元信息进行整合,有解决了冗余等问题。

3.6 图谱构建实验

(1)实验环境

实验在Python语言下进行编程,所使用电脑CPU为英特尔酷睿i7,显卡为英伟达GTX 1070,内存128 GB,固态硬盘256 GB,机械硬盘4 T,系统使用的是Windows10和CentOS 7.0操作系统,Neo4j使用的版本为Neo4j-community-4.1.3,扩展包添加了APOC和ALGO。

(2)实验数据

通过网络爬虫,从CVE和NVD中获取到漏洞的数据信息,经数据预处理后,得到SQL注入(SQL Injection)、命令注入(Command Injection)等8种常见类型的漏洞,涵盖21种常见类型的CWE,1176个CVE-ID,17 640个属性信息(其中包括漏洞描述、编程语言、路径名、漏洞粒度、发布时间等),详细见表6。

(3)构建步骤及结果

本文根据上述3.1~3.5步骤将网络爬虫获取到的数据依次进行实体抽取、关系抽取和知识融合,通过实体抽取得到知识图谱的节点集及属性,关系抽取得到实体和实体之间的关系为边集,通过Python调用Py2neo库及结合Load-CSV语句两种方式将漏洞语义信息批量存储在Neo4j图形数据库中,可视化展示节点和节点之间的关系。

表6 数据统计

单独从导入方式来说,第一种方式使用方便,可实时插入,但速度相对较慢。第二种方式是官方提供的导入工具,速度相对较快,但在执行的过程中,需要将CSV文件放在Neo4j/import目录下,默认编码转为UTF-8,且当字段过多时,导入语句比较繁琐,不能动态创建节点和关系。故本文将漏洞语义信息在导入数据过程中时,首先通过Load-CSV语句将确定数据导入到Neo4j数据库中,然后再结合Python调用Py2neo库,实现将数据批量的导入。

因所构建的知识图谱节点和相关属性较多,数据量过大导致无法全面地、清楚地展示软件安全漏洞知识图谱的相关节点和边,故本文在漏洞知识图谱的可视化过程中通过Cypher查询语句查找具体某个局部节点和边之间的关系。在图中部分节点看似孤立单独的点,实际上每个节点都存在关系。在下图中,用圆形节点表示漏洞,即特定漏洞CVE对象,方形节点表示受影响的产品,五边形节点表示供应商,八边形节点表示漏洞类型。图5通过Cypher查询语句,查询指向影响漏洞厂商Ming的所有产品版本,图中展示了其中包括节点和边之间的关系,影响Ming的版本包括libming0.4.8和libming0.4.7两个版本,漏洞厂商和产品之间的关系为属于,通过BelongTo将漏洞厂商和产品关联在一起。

图5 影响Ming的所有产品

通过分析可知,每一种特定的漏洞能影响一个或多个厂商或者产品,图6经Cypher查询语句查询Ming所有受影响的产品以及具体漏洞信息,每个漏洞节点都包含特定漏洞的属性信息,如漏洞编号、漏洞文件名、风险数值、漏洞的粒度、漏洞描述等漏洞的相关节点属性信息,漏洞和产品之间的关系是影响(Affect),通过Affect将漏洞和产品节点之间关联在一起。

因每一个特定的漏洞都包含CWE-ID,图7展示的是通过Cypher查询语句查询漏洞类型为SQL注入所包含CVE-ID,漏洞和漏洞类型通过HasCWE关联在一起。

通过Cypher查询结果可间接验证本文方法的有效性和可行性。

图6 影响Ming漏洞节点

图7 SQL注入

4 图谱应用

软件安全漏洞知识图谱可广泛应用于漏洞分析、推理、挖掘等领域,具体如下:

(1)漏洞分析:在漏洞分析领域中,通过Cypher 查询语句查找出特定漏洞之间的关系,为深入分析、追溯漏洞成因提供了可靠的支撑。

(2)漏洞推理:在漏洞推理领域中,特定漏洞和漏洞之间存在着一定的联系,可能属于同一种受影响的产品或者厂商,也可能属于同一种类型的漏洞,具有相同或者不同的CWE-ID,通过推理揭示隐藏的语义信息。

(3)漏洞挖掘:在漏洞挖掘领域中,通过推理函数挖掘出潜在的关系和知识,避免因漏洞造成的危害。

此外,漏洞知识图谱也可以用于漏洞追踪与溯源等方面。

5 结束语

本文针对实际漏洞形成的原因和表现方式多样,特征项之间关系复杂,现有漏洞数据利用价值低、漏洞语义信息不够丰富、分析手段欠缺等问题,提出了一种软件安全漏洞知识图谱构建方法,通过对漏洞数据的采集、知识抽取、知识融合等手段,将获取到的知识存储到Neo4j图数据库中,通过Cypher查询并将结果可视化展示。结果表明,所提出的方法能够更好地构建漏洞知识图谱。在后续的研究过程中,进一步丰富和完善,借助于程序分析,知识图谱的推理、挖掘等方法,分析漏洞语义之间的关系,探究漏洞的根本特征,挖掘出软件中潜在的漏洞。

猜你喜欢

本体漏洞图谱
漏洞
中医药知识图谱应用现状分析及痴呆痰瘀互结证知识图谱构建探索
眼睛是“本体”
绘一张成长图谱
基于selenium的SQL注入漏洞检测方法
一种基于社会选择的本体聚类与合并机制
补肾强身片UPLC指纹图谱
漏洞在哪儿
主动对接你思维的知识图谱
专题