基于自然语言处理与深度森林的Java漏洞分类方法技术

技术编号:36428712 阅读:16 留言:0更新日期:2023-01-20 22:39
本发明专利技术公开了一种基于自然语言处理与深度森林的Java漏洞分类方法,属于源代码漏洞挖掘和分类技术领域;本发明专利技术的主要内容有漏洞源代码特征提取与表示、漏洞源代码分类方法两方面;针对当前Java源代码静态分析方法效率低、误报率高的问题,将源代码解析为抽象语法树并通过基于NLP的ASTNN编码层将抽象语法树切割成表达式子树,两次遍历表达式子树得到语句序列并通过多粒度扫描得到源代码最终向量表示,然后将向量表示通过级联森林进行分类。实验选择OWASP漏洞数据集作为样本,验证了本文所提Java源代码漏洞分类方法的有效性。Java源代码漏洞分类方法的有效性。Java源代码漏洞分类方法的有效性。

【技术实现步骤摘要】
基于自然语言处理与深度森林的Java漏洞分类方法


[0001]本专利技术公开了一种Java源代码漏洞分类方法,尤其涉及一种基于自然语言处理与深度森林的Java源代码漏洞分类方法,属于源代码漏洞挖掘和分类


技术介绍

[0002]近年来随着软件规模的扩大和代码复杂度的不断提高,软件漏洞的数量也不断增长,根据漏洞知识库网站CVE details发布的数据,2021年业界向通用漏洞披露知识库(Common Vulnerabilities&Exposures,简称CVE)提交了20169个漏洞,较2020年的18325个增长了1844个且呈逐年增长态势。除了数量的增长,软件漏洞的形态也呈现出复杂性和多样性,给计算机系统的正常安全运行带来的威胁日益增大。
[0003]传统的漏洞挖掘方法主要有静态分析与动态分析两种,动态分析如符号执行等方法存在路径爆炸、约束求解难、内存建模与并行处理复杂等问题,因此动态分析方法不适用于代码规模巨大的项目以及批量漏洞挖掘;而静态分析技术对源代码的匹配规则取决于专家知识构造的漏洞模式,且因为硬编码到分析工具中导致其不具有泛化性,所以静态检测方法通常误报率较高。
[0004]基于机器学习的漏洞挖掘方法与传统静态分析不同,其通过学习隐藏在历史漏洞数据中的信息,挖掘漏洞数据中的特征并用于漏洞挖掘问题,因此漏洞样本代码表示的数量和有效性决定了模型最终的性能。由于代码度量、token序列等特征表示方法包含的源代码语法结构和语义信息较少,在其基础上训练得到的模型准确率较低。为此有研究尝试以包含代码语法、语义及上下文信息的代码中间表示作为特征来训练漏洞挖掘模型。有实验表明:基于抽象语法树的机器学习模型能较好地均衡模型效率及性能。现有的基于抽象语法树的代码表示方法根据特征抽取方式的不同,可以分为路径信息表示和节点信息表示两类。这两种表示法在性能表现上相似,但由于抽象语法树的路径数量大,所以基于路径信息表示的模型训练时间相对较长。

技术实现思路

