一种基于文本深度学习的软件安全漏洞预测方法与流程

文档序号:15462784发布日期:2018-09-18 18:34阅读:310来源:国知局

本发明涉及一种基于文本深度学习的软件安全漏洞预测方法,属于软件安全漏洞预测技术领域。



背景技术:

软件安全漏洞预测能够预先获知软件源代码模块中存在软件漏洞的可能性或者数量,软件开发者根据预测结果,可将有限的时间和经费有针对性投入到那些存在漏洞可能性高的和数量多的软件模块的测试中,以此提高软件测试的效率。

目前,常用的软件漏洞预测采用浅层机器学习方法建立软件漏洞预测模型,建立过程如图1所示:

①软件源代码模块的度量元建立

目前,软件源代码模块的度量元建立主要有两种方法:一种方法是采用度量软件代码质量的指标(metrics)作为度量元,如将面向对象程序的CK指标(WMC、DIT、NOC、CBO、RFC和LCOM等)、面向软件开发过程的代码修改特征指标、开发人员经验水平指标、模块间的依赖度指标以及项目团队组织构架合理性指标等作为度量元,我们称此为基于软件指标的度量元;另一种方法是将软件源代码视为文本,将文本中各个单词出现的频率视为度量元,我们称此为基于代码文本单词的度量元。

②软件历史漏洞数据库建立

从已经公开的软件漏洞库中收集针对某个软件项目的到目前的所有漏洞,建立针对该软件项目的软件漏洞库。软件漏洞库中明确了针对该软件项目每个软件模块中漏洞的位置和数量。

软件漏洞库提供了针对该软件项目的漏洞分布的历史知识。

③软件漏洞预测机器学习模型的训练、测试

针对某个软件项目,计算每个软件模块的度量元指标的具体数值,利用软件历史漏洞库获得每个软件模块的有无漏洞的标签或者缺陷数量,然后选择适合于该软件项目的机器学习算法(目前还没有公开的资料表明使用了深度学习算法,使用的都是基于浅层学习的算法),将度量元指标的具体数值作为输入,有无缺漏洞的标签或者漏洞数量作为输出,建立(训练、测试和参数调整)针对于该软件项目的软件漏洞预测的机器学习模型。

④软件漏洞预测机器学习模型的应用

训练完成以及测试合格的漏洞预测模型可以对该项目的新的软件模块的漏洞情况进行预测。首先计算新的软件模块的度量元指标的具体数值,将数值输入到预测模型中,模型运算输出的结果即为该软件模块存在漏洞的可能性或者存在漏洞的数量。

在整个模型建立的过程中,影响预测模型性能的因素有三个方面:度量元指标选取、漏洞库的质量以及具体的机器学习算法。所选取的度量元指标应当能够反映有漏洞模块和没有漏洞模块的本质特征,也就是度量元指标对有漏洞和没有漏洞模块具有一定的区分能力;软件漏洞库的质量也在很大程度上影响到模型的性能,所建立的软件漏洞库应当具有较高的准确性和较好的完备性;机器学习算法本身也具有不同的性能,针对不同的软件项目,选取适合于本项目的机器学习算法。这三个方面的因素是相互联系相互影响的,综合决定了这个预测模型的性能。

在历史漏洞库的质量既定的情况下,针对某类度量元指标,不同的机器学习算法的性能差异较大,目前针对不同的机器学习算法进行了大量的尝试,但是所有采用的算法属于浅层机器学习方法,未有公开的资料表明有人使用深度学习方法。

现有的资料表明,在大多数情况下,基于代码文本单词的度量元的预测效果要明显优于基于软件指标的度量元的预测效果。实际情况发现,在采用代码文本单词作为度量元的预测方法中,度量元的维度通常会很高,有时甚至超过一万维,且这些维度特征是稀疏的。此种情况下,目前常采用的基于浅层学习的机器学习算法,相对于深度学习而言,特征学习效果较差,直接导致漏洞预测的效果存在不足。大量的研究和实践表明,在特征维度很高且稀疏性很强的情况下,深度学习的学习能力要明显优于浅层学习,这是由于深度学习能够自动学习高维特征中的结构性特征,达到对特征进行压缩和降维的目的。



技术实现要素:

