“千里之堤,溃于蚁穴”,软件漏洞是网络攻击广泛存在的根本原因。由于漏洞在软件开发过程中不可避免,尽早发现软件程序中的漏洞尤为重要。深度学习是一个极具潜力的漏洞自动检测技术,因为它不需要人类专家手动定义特征。尽管深度学习在图像处理、语音识别、自然语言处理等领域取得了很大成功,但在漏洞检测领域目前没有系统研究。为了填补这一空白,提出了第一个利用深度学习检测漏洞的系统框架SySeVR。该框架基于语法、语义和向量表征,获取包含漏洞相关的语法和语义信息的程序表示,通过训练深度神经网络模型来检测漏洞。针对4个软件产品进行实验,检测到了美国国家漏洞库NVD中未报告的15个漏洞,其中7个漏洞是未知的,已向供应商报告,另外8个漏洞在发布新版本产品时已由供应商默默修补,验证了该框架的有效性。
该成果“SySeVR: A Framework for Using Deep Learning to Detect Software Vulnerabilities”于2022年发表在IEEE Transactions on Dependable and Secure Computing的第19卷4期上,是实验室在软件安全领域的研究成果。IEEE Transactions on Dependable and Secure Computing主要关注计算机及网络安全、可信计算等领域的前沿研究,是中国计算机学会CCF推荐的A类期刊。
论文链接:https://ieeexplore.ieee.org/document/9321538
背景与动机
鉴于软件开发过程中漏洞不可避免,尽可能早且准确地识别软件中的漏洞至关重要。基于源代码的静态分析是检测漏洞的重要方法,包括基于代码相似性的漏洞检测方法和基于模式的漏洞检测方法。基于代码相似性的漏洞检测方法能够检测代码克隆引起的漏洞,但是当检测不是由代码克隆引起的漏洞时具有非常高的漏报率;基于模式的漏洞检测方法通常需要人类专家定义漏洞特征,然而复杂的漏洞代码使得很难定义准确的漏洞特征。理想的漏洞检测方法需要在能够检测由多种原因导致的漏洞同时,尽可能减少对人类专家的依赖。
我们在前期工作中提出了基于深度学习的漏洞检测系统VulDeePecker,在切片级别(语义相关的代码语句)检测软件漏洞,虽然展示了使用深度学习来检测漏洞的可行性,但VulDeePecker还具有以下不足:
(1)VulDeePecker仅考虑检测与库/API函数调用相关的漏洞,实际上还有很多其他类型的漏洞;
(2)VulDeePecker仅利用数据依赖相关的语义信息,实际上有些漏洞的存在与控制依赖相关;
(3)VulDeePecker仅考虑双向长短期记忆网络BLSTM,实际上还有很多其他神经网络,这些神经网络应用到漏洞检测的效果如何尚不清楚;
(4)VulDeePecker没有对造成误报和漏报原因进行解释。
本工作的主要贡献是提出了第一个基于深度学习检测漏洞的系统框架SySeVR,该框架可用于检测各种类型的漏洞,支持各种神经网络模型,重点解决以下问题:如何表征程序中的语法和语义信息,从而更有效地用于漏洞检测?首先定义了基于语法的候选漏洞代码(SyVC)和基于语义的候选漏洞代码(SeVC),其中SyVC反映漏洞的语法特征,SeVC通过扩展SyVC来包含数据依赖和控制依赖相关的语义信息;然后设计了用于生成SyVC和SeVC的算法;同时解决了VulDeePecker的上述不足。
设计与实现
在图像处理领域,依据纹理、边缘、颜色等可以从一幅图像中提取多个候选区域,将每个候选区域作为神经网络检测目标对象的单位。当将深度学习用于漏洞检测时,程序中没有很自然的类似图像中候选区域的结构表示。对于程序代码而言,如果使用函数作为候选区域,粒度太粗,无法定位漏洞的具体位置;如果使用语句作为候选区域,会导致分割了代码语句之间的语义信息。因此,采用语句的集合作为候选区域,将程序划分为与候选漏洞相关的容纳语法和语义特征的代码片段,以此为单位进行漏洞检测。图1展示了基于深度学习的漏洞检测框架SySeVR,依次生成SyVC和SeVC,对SeVC进行向量表征后,对深度学习模型进行训练和漏洞检测。
图1 候选区域及SySeVR框架
SyVC包含了符合某种漏洞语法特征的代码元素(例如库/API函数调用、数组使用、指针使用和运算表达式)。图2以一个程序为例展示了SyVC、SeVC和向量3种不同的表征。图中采用矩形框突出显示的SyVC是根据漏洞的某些语法特征提取的代码元素;SeVC通过扩展SyVC来包括与SyVC在语义上相关的语句,即存在控制依赖和/或数据依赖关系的语句;最后将每个SeVC编码成向量,输入到深度神经网络。
图2 SyVC、SeVC和向量表征
下面介绍提取SyVC、SeVC和SeVC向量表征的具体过程。首先提取SyVC,SyVC包含了符合漏洞语法特征的代码元素,例如图2中18行的data是一次指针使用,因为第9行出现了‘*’号说明data是指针类型。借助抽象语法树来实现SyVC的提取,对于每一个函数,首先生成函数的抽象语法树,抽象语法树的根节点表示函数,叶子节点表示token,中间节点表示多个连续的token,可用于漏洞检测的代码元素是抽象语法树的叶子节点或中间节点。遍历抽象语法树的节点,如果该节点满足某一条漏洞规则,则将该节点对应的一个或多个token加入到SyVC集合中。
接下来是将每个SyVC生成对应的SeVC。SeVC是与SyVC存在控制依赖或数据依赖关系的语句集合,借助代码切片技术提取SeVC。首先生成源代码的程序依赖图(PDG),对于PDG中每个SyVC,生成前向切片和后向切片。然后,融合前向切片和被该函数调用的函数的前向切片,得到过程间前向切片;融合后向切片、被该函数调用的函数的后向切片以及调用该函数的函数的后向切片,得到过程间后向切片;融合过程间前向切片和过程间后向切片得到程序切片。程序切片中的所有函数语句构成一个集合,对于不同函数的语句而言,调用者的语句在被调用者的语句之前。图3是一个以图中25行的data为SyVC的一个SeVC生成例子,体现了从PDG到切片,再到SeVC的完整过程。
图3 从源代码到SeVC的转换例子
最后将SeVC编码为向量。对于每个SeVC,删除不合法字符,对函数名和变量名进行映射;将SeVC中每个单词编码成固定长度的向量,将这些向量连接在一起,并通过截断或补全将向量长度设置为固定值;之后给每个SeVC加标签,有漏洞的SeVC标签为1,没有漏洞的SeVC标签为0。这些向量作为深度神经网络的输入,进行后续的模型训练和漏洞检测。
实验结果
实验主要针对SySeVR是否可以采用各种类型的神经网络来进行漏洞检测、考虑控制依赖能否使SySeVR更加有效以及SySeVR与现有最先进的方法的效果比较等方面开展。实验中,将SySeVR分别应用到6个神经网络,包括线性逻辑回归(LR)、多层感知机(MLP)、深度信念网络(DBN)、卷积神经网络(CNN)、长短期记忆(LSTM)、门控循环单元(GRU)、双向长短期记忆(BLSTM)和双向门控循环单元(BGRU)。SySeVR使用不同神经网络训练后的漏洞检测效果如表1所示,可以看出,使用BGRU神经网络的漏洞检测效果最好,RNN比CNN更好,CNN比浅层网络更好,且漏报率高于误报率。
表1 SySeVR使用不同神经网络的漏洞检测结果(单位:%)
SySeVR在各个模型上只使用数据依赖(DD)和同时使用数据依赖和控制依赖(DDCD)的模型结果比较如表2所示。可见看出,与只使用数据依赖的模型相比,同时使用数据依赖和控制依赖的模型能够平均改进漏报率FNR 30.4%,平均改进综合指标F1值24.0%。这是因为控制依赖容纳了漏洞检测额外的有用信息,能够在很大程度上提升模型的效果。
表2 SySeVR在各模型上只使用数据依赖和同时使用数据依赖和控制依赖的效果比较(单位:%)
将采用BGRU的SySeVR模型(即SySeVR-BGRU)与开源静态检测工具Flawfinder和RATS、商业工具Checkmarx、开源克隆漏洞检测工具VUDDY、深度学习漏洞检测工具VulDeePecker 进行了比较,结果如表3所示,可以看出,SySeVR-BGRU模型在误报率FPR、漏报率FNR、准确率A、精确率P、综合指标F1值和马修斯相关系数MCC指标上均显著优于其它方法,验证了SySeVR的有效性。将SySeVR-BGRU模型用来检测4个实际软件(Libav、Seamonkey、Thunderbird和Xen)的多个版本中的漏洞,检测结果如表4所示。可以看出,SySeVR-BGRU检测到了美国国家漏洞库NVD中未报告的15个漏洞,其中7个漏洞是未知的,已向供应商报告,它们的漏洞原理与某些已发布的CVE原理类似,表3中标注了对应的CVE号;另外8个漏洞在发布新版本产品时已由供应商默默修补。
表3 SySeVR与其他漏洞检测工具检测结果的比较(单位:%)
表4 SySeVR检测出实际软件中的漏洞
详细内容请参见:
Zhen Li, Deqing Zou, Shouhuai Xu, Hai Jin, Yawei Zhu, Zhaoxuan Chen. SySeVR: A Framework for Using Deep Learning to Detect Software Vulnerabilities. IEEE Transactions on Dependable and Secure Computing, 2022, 19(4): 2244-2258.
https://ieeexplore.ieee.org/document/9321538
声明:本文来自穿过丛林,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。