[0005](一)要解决的技术问题
[0006]本专利技术要解决的技术问题是解决现有的代码漏洞挖掘静态分析中存在的误报率高、泛化性差的问题。
[0007](二)技术方案
[0008]为了解决上述技术问题,本专利技术提供了一种基于自然语言处理与深度森林的Java漏洞分类方法,包括以下步骤:
[0009]S1、获取或选择漏洞数据集,将数据集划分为训练数据集与测试数据集;
[0010]S2、对所述数据集进行数据预处理;
[0011]S3、将训练数据集源代码解析为抽象语法树,为测试数据集创建对应的测试标签集;
[0012]S4、采用ASTNN模型对抽象语法树进行处理,一棵抽象语法树首先被分割为包含若干棵表达式子树的列表;
[0013]S5、对表达式子树列表中的每一棵表达式子树进行一次先序遍历以及后序遍历,获得两组节点标签集合作为语料库训练Word2Vec模型;
[0014]S6、对表达式子树列表中的各表达式子树进行第二次先序遍历和后序遍历,同时修剪去除其中无关节点的信息得到节点集合,通过S5训练得到的Word2Vec模型将各节点转为d维向量v
n
;对每一棵表达式子树的d维向量使用式2进行递归更新得到一颗抽象语法树的向量表示;
[0015][0016]其中,为权重矩阵,n表示表达式子树的一个非叶子节点,T为矩阵转置操作,d为词嵌入的向量维数,k为编码维数,C为节点n对应的子节点数量,b
n
为偏差,σ为激活函数,h
i
为节点n的子节点i更新后的向量;
[0017]S7、使用深度森林进行训练,同时使用测试标签集对生成的深度森林进行测试,获得Java代码漏洞分类模型。
[0018]其中,S6中修剪方式为在遍历过程中首先判断表达式子树的根节点是否为注释声明、包声明等无关节点,若是此类节点则丢弃,仅保留必要的语义信息进行编码。
[0019]进一步,S7中深度森林由多粒度扫描和级联森林两部分组成,在多粒度扫描中引入矩阵转置和最大池化的预处理阶段以处理变长输入,得到表达式子树的最终向量表示。
[0020]具体地,使用得到的表达式子树最终向量表示表示一棵抽象语法树,将多粒度扫描的滑动窗口以及步长控制为1,即以表达式子树为单位扫描抽象语法树的局部特征并送入级联森林生成类向量。
[0021]更具体地,所述级联森林的第1层将多粒度扫描的输出作为输入,并在此后的每一层决策中都将上一层级联森林的输出拼接为下一层的输入。在训练过程中,级联森林每增加一层就使用测试标签集中的样本对已经生成的深度森林进行测试,如果准确率小于上一层的准确率,级联森林层数不再增加;否则继续增加级联层,直到测试集的准确率小于前一层的准确率为止,在深度森林停止生长后,最后一层的级联森林对所有输出的概率向量取均值,输出具有最大概率的标签类别作为最终漏洞分类的决策结果。
[0022](三)有益效果
[0023]本专利技术的上述技术方案具有如下优点:
[0024]本专利技术改进ASTNN编码层的源代码表示法:对ASTNN编码层处理类级Java文件时包含的的无关信息进行修剪,并对抽象语法树进行先序和后序两种遍历以减少信息损失;针对抽象语法树的特点改进多粒度扫描,增加矩阵转置和最大池化的预处理阶段以处理变长序列输入,将定长的滑动窗口改为按表达式子树序列进行扫描,在保证特征提取效果的前提下减少训练时长;设计对照试验,利用漏洞代码数据集对本专利技术提供的方法进行实验,验证模型优异的精确性和有效性。
[0025]本专利技术使用改进的ASTNN编码层算法对抽象语法树进行编码,并以ASTNN编码层的输出代表抽象语法树使用改进多粒度扫描将其转换为向量,最后使用级联森林进行训练,
以获得Java代码漏洞分类模型。本专利技术改进ASTNN的编码层的源代码表示法并将其与深度森林结合,应用于Java源代码漏洞分类问题,通过实验表明基于NLP和深度森林的深度学习模型用于Java漏洞挖掘的可行性,是对源代码漏洞挖掘领域一种有意义的补充。本专利技术的分类模型具有比较优异的精确性和有效性。
[0026]本专利技术在提高模型效率的同时更好地保留了抽象语法树所包含的语义信息,最终实验结果表明,基于改进后ASTNN网络的漏洞挖掘方法相对于传统的漏洞挖掘方法具有更高的准确率及召回率。
[0027]除了上述所描述的本专利技术解决的技术问题、构成的技术方案的技术特征以及有这些技术方案的技术特征所带来的优点之外,本专利技术的其他技术特征及这些技术特征带来的优点,将结合附图作出进一步说明。
附图说明
[0028]为了更清楚地说明本专利技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本专利技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
[0本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.基于自然语言处理与深度森林的Java漏洞分类方法,其特征在于:包括以下步骤:S1、获取或选择漏洞数据集;S2、对所述数据集进行数据预处理;S3、将源代码解析为抽象语法树;S4、采用ASTNN模型对抽象语法树进行处理,一棵抽象语法树首先被分割为包含若干棵表达式子树的列表;S5、对表达式子树列表中的每一棵表达式子树进行一次先序遍历以及后序遍历,获得两组节点标签集合作为语料库训练Word2Vec模型;S6、对表达式子树列表中的各表达式子树进行第二次先序遍历和后序遍历,同时修剪去除其中无关节点的信息得到节点集合,通过S5训练得到的Word2Vec模型将各节点转为d维向量v
n
;对每一棵表达式子树的d维向量使用式2进行递归更新得到一颗抽象语法树的向量表示;其中,为权重矩阵,n表示表达式子树的一个非叶子节点,T为矩阵转置操作,d为词嵌入的向量维数,k为编码维数,C为节点n对应的子节点数量,b
n
为偏差,σ为激活函数,h
i
为节点n的子节点i更新后的向量;S7、使用深度森林进行训练,同时使用测试标签集对生成的深度森林进行测试,获得Java代码漏洞分类模型。2.根据权利要求1所述的基于自然语言处理与深度森林的Java漏洞分类方法,其特征在于:S6中修剪方式...

【专利技术属性】
技术研发人员:丁家满符纬康
申请(专利权)人:昆明理工大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1