本发明为一种基于文本深度学习的软件安全漏洞预测方法,采用深度神经网络模型和浅层机器学习算法从历史软件源代码文本中学习特征和知识,能够用于对新的软件源代码中的安全漏洞进行预测。

本发明通过以下技术方案实现:

一种基于文本深度学习的软件安全漏洞预测方法,针对软件的源代码,以其中的软件模块为处理单元,统计每个单词在整个文本中出现的次数,并将出现次数进行归一化处理得到单词出现的频率,将单词及单词出现的频率作为该源代码文本的特征向量,该特征向量作为基于深度神经网络结构的特征学习器的输入,特征学习器对其进行学习得到特征向量的结构性特征,该结构性特征作为分类器的输入,对分类器的参数进行训练调整,获得最优的漏洞预测模型,用于该软件的新的软件模块的漏洞预测。

进一步地,所述特征向量采用以下方式提取:以预测对象中的软件模块为处理单元,首先对源代码文本中出现的标点符号以及代码注释进行剔除,对剩下的文本以空格作为分隔符将每个单词进行提取,并统计每个单词在整个文本中出现的次数,最后将出现次数进行归一化处理,处理的结果即是单词出现的频率,由此得到针对该源代码文本的特征向量。

进一步地,源代码文本的特征向量采用如下表示形式:

ComponentName:(Item_1:Number_1;Item_2:Number_2;…;Item_n:Number_n)

其中,ComponentName表示该模块的名称,Item_1表示第1个单词的名称,Number_1表示第1个单词出现的频率,Item_2表示第2个单词的名称,Number_2表示第2个单词出现的频率,此次类推,Item_n表示第n个单词的名称,Number_n表示第n个单词出现的频率。

进一步地,所述分类器采用浅层机器学习算法。

进一步地,所述分类器的输出为二分类,即所预测对象的模块是否具有漏洞。

进一步地,针对预测对象使用不同的深度神经网络模型和不同的分类器算法建立多种漏洞预测模型,对比性能指标值,确定最优的漏洞预测模型。

本发明的有益效果:本发明采用深度神经网络模型学习软件源代码文本特征中的结构性特征,再将学习到的特征作为分类器的输入,其优点是软件源代码文本单词特征向量是一种维度很高且稀疏性很强的特征,现有的浅层机器学习算法处理能力有限,采用深度学习算法首先学习得到结构性特征,达到特征降维的目的,再将学习得到的特征作为浅层学习算法的输入,这样能够提高漏洞预测模型的性能指标,使得漏洞预测模型具有精度高,虚警率和漏警率均较低的优点。

附图说明

图1为现有技术中软件漏洞预测采用浅层机器学习方法流程图;

图2为本发明的基于文本深度学习的软件安全漏洞预测方法流程图;

图3为本发明中漏洞预测模型的结构图;

图4为本发明中基于栈式自编码器结构的特征学习器。

具体实施方式

下面结合附图对本发明作进一步介绍。

如图2所示,本发明的基于文本深度学习的软件安全漏洞预测方法包括以下步骤:

步骤一、软件源代码文本单词特征提取

针对某个软件项目的源代码(即预测对象),以其中的软件模块为处理单元,首先对模块源代码文本中出现的标点符号以及代码注释进行剔除,对剩下的文本以空格作为分隔符将每个单词进行提取,并统计每个单词在整个文本中出现的次数,最后将出现次数进行归一化处理,处理的结果即是单词出现的频率,由此得到针对该模块源代码文本的特征向量,设为如下表示形式:

ComponentName:(Item_1:Number_1;Item_2:Number_2;…;Item_n:Number_n)

其中,ComponentName表示该模块的名称,Item_1表示第1个单词的名称,Number_1表示第1个单词出现的频率,Item_2表示第2个单词的名称,Number_2表示第2个单词出现的频率,此次类推,Item_n表示第n个单词的名称,Number_n表示第n个单词出现的频率。

步骤二、建立软件历史漏洞库

从公开的软件漏洞库中搜集针对该软件项目(预测对象)的所有公开的软件漏洞,这些公开的漏洞资料同时给出了每个漏洞所处的软件模块中的具体位置,由此可确定每个软件模块所有出现过的历史漏洞数量,称为该软件模块的漏洞标签。如果针对某个软件模块,没有发现有针对该模块的公开漏洞,则认为该软件模块的漏洞数量为零。针对漏洞标签进一步处理:如果漏洞标签不等于0,则统一设置为1,如果漏洞标签为0,则仍然设置为0,这样,漏洞标签要么为1,要么为0,只表示有无。

