基于深度学习的细粒度漏洞检测框架VulDeeLocator

自动检测软件漏洞是一个引起学术界广泛关注的重要问题,然而现有的漏洞检测方法均无法达到实际应用所需的漏洞检测能力和定位精度。本研究提出了一个基于深度学习的可以同时实现高检测能力和高定位精度的漏洞检测器VulDeeLocator。主要针对以下问题:如何容纳跨文件中类型和宏定义之间的语义关系,如何容纳精确的控制流和变量的定义-使用关系,以及如何实现高定位精度。VulDeeLocator采用两个创新的想法解决了上述问题:(i)利用中间代码来容纳额外的语义信息,以及 (ii)使用粒度细化的概念来确定漏洞的位置。当应用到3个实际软件产品中随机选择的200个文件时,VulDeeLocator检测到18个漏洞。其中,16个漏洞对应已知漏洞;其他两个未在美国国家漏洞库( NVD) 中报告,但在发布新版本时已由 Libav 供应商默默修补。

该成果“VulDeeLocator: A Deep Learning-Based Fine-Grained Vulnerability Detector”于2022年发表在IEEE Transactions on Dependable and Secure Computing的第19卷4期上,是实验室在软件安全领域的研究成果。IEEE Transactions on Dependable and Secure Computing主要关注计算机及网络安全、可信计算等领域的前沿研究,是中国计算机学会CCF推荐的A类期刊。

  • 论文链接:https://ieeexplore.ieee.org/document/9416836

背景与动机

尽管学术界和工业界在不断提高软件质量,在追求安全编程方面投入了大量精力,但软件漏洞仍然广泛存在,成为网络攻击的主要原因。消除漏洞的一种重要方法是设计漏洞检测器来检测它们,一个理想的漏洞检测器应该同时具有高检测能力和高定位精度,以精确定位包含漏洞的代码行。

最近,基于机器学习的漏洞检测器开始采用深度学习技术,在程序切片级别检测漏洞。这类漏洞检测器可以缓解手动定义特征的问题,然而目前仍然不能提供较高的检测能力和定位精度。目前先进的漏洞检测器SySeVR不能提供较高的检测能力,主要原因可以归于以下两点:①无法捕获跨程序文件的语义相关语句之间的关系;②无法容纳准确的控制流和变量的“定义-使用”关系。然而,这两点原因均通过直接分析源代码无法很好解决,由于目前基于深度学习的漏洞检测器不能获取足够的语义信息,导致漏洞检测效果不佳。

在定位精度方面,由于对程序切片进行操作,而一个程序切片可以有许多行代码,因此即使在切片粒度上进行漏洞检测,其定位精度也比较低。粗粒度漏洞检测只是漏洞评估的一个前置步骤,不能精确定位漏洞。

设计与实现

为了解决上述问题,我们为C语言源代码软件设计了一个基于深度学习的细粒度漏洞检测器VulDeeLocator。VulDeeLocator的基本思想是充分利用程序分析和深度学习技术:利用程序分析技术生成候选漏洞,利用深度学习技术消除程序分析引起的误报。具体来说,VulDeeLocator根据给定的一组漏洞语法特征从程序源代码中提取一些标记(例如标识符、运算符、常量和关键字),然后利用中间代码来容纳与这些标记相关语句的语义。这些语句被编码成向量,作为训练神经网络的输入来进行漏洞检测。测试阶段的输出比相应的输入具有更细的粒度。

VulDeeLocator的结构框架如图1所示,可以使用特定的中间代码表示和深度学习模型对其进行实例化。VulDeeLocator的输入是用于学习神经网络的训练程序源代码或用于漏洞检测的目标程序。具体来说,训练阶段的输入包括C语言程序的源代码,它可能包含漏洞也可能不包含漏洞。训练使用的C语言程序的源代码应满足以下条件:①可以被编译成中间代码,如LLVM中间代码;②含有漏洞的程序需附有对其漏洞位置的描述,这将用于定位程序中的漏洞。在较高层次上,VulDeeLocator包含两个组件,第一个组件生成训练程序和目标程序的中间代码表示,第二个组件使用基于中间代码的表示来进行细粒度漏洞检测。

图1  VulDeeLocator框架

在基于中间代码的漏洞候选表征组件中,VulDeeLocator从输入源代码中提取sSyVC,sSyVC是根据某些漏洞语法特征从程序中提取的一段代码。我们利用已知漏洞的语法特征,并通过程序源代码的抽象语法树来表示这些特征,具体来说,定义了以下四种漏洞语法特征:库/API函数调用、数组定义、指针定义以及算术表达式。给定程序的源代码,可以生成其抽象语法树,通过识别与某些漏洞语法特征匹配的节点的类型和代码,可以从中提取sSyVC。图2(a) 展示了一个程序中sSyVC的示例(红色矩形框部分)。在提取sSyVC后,VulDeeLocator会生成其中间表示(IR)切片iSeVC。具体来说,VulDeeLocator使用Clang编译器为原程序文件生成IR文件,并根据依赖关系链接IR文件。通过从链接的IR文件中提取控制和数据依赖关系来生成依赖关系图,根据sSyVC对依赖图进行切片,即可得到IR切片。在生成iSeVCs的过程中,VulDeeLocator会考虑函数调用关系,根据控制依赖或数据依赖关系,尽可能保留属于不同函数但彼此相关的语句。生成的iSeVC则是细粒度漏洞检测的输入。

