基于seq2seq代码表示学习的细粒度漏洞检测方法技术

技术编号:34739927 阅读:20 留言:0更新日期:2022-08-31 18:31
本发明专利技术公开了一种基于seq2seq代码表示学习的细粒度漏洞检测方法,首先,提取漏洞候选关键节点作为切片准则,再使用程序切片技术提取程序中的切片代码段。然后,使用基于seq2seq深度学习模型,对切片代码段进行表示学习,生成包含语句间长依赖关系的语句向量表示序列,将序列中每条语句的向量表示送入检测器中,检测其是否为漏洞语句。该方法能够充分利用代码中的全局和局部语义信息,学习语句内和语句间的漏洞相关的特征,避免传统的基于深度学习分类模型对代码表示学习时难以捕获漏洞语句及其上下文之间的长依赖信息的问题,利用seq2seq模型对代码进行表示学习生成的语句向量表示序列,更适合语句级的细粒度漏洞检测。更适合语句级的细粒度漏洞检测。更适合语句级的细粒度漏洞检测。

【技术实现步骤摘要】
基于seq2seq代码表示学习的细粒度漏洞检测方法


[0001]本专利技术涉及一种软件漏洞细粒度检测方法,具体涉及一种基于seq2seq代码表示学习的细粒度漏洞检测方法。

技术介绍

[0002]漏洞被定义为计算机系统中的安全缺陷,它不仅威胁到了系统本身,也使系统难以保障应用数据的机密性、完整性和可用性,并危及系统的安全。近年来,随着系统规模和复杂度的增加以及新技术的引入,软件漏洞发生的可能性不断上升。自动检测漏洞是减少漏洞的一个重要手段。然而,目前基于深度学习的漏洞检测研究大部分集中在文件、函数或片段等粗粒度级别上,即只能预测文件、函数或代码包含漏洞的可能性,在这种情形下,开发人员人工定位漏洞语句的难度较大,导致漏洞不能及时被修复。因此,研究语句级的细粒度漏洞检测方法,更有助于开发者理解并快速修复漏洞,也是目前漏洞检测研究的趋势。近几年,虽然也有少量关于细粒度漏洞检测方法的研究,然而其定位精度仍有待提高。漏洞信息分布的稀疏性和不连续性、漏洞语句间的上下文依赖性、漏洞特征的复杂性和隐蔽性都对细粒度的漏洞检测提出了挑战。

技术实现思路

