本发明涉及软件漏洞检测领域,特别涉及一种软件漏洞的分类方法及系统。
背景技术:
随着信息技术的快速发展,互联网以及计算机的应用已经深入到各个行业,从能源、交通、生产、军事、医疗到人们的日常生活,都已经离不开互联网的支持。信息技术在给我们带来极大便利的同时,也带来了巨大的风险和隐患。近几年屡屡发生的计算机安全事故,如信息系统被攻击造成机密信息泄露,隐私数据丢失和其他重大损失的安全事件等,给各大企业、组织和个人带来了巨大的损失,而造成计算机安全事故的原因则是系统的漏洞被恶意攻击利用。因此,安全问题得到了广泛的关注,各种组织、论坛、会议还有论文的主题等直指安全问题,使得信息安全问题成为近些年科学研究的热点。在过去的十几年中,漏洞数量增长迅速,对美国国家漏洞数据库(nationalvulnerabilitydatabase,nvd)从2002年到2019年5月份的数据统计显示,漏洞总数高达121279条,其中包括未知漏洞类型38868条。面对如此海量的计算机漏洞,传统的人工漏洞分类方法局限性愈加明显,如何对其进行有效的分类管理显得尤为重要。为了减少系统被攻击和破坏的风险,降低漏洞修复的成本,有效提高漏洞分类管理的效率,漏洞自动化分类模型的研究越来越受到重视。
近些年来,机器学习算法被越来越多的应用在漏洞分类领域中,以实现漏洞的自动分类。hovsepyana等人提出了一种新颖的软件组件的漏洞预测方法,该方法将机器学习与文本分析技术结合对软件漏洞源码进行分析,并取得了较好的效果。dumiduwijayasekara等人通过使用来自错误描述的文本信息,对
但是由于软件漏洞的种类和数量比较多,每一条漏洞的描述信息相对较少,使得每条漏洞在生成的词向量空间上呈现出高维度和稀疏的特点。这些基于机器学习算法漏洞自动分类方法在处理高维和稀疏问题上表现的效果不是很好,而且不能很好地提取文本特征和表征语义信息,同时忽略了特定的漏洞信息,而使得软件漏洞分类的准确性不高。
技术实现要素:
本发明的目的是提供一种软件漏洞的分类方法及系统,以提高软件漏洞分类的准确性。
为实现上述目的,本发明提供了如下方案:
本发明提供一种软件漏洞的分类方法,所述分类方法包括如下步骤:
从漏洞数据库中获取训练集和测试集;
构建c-gru模型(将卷积神经网络(convolutionalneuralnetwork,cnn)和循环神经网络(gatedrecurrentunit,gru)进行结合构建的模型);
采用所述训练集和所述测试集训练和测试所述c-gru模型,得到训练后的c-gru模型;
获取软件漏洞文本集;
采用skip-gram语言模型将每条漏洞文本中的词映射到预设维数的空间中,生成漏洞词向量,得到每条漏洞文本的二维文本特征矩阵;
将所述二维文本特征矩阵输入所述训练后的c-gru模型进行分类,获得分类结果。
可选的,所述c-gru模型包括嵌入层、卷积层、最大池化层、gru层和输出层。
可选的,所述采用skip-gram语言模型将每条漏洞文本中的词映射到预设维数的空间中,生成漏洞词向量,得到每条漏洞文本的二维文本特征矩阵,具体包括:
采用skip-gram语言模型基于无监督学习算法训练生成漏洞文本中每个词的预设维数的漏洞词向量;
将漏洞文本中的所有词的漏洞词向量纵向堆叠,生成所述漏洞文本的二维文本特征矩阵。
可选的,所述采用skip-gram语言模型基于无监督学习算法训练生成漏洞文本中每个词的预设维数的漏洞词向量,具体包括:
将所述漏洞文本中的第i个词输入所述skip-gram语言模型获得第i个词的初始预设维数输出向量,并利用目标函数计算初始的目标函数值;
采用负样本对第i个词进行更新,得到第j次迭代的第i个词;
将所述第j次迭代的第i个词输入所述skip-gram语言模型获得第i个词的第j次迭代预设维数输出向量;
采用公式
判断第j次迭代的目标函数值与第j-1次迭代的目标函数值的差值是否小于预设阈值,得到第一判断结果;
若所述第一判断结果表示差值小于预设阈值,则判断迭代次数是否小于预设迭代次数,得到第二判断结果;
若所述第二判断结果表示所述迭代次数小于所述预设迭代次数,则采用负样本对第j次迭代的第i个词进行更新,得到第j+1次迭代的第i个词,令迭代次数的数值增加1,返回步骤“将所述第j次迭代的第i个词输入所述skip-gram语言模型获得第i个词的第j次迭代预设维数输出向量”;
若所述第二判断结果表示所述迭代次数不小于所述预设迭代次数,则输出第i个词的第j次迭代预设维数输出向量作为第i个词的预设维数的漏洞词向量;
若所述第一判断结果表示差值不小于预设阈值,则输出第i个词的第j次迭代预设维数输出向量作为第i个词的预设维数的漏洞词向量。
可选的,所述采用skip-gram语言模型将每条漏洞文本中的词映射到预设维数的空间中,生成漏洞词向量,得到每条漏洞文本的二维文本特征矩阵,之前还包括:
过滤漏洞文本的标点符号和特殊字符,得到过滤后的漏洞文本;
将过滤后的漏洞文本中的大写字符转换成小写字符,得到转换后的漏洞文本;
将转换后的漏洞文本中的英文单词转换成名词形式,得到形式转化后的漏洞文本;
过滤所述形式转化后的漏洞文本中的停用词,得到预处理后的漏洞文本。
本发明还提供一种软件漏洞的分类系统,所述分类系统包括:
训练集和测试集获取模块,用于从漏洞数据库中获取训练集和测试集;
c-gru模型构建模块,用于构建c-gru模型;
c-gru模型训练和测试模块,用于采用所述训练集和所述测试集训练和测试所述c-gru模型,得到训练后的c-gru模型;
漏洞文本集获取模块,用于获取软件漏洞文本集;
漏洞文本映射模块,用于采用skip-gram语言模型将每条漏洞文本中的词映射到预设维数的空间中,生成漏洞词向量,得到每条漏洞文本的二维文本特征矩阵;
分类模块,用于将所述二维文本特征矩阵输入所述训练后的c-gru模型进行分类,获得分类结果。
可选的,所述c-gru模型包括嵌入层、卷积层、最大池化层、gru层和输出层。
可选的,所述漏洞文本映射模块,具体包括:
漏洞词向量训练生成子模块,用于采用skip-gram语言模型基于无监督学习算法训练生成漏洞文本中每个词的预设维数的漏洞词向量;
纵向堆叠子模块,用于将漏洞文本中的所有词的漏洞词向量纵向堆叠,生成所述漏洞文本的二维文本特征矩阵。
可选的,所述漏洞词向量训练生成子模块,具体包括:
初始化单元,用于将所述漏洞文本中的第i个词输入所述skip-gram语言模型获得第i个词的初始预设维数输出向量,并利用目标函数计算初始的目标函数值;
更新单元,用于采用负样本对第i个词进行更新,得到第j次迭代的第i个词;
向量输出单元,用于将所述第j次迭代的第i个词输入所述skip-gram语言模型获得第i个词的第j次迭代预设维数输出向量;
目标函数值计算单元,用于采用公式
第一判断单元,用于判断第j次迭代的目标函数值与第j-1次迭代的目标函数值的差值是否小于预设阈值,得到第一判断结果;
第二判断单元,用于若所述第一判断结果表示差值小于预设阈值,则判断迭代次数是否小于预设迭代次数,得到第二判断结果;
第二判断结果处理单元,用于若所述第二判断结果表示所述迭代次数小于所述预设迭代次数,则采用负样本对第j次迭代的第i个词进行更新,得到第j+1次迭代的第i个词,令迭代次数的数值增加1,返回步骤“将所述第j次迭代的第i个词输入所述skip-gram语言模型获得第i个词的第j次迭代预设维数输出向量”;若所述第二判断结果表示所述迭代次数不小于所述预设迭代次数,则输出第i个词的第j次迭代预设维数输出向量作为第i个词的预设维数的漏洞词向量;
第一判断结果处理单元,用于若所述第一判断结果表示差值不小于预设阈值,则输出第i个词的第j次迭代预设维数输出向量作为第i个词的预设维数的漏洞词向量。
可选的,所述分类系统,还包括:
第一过滤模块,用于过滤漏洞文本的标点符号和特殊字符,得到过滤后的漏洞文本;
大小写转换模块,用于将过滤后的漏洞文本中的大写字符转换成小写字符,得到转换后的漏洞文本;
形式转化模块,用于将转换后的漏洞文本中的英文单词转换成名词形式,得到形式转化后的漏洞文本;
第二漏洞模块,用于过滤所述形式转化后的漏洞文本中的停用词,得到预处理后的漏洞文本。
根据本发明提供的具体实施例,本发明公开了以下技术效果:
本发明提供一种软件漏洞的分类方法及系统。所述分类方法使用skip-gram语言模型进行漏洞词向量的训练和生成,将每条漏洞文本中的词映射到有限维度的空间中,以此表征语义信息,降低了词向量的稀疏性,然后充分利用卷积神经网络和循环神经网络提取特征和表征语义信息的优势,构建了c-gru神经网络模型,利用卷积神经网络提取文本向量的局部特征,利用gru提取与文本上下文相关的全局特征,将两种互补模型提取的特征进行融合。本发明克服了基于机器学习算法漏洞自动分类方法在处理高维和稀疏问题上表现的效果不是很好,而且不能很好地提取文本特征和表征语义信息,同时忽略了特定的漏洞信息的技术缺陷,能更好的提取漏洞特征,表征语义信息,同时也能更好的处理词向量空间的高维性和稀疏性。在提高了软件分类准确性的同时,在召回率、精度和f1-score等指标中均具有很好的性能。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明提供的一种软件漏洞的分类方法的流程图;
图2为本发明提供的一种软件漏洞的分类方法的原理图;
图3为本发明提供的gru模型的结构示意图;
图4为本发明提供的c-gru模型的结构示意图;
图5为本发明提供的skip-gram语言模型的结构示意图;
图6为本发明提供的一种软件漏洞的分类系统的流程图。
具体实施方式
本发明的目的是提供一种软件漏洞的分类方法及系统,以提高软件漏洞分类的准确性。
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对发明作进一步详细的说明。
如图1和2所示,本发明提供一种软件漏洞的分类方法,所述分类方法包括如下步骤:
步骤101,从漏洞数据库中获取训练集和测试集。
使用美国国家计算机通用漏洞数据库(nationalvulnerabilitydatabase,nvd)中的漏洞数据进行软件漏洞分类研究。首先从美国国家计算机通用漏洞数据库获取训练集和测试集。但是本发明的实施所使用的漏洞数据库不限于美国国家计算机通用漏洞数据库。
步骤102,构建c-gru模型。
本发明将卷积神经网络(cnn)和循环神经网络(gru)进行结合构建了c-gru模型。
cnn的结构主要包括:输入层,卷积层和最大池化层。其中卷积层和池化层组合而成的特征抽取器在c-gru模型中具有重要的影响,尤其是对网络结构复杂度的简化,以及模型参数个数的减少有着显著的作用。
输入层(embeddinglayer)的输入是基于word2vec训练的词向量矩阵。首先将词wn利用word2vec转化为对应的词向量v(wn),并将由词wn组成的句子映射为句子矩阵sj,句子矩阵sj作为cnn的嵌入层(输入层)的向量矩阵,句子矩阵表示如下:
sj={v(w1),v(w2),...,v(wn)}
其中,v(wn)∈rk,sj∈rm*k,k表示词向量的维度,m表示句子的个数。
卷积层(convolutionlayer)能够很好地对输入数据的局部特征进行描述,本文使用大小为r·k的滤波器对句子矩阵sj进行卷积操作,提取sj的局部特征。公式如下:
ci=f((r·k)·xi:i+r-1+b
其中,f表示非线性激活函数,该模型使用relu激活函数,xi:i+r-1表示sj中i:i+r-1的r行向量,b表示偏置向量,ci表示通过卷积操作得到的局部特征。
滤波器以步长为1从上往下进行滑动,走过整个sj,最终得到局部特征的向量集合c。
c=[c1,c2,...,cn-r+1]
最大池化层(max-pooling)是在卷积操作的基础之上进一步提取局部特征中最重要的部分。池化操作大大降低特征向量的大小。
gru是lstm的一个变体,在保留lstm效果的同时,使结构更加简单,迭代速度也更快。如图3所示gru包括两个门控结构,分别为重置门rt和更新门zt。
gru内部结构的具体计算公式如下:
rt=σ(xtur+ht-1wr+br)
xt=σ(xtuz+ht-1wz+bz)
ct=tanh(xtuc+rt⊙ht-1wc+bc)
ht=(1-zt)⊙ht-1+zt⊙ct
yt=σ(woht+bo)
其中,ht-1为t-1时刻隐藏层的输出,xt为t时刻的输入,ht为t时刻隐藏层的输出,rt表示重置门,zt表示更新门,ct表示t时刻隐藏层节点的候选值,yt表示输出,u、w表示参数矩阵,b表示偏置向量,⊙表示矩阵元素相乘,σ表示sigmoid激活函数。
为了将输出层转换为分类类别的概率分布,添加softmax层,计算公式如下:
其中,yj表示类别j的输出,pj表示类别j的概率,j表示类别总数。
使用交叉熵损失函数计算模型的损失,交叉熵损失计算公式如下:
其中,y(i)为样本i的真实标签,
本发明的c-gru模型设置如下:
如图4所示,c-gru模型主要包括嵌入层,卷积层,最大池化层,gru层和输出层。
其中嵌入层是50*300的二维矩阵,卷积层的滤波器为3*300的二维矩阵,向下移动的步长为1,卷积层之后使用relu激活函数,最大池化层的池化窗口大小设置为2,gru层的神经元个数设置为256,使用dropout防止模型过拟合,其dropout值设置为0.5,输出层的神经元个数设置为16,并且使用softmax作为输出层的激活函数。使用交叉熵损失函数计算该模型的损失,使用adam优化器最小化损失函数,模型训练的批次大小设置为800,迭代次数设置为25。
步骤103,采用所述训练集和所述测试集训练和测试所述c-gru模型,得到训练后的c-gru模型。
步骤104,获取软件漏洞文本集。
对所述漏洞文本集进行预处理,预处理的过程为:
(1)去除标点符号和特殊字符
过滤漏洞文本的标点符号和特殊字符(与office中的特殊字符相同,包括:长划线—,短划线–,版权所有
(2)分词并将所有字符的大写转换为小写
将过滤后的漏洞文本中的大写字符转换成小写字符,得到转换后的漏洞文本。对漏洞文本进行分词是指将连贯的漏洞文本信息切分成一个一个的单词,即将整个漏洞文本信息转换为可以通过统计学进行统计的最小语义单元。对于英文描述的漏洞文本,分词是非常简单的,只需要通过识别文本之间的空格或者标点符号即可将整条漏洞文本划分成一个一个的单词。然后将单词中所有字母的大写形式转换为字母的小写形式。
(3)词形还原
将转换后的漏洞文本中的英文单词转换成名词形式,得到形式转化后的漏洞文本。词形还原是把一个任何形式的英文单词还原为名词形式,即将英文描述中的动词根据人称不同而变化的单词转换为动词原形;将名词的复数形式转换为名词的单数形式;将动名词形式转换为动词原形等,这些词都应该属于同一类的语义相近的词。
(4)停用词过滤
过滤所述形式转化后的漏洞文本中的停用词,得到预处理后的漏洞文本。停用词过滤是指在漏洞文本中频繁出现且对文本信息的内容或分类类别贡献不大甚至无贡献的词语,如常见的介词、冠词、助词、情态动词、代词以及连词等对于漏洞分类来说毫无意义,因此这类词语应该被过滤掉。本文使用的英文通用停用词表对漏洞信息进行停用词过滤。
步骤105,采用skip-gram语言模型将每条漏洞文本中的词映射到预设维数的空间中,生成漏洞词向量,得到每条漏洞文本的二维文本特征矩阵。
skip-gram语言模型结构如图5所示。skip-gram模型主要包括输入层(input)、投影层(hidden)和输出层(output),其基本原理是输入wn的词向量去预测wn的上下文词wn-2,wn-1,wn+1,wn+2所对应的词向量。
输入层单词是经过one-hot编码的词向量,给出一系列的训练词(w1,w2,w3,…,wn),该模型的优化目标函数取平均对数似然函数,公式如下:
其中,s是训练上下文的大小,即窗口的大小,n是词汇表中的单词数,wn是中心词。
输出层使用softmax函数求出每个词的概率,此概率的大小表示词典中每个词与输入词(inputword)同时出现的可能性。公式如下:
其中,
为了提高词向量的训练效率,本文使用负采样(negativesampling,ns)来优化skip-gram模型,ns的主要思想是选择部分负样本(非目标特征词)对正样本(目标特征词)的相关参数(“输出向量”)进行更新。其目标函数如下:
其中,wo是指输入的正样本,
本发明使用基于word2vec提供的skip-gram语言模型进行词向量的训练和生成,将每条文本中的词映射到有限维数的空间中,在该空间内,通过映射关系实现词与词的位置关系来反应它们在语义层面的联系。skip-gram语言模型通过无监督算法来训练出词的分布式特征表示,即wordembedding,然后将每条文本的所有wordembedding纵向堆叠即可得到二维文本特征矩阵。具体包括:采用skip-gram语言模型基于无监督学习算法训练生成漏洞文本中每个词的预设维数的漏洞词向量;将漏洞文本中的所有词的漏洞词向量纵向堆叠,生成所述漏洞文本的二维文本特征矩阵。
其中,采用skip-gram语言模型基于无监督学习算法训练生成漏洞文本中每个词的预设维数的漏洞词向量,具体包括:将所述漏洞文本中的第i个词输入所述skip-gram语言模型获得第i个词的初始预设维数输出向量,并利用目标函数计算初始的目标函数值;采用负样本对第i个词进行更新,得到第j次迭代的第i个词;将所述第j次迭代的第i个词输入所述skip-gram语言模型获得第i个词的第j次迭代预设维数输出向量;采用公式
本发明使用的word2vec中基于skip-gram语言模型的词分布式表示方法对漏洞实验数据集进行词向量的训练和生成,同时使用了负采样的方法对skip-gram模型进行优化,来提高词向量的训练效率。将漏洞数据作为词向量训练语料库,skip-gram训练生成的词向量维度设置为300,将语料中词频小于10的词去掉,使用负采样进行优化时的采样个数设置为5。
步骤106,将所述二维文本特征矩阵输入所述训练后的c-gru模型进行分类,获得分类结果。
如图6所示,本发明还提供一种软件漏洞的分类系统,所述分类系统包括:
训练集和测试集获取模块601,用于从漏洞数据库中获取训练集和测试集;
c-gru模型构建模块602,用于构建c-gru模型。
所述c-gru模型包括嵌入层、卷积层、最大池化层、gru层和输出层。
c-gru模型训练和测试模块603,用于采用所述训练集和所述测试集训练和测试所述c-gru模型,得到训练后的c-gru模型;
漏洞文本集获取模块604,用于获取软件漏洞文本集。
所述漏洞文本映射模块604,具体包括:漏洞词向量训练生成子模块,用于采用skip-gram语言模型基于无监督学习算法训练生成漏洞文本中每个词的预设维数的漏洞词向量;纵向堆叠子模块,用于将漏洞文本中的所有词的漏洞词向量纵向堆叠,生成所述漏洞文本的二维文本特征矩阵。
其中,所述漏洞词向量训练生成子模块,具体包括:初始化单元,用于将所述漏洞文本中的第i个词输入所述skip-gram语言模型获得第i个词的初始预设维数输出向量,并利用目标函数计算初始的目标函数值;更新单元,用于采用负样本对第i个词进行更新,得到第j次迭代的第i个词;向量输出单元,用于将所述第j次迭代的第i个词输入所述skip-gram语言模型获得第i个词的第j次迭代预设维数输出向量;目标函数值计算单元,用于采用公式
漏洞文本映射模块605,用于采用skip-gram语言模型将每条漏洞文本中的词映射到预设维数的空间中,生成漏洞词向量,得到每条漏洞文本的二维文本特征矩阵;
分类模块606,用于将所述二维文本特征矩阵输入所述训练后的c-gru模型进行分类,获得分类结果。
所述分类系统,还包括:
第一过滤模块,用于过滤漏洞文本的标点符号和特殊字符,得到过滤后的漏洞文本;
大小写转换模块,用于将过滤后的漏洞文本中的大写字符转换成小写字符,得到转换后的漏洞文本;
形式转化模块,用于将转换后的漏洞文本中的英文单词转换成名词形式,得到形式转化后的漏洞文本;
第二漏洞模块,用于过滤所述形式转化后的漏洞文本中的停用词,得到预处理后的漏洞文本。
根据本发明提供的具体实施例,本发明公开了以下技术效果:
本发明提供一种软件漏洞的分类方法及系统。所述分类方法使用skip-gram语言模型进行漏洞词向量的训练和生成,将每条漏洞文本中的词映射到有限维度的空间中,以此表征语义信息,降低了词向量的稀疏性,然后充分利用卷积神经网络和循环神经网络提取特征和表征语义信息的优势,构建了c-gru神经网络模型,利用卷积神经网络提取文本向量的局部特征,利用gru提取与文本上下文相关的全局特征,将两种互补模型提取的特征进行融合。本发明克服了基于机器学习算法漏洞自动分类方法在处理高维和稀疏问题上表现的效果不是很好,而且不能很好地提取文本特征和表征语义信息,同时忽略了特定的漏洞信息的技术缺陷,能更好的提取漏洞特征,表征语义信息,同时也能更好的处理词向量空间的高维性和稀疏性。在提高了软件分类准确性的同时,在召回率、精度和f1-score等指标中均具有很好的性能。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。
本文中应用了具体个例对发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。