图2  sSyVC和iSeVC的生成示例

在细粒度漏洞检测组件中,首先需要标注生成的iSeVC。VulDeeLocator按以下方式标注iSeVC:如果iSeVC包含已知漏洞,则会标记漏洞所在行号,否则,iSeVC会被标记为“0”,即不包含已知漏洞。由于漏洞数据集应提供源程序中间代码中漏洞的位置,因此源程序中漏洞的这些行号需要映射到中间代码中的行号,这可以通过利用调试信息附带的文本LLVM文件来完成。标注完毕后,每个iSeVC都需要编码成一个向量,该向量用作神经网络的输入。为了使iSeVC在捕获程序语义信息时独立于用户定义的函数名称,我们将用户定义的函数名称映射到统一的符号名称(例如,“FUN1”,“FUN2”),使用词嵌入技术将其编码为向量。在神经网络模型上,VulDeeLocator使用了如图3所示的BRNN-vdl结构,在标准BRNN架构上增加了三个额外的层,即multiple层、k-max池化层和平均池化层,来实现粒度细化和注意力机制。BRNN-vdl的输入包括iSeVC的表征向量以及表示每个iSeVC漏洞位置的矩阵。

图3  BRNN-vdl模型

实验结果

实验主要针对VulDeeLocator引入的基于中间代码的漏洞候选表示和BRNN-vdl模型来探究VulDeeLocator各改进方法在漏洞检测和定位上的提升效果。同时,VulDeeLocator也在测试数据集和真实软件上与具有代表性的漏洞检测工具进行对比,验证了VulDeeLocator在漏洞检测和定位上的有效性和先进性。

VulDeeLocator首先比较了使用基于源代码的漏洞候选表示sSeVC与基于中间代码的漏洞候选表示iSeVC的漏洞检测效果。实验使用了误报率FPR、漏报率FNR、准确率A、精确率P和F1分数等深度学习常见指标作为漏洞检测能力的评价指标,定位精度采用漏洞行IoU交并比和平均检测漏洞行数目 |V|指标进行衡量。实验结果如表1所示,可以看出,在使用相同模型的情况下,iSeVC能够有效提升漏洞检测效果。对于同一种漏洞候选表示,使用BRNN-vdl模型相较于BRNN模型也能对漏洞检测效果有较大提升。因此,实验证明了VulDeeLocator引入的iSeVC和BRNN-vdl模型的有效性。

表1  使用不同漏洞候选表示与深度学习模型的效果对比

在验证了VulDeeLocator有效性后,VulDeeLocator使用了两种不同的BRNN模型:BLSTM和BGRU,与先进的具有代表性的漏洞检测器进行了对比。在基于源代码和规则的漏洞检测器中,选取了开源工具Flawfinder和商业产品Checkmarx进行对比;在基于中间代码和规则的漏洞检测器中,选取了商业产品Fortify进行对比;在基于二进制代码和规则的漏洞检测器中,选取了开源的污点式漏洞检测器Saluki进行对比;实验还选取了两个基于深度学习的漏洞检测器VulDeePecker和SySeVR。实验结果如表2所示,表明了VulDeeLocator在测试数据集上的检测能力和定位精度相较于现有工具均有较大提升,且VulDeeLocator-BGRU优于VulDeeLocator-BLSTM。

表2  VulDeeLocator与先进的漏洞检测器的实验结果对比

最后,论文在三个真实软件产品(FFmpeg 2.8.2、Wireshark 2.0.5、Libav 9.10)的主要模块中随机选择了200个程序文件与5个具有代表性的漏洞检测工具进行了实验对比,实验结果如表3所示。通过实验验证,展现了VulDeeLocator-BGRU在真实软件产品中检测和定位漏洞的有效性和精确性。表4描述了VulDeeLocator-BGRU确认或遗漏的漏洞,在18个已确认的漏洞中,VulDeeLocator-BGRU发现了有两个Libav 9.10中漏洞,但其并未在美国国家漏洞库NVD中报告,却在软件供应商发布新版本时被“默默”修补。

表3  VulDeeLocator在3个真实软件产品上的检测效果

表4  VulDeeLocator在真实软件产品上识别的漏洞

详细内容请参见:

Zhen Li, Deqing Zou, Shouhuai Xu, Zhaoxuan Chen, Yawei Zhu, Hai Jin. VulDeeLocator: A Deep Learning-Based Fine-Grained Vulnerability Detector. IEEE Transactions on Dependable and Secure Computing, 2022, 19(4): 2821-2837.

https://ieeexplore.ieee.org/document/9416836

来源:穿过丛林

上一篇:远程办公人员应该养成的8个安全习惯

下一篇:“数字转型 架构演进”SACC2023!中国系统架构师大会诚邀您参加!