步骤三、建立基于深度神经网络结构的特征学习器

在步骤一的基础上,选择适合于文本单词特征学习的深度神经网络模型。软件源代码文本单词的主要特性是单词之间并没有语义联系,这些特征之间的关联性并不强,因此适合的深度神经网络模型有多种,以其中的一种为例,例如以栈式自编码器结构的深度神经网络为例,其结构如图4所示,其中,输入层有n个输入特征量x1,x2,…,xn,分别对应步骤一中提取的单词特征量Item_1,Item_2,…,Item_n,当单词特征量的数量n确定后,选择对应的神经网络输入端,例如单词特征量有5个,则选择输入端相应的5个作为输入,隐层具有h层,每层的神经元的数量分别是k1、k2、…、kh,隐层神经元的数量逐层减少,即k1<k2<…<kh。输出层的神经元的数量为m个。每层神经元之间为全连接,输入层的神经元不参与计算。神经元的激活函数采用Sigmoid函数。特征学习器中隐层的层数以及每层中神经元的数量根据实际情况具体确定。

步骤四、建立分类器

在步骤三的基础上,建立漏洞预测模型的分类器,分类器的输入是步骤三中建立的特征学习器的输出,也就是第三步中学习得到的特征。分类器采用浅层机器学习算法,可选择的浅层机器学习算法有多种,如LogisticRegression算法、SVM,NN,贝叶斯网络等;分类器的输出为二分类,即0或1,表示所预测对象的模块是否具有漏洞,当输出不为0或1时,则调整步骤三中特征学习器中神经网络模型的参数或分类器的模型参数,直到输出为0或1。经过实验证明,调整分类器的模型参数更容易优化得到输出为0或1。

步骤五、对预测模型进行训练和测试

在步骤一、二、三、四的基础上对预测模型进行训练和测试,具体方法如下:利用步骤一的方法提取每个软件模块的文本特征向量,利用步骤二的方法建立预测对象的历史漏洞库,从而得到预测对象的每个模块的漏洞标签。所有特征向量和对应的标签构成了该软件项目的样本库。将样本库分成两部分,一部分用于训练,为训练样本;一部分用于测试,为测试样本。将训练样本的文本特征向量作为步骤三的输入,对步骤三建立的特征学习器的每层单独进行训练。训练方法采用对应于所使用的深度神经网络结构的训练算法。此过程称为预训练,预训练过程既是对原始特征的降维以及结构性特征的学习过程。以栈式自编码器结构的深度神经网络为例,利用贪心法基于BP算法逐层对其进行训练,训练过程中计算反向传播误差时使用的输出值与输入值相等。

训练过程结束后,将特征学习器的输出作为步骤四中的分类器的输入,对分类器的参数进行训练调整,根据对应于具体学习算法的判断标准,获得最优的分类器的参数值。以LogisticRegression分类器为例,将特征学习器的输出作为LogisticRegression分类器的输入,使用梯度下降算法对LogisticRegression分类器参数进行调整,当代价函数取得最小值时既得LogisticRegression分类器的最优参数,此时分类器的训练过程结束。

在预训练和分类器参数调整过程结束后,整个漏洞预测模型的训练结束。接下来采用测试样本对模型的性能进行测试,获得性能指标的具体值,这些性能指标包括精度、准确度、虚警率、漏警率等。

步骤六、根据性能指标确定最优预测模型

针对预测对象,使用不同的深度神经网络结构模型和不同的分类器算法建立多种漏洞预测模型,在步骤五的基础上,获得每个预测模型的性能指标值。对比性能指标,根据实际需求,确定适合于本软件项目的最优的漏洞预测模型。例如,在某些情况下,需要将精度指标放在第一位,此时选择精度指标最高的漏洞预测模型即可;而在有些情况下,需要将准确度指标放在第一位,此时应选择准确度指标最高的漏洞预测模型。

步骤七、将预测模型应用于新的软件模块

将步骤六中获得的性能最优的预测模型应用于该软件项目的新的软件模块的漏洞预测。首先计算新的软件模块特征向量值,将计算结果作为预测模型的输入,模型运行的输出即为该新的软件模块是否具有漏洞的标签。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1