[0003]本专利技术的目的是提供一种基于seq2seq代码表示学习的细粒度漏洞检测方法,该方法能够充分利用代码中的全局和局部语义信息,学习语句内和语句间的漏洞相关的特征,避免传统的基于深度学习分类模型对代码表示学习时难以捕获漏洞语句及其上下文之间的长依赖信息的问题,利用seq2seq模型对代码进行表示学习生成的语句向量表示序列,更适合语句级的细粒度漏洞检测。
[0004]本专利技术的目的是通过以下技术方案实现的:
[0005]一种基于seq2seq代码表示学习的细粒度漏洞检测方法,首先,提取漏洞候选关键节点作为切片准则,再使用程序切片技术提取程序中的切片代码段。然后,使用基于seq2seq深度学习模型,对切片代码段进行表示学习。具体地,首先使用seq2seq模型编码器中的语句编码网络,对切片代码段语句内的token序列进行表示学习,生成包含局部语义信息的语句初级向量表示。再以得到的每条语句的初级向量表示构成的语句序列作为输入,使用编码器中的程序编码网络对语句向量序列进行表示学习,生成包含语句上下文信息的语句高级向量表示。然后,使用基于自注意力和文本注意力的双重注意力机制先后学习程序中语句之间的依赖关系和漏洞相关的全局语义信息。最后,以编码器生成的语句高级向量表示作为输入并结合全局语义信息,使用seq2seq模型编码器中的解码器网络来生成包含语句间长依赖关系的语句最终向量表示序列,将序列中每条语句的最终向量表示送入检测器中,检测每条语句是否为漏洞语句。具体包括如下步骤:
[0006]步骤1:利用静态解析工具解析源代码,生成抽象语法树和程序依赖图;
[0007]步骤2:利用抽象语法树提取源代码的漏洞候选关键节点作为切片准则,生成源代
码的切片代码段,并对其进行标准化处理,得到命名标准化后的切片代码段;
[0008]步骤3:使用seq2seq深度学习模型编码器中的语句编码网络对切片代码段语句内的token序列进行表示学习,生成包含局部语义信息的语句初级向量表示;
[0009]步骤4:以步骤3中得到的每条语句的初级向量表示构成的语句序列作为输入,使用seq2seq深度学习模型编码器中的程序编码网络对语句序列进行表示学习,生成包含语句上下文信息的语句高级向量表示;
[0010]步骤5:将步骤4中得到的语句高级向量表示构成的语句序列送入基于自注意力和文本注意力的双重注意力模块中,通过自注意力学习语句间的依赖关系,再通过文本注意力学习漏洞相关的全局语义信息;
[0011]步骤6:将步骤5得到的漏洞相关的全局语义信息和步骤4中得到的语句高级向量表示构成的语句序列作为输入,送入seq2seq深度学习模型的解码器网络中学习语句间的长依赖信息,生成语句的最终向量表示;
[0012]步骤7:将步骤6得到的每条语句最终向量表示送入由多层感知器MLP和softmax层构成的检测器网络得到该语句有无漏洞的预测结果,利用该语句的标签信息计算交叉熵损失函数,根据误差反向传播调整网络参数,直到损失值不再下降为止,训练结束;
[0013]步骤8:用训练好的模型对代码进行语句级的细粒度漏洞检测。
[0014]本专利技术基于seq2seq的深度学习模型用于对代码进行表示学习,其中,编码器中的语句编码网络用于提取语句内token之间的依赖关系,获取局部语义信息;程序编码网络用于学习语句间的上下文信息;双重注意力机制用于获取漏洞相关的全局语义信息;解码器网络用于获取语句间的长依赖关系;检测器网络用于输出语句有无漏洞的预测结果。
[0015]现有漏洞检测方法都是基于卷积神经网络、循环神经网络或图神经网络等深度学习模型对代码进行表示学习来实现漏洞检测。不同于现有方法,本专利技术提出了一种基于seq2seq代码表示学习的细粒度漏洞检测方法,该方法首次将seq2seq模型用于语句级的细粒度漏洞检测任务。与传统的基于深度学习的二分类模型不同的是,常用于机器翻译任务的seq2seq模型可以直接实现语句到语句的映射,seq2seq模型由编码器(encoder)和解码器(decoder)构成,编码器的作用是将输入的不定长的样本程序语句序列编码为固定长度的语句高级向量表示,而解码器则是将编码器输出的语句高级向量表示重新解码为不定长的程序语句向量表示序列。因此,就模型结构而言,其序列生成结果可以直接应用于语句级的漏洞检测。另一方面,seq2seq模型能够同时考虑样本程序中语句的局部和全局语义信息。由于漏洞语句对上下文具有高度的依赖性,而常规的RNN或CNN模型通常只能提取相邻语句之间较短的依赖关系,难以捕获距离较远的语句之间的长依赖信息。相比之下,seq2seq模型通过对样本程序中所有漏洞相关的语句进行编码,并将其与基于双重注意力机制获取的全局语义信息共同用于指导解码器中语句向量序列的生成,可以生成更准确的语句向量表示序列,并且语句序列生成结果可直接用于语句级的细粒度漏洞检测。
[0016]相比现有技术,本专利技术具有如下优点:
[0017](1)本专利技术提出的利用seq2seq深度学习模型直接对基于程序切片技术生成的切片代码段进行表示学习的方法,能够充分利用和学习漏洞代码的局部和全局语义信息,并且这种基于序列生成模型得到的语句向量表示更有利于实现语句级的细粒度漏洞检测。
[0018](2)本专利技术在seq2seq模型的编码器(Encoder)和解码器(Decoder)之间引入基于
自注意力和文本注意力的双重注意力机制,能够在学习全局语义信息的同时有效地学习程序语句对漏洞的重要程度,从而提高语句级细粒度漏洞检测的准确率。
附图说明
[0019]图1是本专利技术源代码细粒度漏洞检测方法的流程示意图。
[0020]图2是漏洞代码实例。
[0021]图3是语句级的细粒度漏洞检测过程。
具体实施方式
[0022]下面结合附图对本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于seq2seq代码表示学习的细粒度漏洞检测方法,其特征在于所述方法包括如下步骤:步骤1:利用静态解析工具解析源代码,生成抽象语法树和程序依赖图;步骤2:利用抽象语法树提取源代码的漏洞候选关键节点作为切片准则,生成源代码的切片代码段,并对其进行标准化处理,得到命名标准化后的切片代码段;步骤3:使用seq2seq深度学习模型编码器中的语句编码网络对切片代码段语句内的token序列进行表示学习,生成包含局部语义信息的语句初级向量表示;步骤4:以步骤3中得到的每条语句的初级向量表示构成的语句序列作为输入,使用seq2seq深度学习模型编码器中的程序编码网络对语句序列进行表示学习,生成包含语句上下文信息的语句高级向量表示;步骤5:将步骤4中得到的语句高级向量表示构成的语句序列送入基于自注意力和文本注意力的双重注意力模块中,通过自注意力学习语句间的依赖关系,再通过文本注意力学习漏洞相关的全局语义信息;步骤6:将步骤5得到的漏洞相关的全局语义信息和步骤4中得到的语句高级向量表示构成的语句序列作为输入,送入seq2seq深度学习模型的解码器网络中学习语句间的长依赖信息,生成语句的最终向量表示;步骤7:将步骤6得到的每条语句最终向量表示送入由多层感知器MLP和softmax层构成的检测器网络得到该语句有无漏洞的预测结果,利用该语句的标签信息计算交叉熵损失函数,根据误差反向传播调整网络参数,直到损失值不再下降为止,训练结束;步骤8:用训练好的模型对代码进行语句级的细粒度漏洞检测。2.根据权利要求1所述的基于seq2seq代码表示学习的细粒度漏洞检测方法,其特征在于所述步骤3的具体步骤如下:步骤31:将切片代码段中的语句拆分成token,使用预训练好的word2vec词嵌入模型得到每个token的向量表示,组成token向量矩阵;步骤32:将步骤31生成的token向量矩阵送入由GRU实现的语句编码网络,学习得到每个token的隐藏向量表示,通过可学习的权重对所有token的隐藏向量表示进行加权求和,得到语句的初级向量表示。3.根据权利要求2所述的基于seq2seq代码表示学习的细粒度漏洞检测方法,其特征在于所述步骤32的具体计算公式如下:z=σ(W
z
·
w
t
+U
z
·
h
(t

1)
+b
z
)r=σ(W
r
·
w
t
+U
r
·
h
(t

1)
+b
r
)))其中,z和r分别代表更新门和重置门,σ为激活函数,w
t
表示语句中第t个token的初始向
量表示,h
t
和分别代表第t个token的隐藏状态和中间的暂时状态,W
z
、W
r
、W
h
、U
z
、U
r
、U
h
、U
t
是可学习的权重参数,b
z
、b
r
、b
h
为偏置项,x为语句向量表示,n为语句中token的总数。4.根据权利要求1所述的基于seq2seq代码表示学习的细粒度漏洞检测方法,其特征在于所述步骤4的具体步骤如下:步骤41:对切片代码段中语句的向量表示进行padding,得到由语句向量组成的初始化语句向量矩阵;步骤42:将步骤41生成的初始化语句向量矩阵,送入由BiGRU实现的程序编码网络,学习得到程序中语句的隐藏向量表示。5.根据权利要求4所述的基于seq2seq代码表示学习的细粒度漏洞检测方法,其特征在于所述步骤42的具体计算公式如下:于所述步骤42的具体计算公式如下:于所述步骤42的具体计算公式如下:其中,x
i
表示切片代码段中第i个语句的向...

【专利技术属性】
技术研发人员:苏小红蒋远郑伟宁陶文鑫王甜甜
申请(专利权)人:哈尔滨工业大学
类型:发明
国别省市:

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

1