VulDeePecker:基于深度学习的漏洞检测系统
(华中科技大学、河北大学网络安全与计算机学院深圳华中科技大学科学研究院§德克萨斯大学圣安东尼奥分校计算机科学系)
问题:需要一些指导原则来将深度学习应用于漏洞检测。特别是需要找到适合深度学习的软件程序的表示形式。(解决:使用代码小工具来表示程序,然后将它们转换为向量,其中代码小工具是在语义上相互关联的若干行代码(不一定是连续的));为了评估VulDeePecker,提出了第一个用于深度学习方法的漏洞数据集。评估原则有:1,VulDeePecker能够同时处理多种类型的漏洞吗?2,人类的专业知识能帮助提高VulDeePecker的效率吗?3,与其他漏洞检测方法相比,VulDeePecker的有效性如何?
现有的检测漏洞的解决方案有两个主要的缺点: 强加大量的手工劳动和产生高的假阴性率
文章核心:针对以下漏洞检测问题提出了一种解决方案:给定目标程序的源代码,如何确定目标程序是否存在漏洞,如果存在漏洞,漏洞在哪里?
A. How to represent software programs?
提出一种中间表示,称为代码小工具:将程序表示为对漏洞检测具有语义意义的向量,中间表示作为矢量表示,作为神经网络的输入。
Defining code gadget
为了生成代码小工具,提出了启发式的关键点概念,它可以被视为一个“镜头”,通过它,可以从某个角度表示程序。直观地说,关键点的启发式概念在某种意义上可以看作是漏洞的“中心”或暗示漏洞存在的代码片段。
文章重点讨论如何利用库/API函数调用的特定关键点来证明其在基于深度学习的漏洞检测中的有效性。(对应于库/API函数调用的关键点,可以通过程序的数据流或控制流分析的方式生成代码小工具)
B. What is an appropriate granularity?(什么是适当的粒度)
不仅需要检测一个程序是否存在漏洞,而且需要确定漏洞的位置,因此基于深度学习的漏洞检测应该使用更细的粒度。 代码小工具表示导致了漏洞检测的细粒度粒度,因为代码小工具通常只包含少量的代码行。
C. How to select neural networks?
神经网络在图像处理、语音识别、自然语言处理等不同于漏洞检测的领域已经非常成功。
因为一行代码是否包含漏洞可能取决于上下文,能够处理上下文的神经网络可能适合于漏洞检测。这一原则表明,用于自然语言处理的神经网络可能适合于漏洞检测,因为上下文在自然语言处理中也很重要。
用于自然语言处理的循环神经网络,神经网络存在着消失梯度问题。使用双向的LSTM用于漏洞检测(BLSTM)。
BLSTM neural network 1. a dense layer 2. a softmax layer
BLSTM层有两个方向:向前和向后
BLSTM中包含一些复杂的LSTM cells,文章中被视为黑盒。稠密层减少了从BLSTM层接收的向量的维数。softmax层将从密集层接收到的低维向量作为输入,负责对分类结果进行表示和格式化,为学习阶段的神经网络参数更新提供反馈。学习阶段的输出是一个具有微调模型参数的BLSTM神经网络,检测阶段的输出是分类结果。
Overview of VulDeePecker
VulDeePecker有两个阶段:学习(即训练)阶段和检测阶段。
(一)学习阶段的输入是大量的培训项目,其中一些是脆弱的,而另一些则不是,这里所说的“脆弱”是指一个程序包含一个或多个已知的漏洞。学习阶段的输出是漏洞模式,这些模式被编码到BLSTM神经网络中。学习阶段分为4个步骤。
步骤一:提取库/API函数调用和相应的程序片。这有两个分步骤:
•从培训程序中提取库/API函数调用。
•为提取的库/API函数调用的每个参数(或变量)提取一个或多个程序切片。一个程序块代表一个程序的语句(即行代码)语义相关论点的库/ API函数调用。
(库/API函数调用分为两类:向前库/API函数调用和向后库/API函数调用。Forward库/API函数调用是直接从外部输入(如命令行、程序、套接字或文件)接收一个或多个输入的函数调用。反向库/API函数调用是指不从程序运行的环境中直接接收任何外部输入的函数调用。两种切片:前向切片和后向切片,其中前向切片对应于受相关参数影响的语句,后向切片对应于可影响相关参数的语句)
步骤二:生成训练程序的代码小工具和它们的ground truth标签。
•步骤一中获得的程序片段组装成代码小工具,每个库/API函数调用一个代码小工具。
•标记代码小工具的基本事实。此步骤将每个代码小工具标记为“1”(即脆弱)或“0”(即不脆弱)。代码小工具的ground truth标签是可用的,因为知道一个培训程序是否易受攻击,如果它易受攻击,也知道漏洞的位置。
步骤三:将代码小工具转换为向量表示。
•将代码小工具转换为特定的符号表示,这一步的目的是保存训练程序的一些语义信息。
•将得到的符号表示中的代码小部件编码成向量,作为训练BLSTM神经网络的输入。
(将标记转换为向量,使用word2vec工具因为它在文本挖掘中被广泛使用。这个工具基于分布式表示的思想,它将一个令牌映射到一个整数,然后转换为固定长度的向量。由于代码小工具可能有不同数量的标记,相应的向量可能有不同的长度。而BLSTM取等长向量作为输入,so需要做一个调整。引入一个参数τ作为对应于代码小部件的向量的固定长度)
步骤四:训练BLSTM神经网络。将编码小工具编码成向量并获得它们的ground truth标签后,学习BLSTM神经网络的训练过程。
(二)检测阶段:给定一个或多个目标程序,提取库/API函数调用以及相应的程序片,将其组装成代码小工具。代码小工具被转换成它们的符号表示,这些符号表示被编码成向量,用作训练好的BLSTM神经网络的输入。网络输出哪些向量,因此哪些代码小工具是脆弱的(“1”)或不脆弱的(“0”)。如果代码小工具容易受到攻击,它就会锁定目标程序中漏洞的位置。
步骤五:将目标程序转化为代码工具和矢量。
•1:从目标程序中提取库/API函数调用(类似于步骤I.1)。
•2:根据库/API函数调用的参数提取程序片(类似于步骤I.2)。
•3:将程序切片组装成代码小工具(类似于步骤II.1)。
•4:将代码小工具转换为它们的符号表示(类似于步骤III.1)。
•5:将代码小工具的符号表示编码成向量
步骤六:检测。这一步使用学习过的BLSTM神经网络对从目标程序中提取的代码小工具对应的向量进行分类。当一个向量被分类为“1”(即脆弱)时,这意味着对应的代码小工具是脆弱的,并且确定了脆弱的位置。否则,相应的代码小工具被分类为“0”(即不脆弱)。
注原文:VulDeePecker: A Deep Learning-Based System for Vulnerability Detection