此博客为Systematic Analysis of Deep Learning Model for Vulnerable Code Detection论文的中文翻译,本篇论文内容不多,是一篇综述性论文,总结了当下关于深度学习应用于漏洞检测的一些框架和所使用的数据集等,总之是一篇还可以的论文。下面就是本篇论文的全部翻译。
随着新应用程序的出现,软件漏洞已成为一个严重问题,这些应用程序包含可能危及系统的潜在漏洞或恶意代码。软件源代码的数量和复杂性不断增加,这就需要漏洞检测方法,以便在成为网络攻击的目标之前成功预测恶意代码。由于利用人类来检查源代码需要大量的时间和资源,而且现有的静态代码分析器无法正确检测易受攻击的代码。因此,人工智能技术(主要是深度学习模型)在检测源代码漏洞方面取得了进展。本文进行了系统的回顾,以探索和理解用于该任务的各种深度学习方法及其作为预测模型的有效性。此外,还将对每个过程及其实验特征进行总结,并讨论其在特定数据集上的实施及其评估。
深度学习、软件安全、源代码漏洞
现代世界中软件应用程序的数量不断增加,网络安全攻击的数量也在不断增加,这些攻击一直困扰着信息时代。负责通用漏洞和暴露(CVE)术语软件漏洞的Mitre组织表示:“在软件和硬件组件中发现了计算逻辑中的缺陷,如代码,当被利用时,会对机密性、完整性或可用性产生不利影响”。
软件漏洞的数量仅随着时间的推移而增加,CVE报告了2021报告的20149个漏洞,而2011年检测到的4155个漏洞如图1所示。最近,苹果遭受了iMessage漏洞的FORCEDENTRY攻击,Pegasus间谍软件绕过iOS BlastDoor安全功能,在iPhone或iPad访问互联网时部署间谍软件并创建恶意网页。该攻击实现了CVE跟踪的整数溢出,并导致窥探政治人物的私人信息和敲诈骗局,勒索人们支付赎金。
尽管学术界和行业努力提高软件质量,但软件漏洞仍然普遍存在。造成这种现象的两个主要原因是包含这些缺陷的开源软件和代码重用的广泛使用以及互联网用户数量的增加,这也增加了攻击的数量。因此,为了防止网络攻击导致敏感信息的数据泄露、拒绝服务条件、软件失控甚至公司停产,可以实现深度学习方法来检测软件源代码中存在的漏洞。
深度学习是人工智能中机器学习的一个子集,旨在模仿人类的大脑和神经系统。深度学习技术往往优于由人类专家手工生成的基于规则的传统方法,后者可能不精确的、资源密集型的、耗时的、对软件来说是主观的并且完全依赖于专家的知识和经验,或使用静态工具,如Checkmarx、Flawfinder等,具有高的假阳性率和高的假阴性率。深度学习技术可以自动学习特征,展现出比人工确定特征更好的泛化能力。因此,漏洞预测模型的成功和有效性取决于深度学习中模型的深度神经网络的复杂性,而不是传统机器学习中使用的特征选择。
很少有调查明确地对软件漏洞检测中的深度学习模型进行调查。这项调查旨在扩展这一研究领域,并提供一个不同的视角。概述用于训练深度学习模型的数据集的性质,例如:合成代码、半合成代码和真实代码。深入探讨了流行的源代码表示,以捕获未标记源代码的语义信息。此外,还总结了漏洞检测中的深度学习模型及其评估指标。
通过系统的文献综述,找到了与本课题相关的已有文献。因此,我们实施了一个“搜索过程”来为我们的研究找到这样的论文。具体的搜索字符串有关键词:“源代码漏洞检测”、“基于深度学习的软件漏洞检测”、“漏洞自动检测或发现”、“深度学习检测软件漏洞”。排除过程用于排除与我们的目标无关的论文或所选论文的副本。考虑的科学数据库是:(i)IEEE Xplore(ii)arXiv e-Print Archive(iii)ACM数字图书馆和(iv)谷歌学术搜索。
最初的关键词搜索过程使用了一个过滤程序,仅选择了2017年至2022年过去5年中发表的论文。在每个科学数据库中都设置了额外的限制,以查找相关的研究材料。IEEE Xplore仅包含会议和期刊,而ACM需要指定期刊和研究文章的过滤器。arXiv电子打印档案不需要任何预定义的过滤器,谷歌学术搜索也不需要。然而,谷歌学术搜索未能提供任何与我们的研究相关的独特研究论文。我们通过深入筛选过程共获取了303篇研究论文,包括论文标题、摘要、实验结果和结论,将我们的研究论文列表缩短到10篇。
通过多项研究,系统总结了机器学习技术、深度学习技术或源代码漏洞分析领域的最新研究成果。Ghaffarian和Shahriari对用于检测和分析软件漏洞的传统机器学习和数据挖掘技术进行了广泛而详细的回顾。本研究总结了机器学习技术的不成熟状态,但没有探讨深度学习技术。Malhotra在回顾了64项用于软件故障预测的机器学习技术的初步研究后,得出了类似的结论。
Radjenovic等人对软件故障解决方案的软件度量进行了系统的文献综述。然而,软件故障预测的应用非常有限,与软件漏洞检测缺乏相关性。M.Masum等人引入了一种新的基于贝叶斯优化的超参数自动优化框架,以确保最佳的深度神经网络架构。作者还介绍了一个基于特征选择的框架,采用不同的机器学习算法,包括基于神经网络的架构,通过应用决策树(DT)、随机森林(RF)、朴素贝叶斯(NB)、逻辑回归(LR)和基于神经网络(NN)的分类器对用于勒索软件检测和预防的安全级别进行分类。M.J.H. Faruk等人强调了基于人工智能(AI)的检测和预防恶意软件活动的技术。介绍了机器学习和深度学习两种检测和预防恶意软件的模式、技术和方法。
源代码表示是通过删除不必要的行、注释和空格,将源代码的输入样本分解为仅包含重要的语法和语义信息的重要步骤。虽然存在许多表示,但本研究旨在介绍用于从源代码中获取结构和语义信息以进行特征提取的最先进方法。
抽象语法树(AST)是源代码的树表示,它可以捕获代码块的抽象语法结构和语义,允许静态分析源代码。该过程允许将初始输入源代码划分为更小的部分,并实现函数级源代码的更大粒度。AST可以通过使用CodeSensor或Pycparser等解析器获取。虽然这些ASTs可以直接使用,但由于代码较大或复杂,因此缺乏粒度。因此,在[7]中,AST树(可以被视为m叉树)强制执行规则,将其转换为完整的二叉AST树,以保持其与AST节点的结构关系。类似地,还提出了一种称为树-LSTM的RNN模型,该模型利用其自底向上的计算来整合所有AST子节点的输出,以构建二叉AST树。
代码小工具是多行程序语句的组合,通过实现程序切片,使这些语句在数据依赖性和控制依赖性方面具有语义相关性。程序切片可分为两种类型的切片:前向和后向。前向切片是从外部输入(如文件o套接字)接收的代码片段;然而,反向切片不接收来自程序运行环境的外部直接输入。通过分析程序的数据流和控制流对程序进行分解,可以减少代码行,并重点关注库/API函数调用、数组或指针的关键点。VulDeePecker只考虑了代码小工具中的数据依赖性,因为它使用商业工具Checkmarx,并对每个参数执行向前和向后切片,然后组装成代码小工具形式。在Zagane的模型中,数据集包含420627个代码片段,其中包括56395个易受攻击的代码片段,每个片段的代码度量是为其深度学习模型计算的。
代码属性图(CPG)是表示源的经典数据结构的合并,即抽象语法树、控制流图(CFG)和程序依赖图(PDG)。REVEAL漏洞预测框架通过结合现有CPG添加数据流图(DFG),利用修改后的CPG而非Yamaguchi等人表示的数据结构来捕获代码中语义的附加上下文。Devign通过将AST、CFG、DFG和自然代码序列(NCS)的概念合并到一个联合图中,在源代码表示中采用了类似于CPG的方法。
Russell等人为C/C++代码构造了一个自定义词法分析器,它形成了156个标记作为词汇表大小的代码表示。这种方法包括关键字、运算符、分隔符,同时在编译方面排除不相关的代码。词法分析器将代码转换为三种不同类型的标记。由于与漏洞检测相关,字符串、字符和浮点值被划分为特定于类型的占位符,而整数值则被逐位数标记。来自公共库的类型和函数调用被映射到它们的泛型版本。Zheng等人实现了这个自定义词法分析器,用于对来自Draper VDISC数据集的文本进行词级标记。
基于语义的漏洞候选是通过提取其程序切片与基于语法的漏洞候选(SyVC)语义相关的各种语句。为了概念化SeVCs,需要探讨术语SyVC。SyVCs提取需要将源代码转换为包含多个连续标记的AST。遍历AST以找到与定义的漏洞语法匹配的代码元素,该语法被标记为SyVC。通过程序切片将SyVCs转换为SeVCs,以捕获基于数据依赖性和控制依赖性的语句的语义关系。Joern工具提取每个SyVC的PDGs;然后,从程序间正向和反向切片生成程序切片,这些切片被转换为SeVCs。
深度神经网络的灵感来自人脑和神经系统的生物学方面。它形成了类似于人类神经系统的网络,并通过使用提供的数据训练自己来模仿人类的思维机制。深度学习在图像分类中取得了成功,并利用高级特征表示捕捉变量的非线性效应。因此,已经实现了深度学习技术,以从文本(源代码)中提取特征,然后训练其模型来理解和检测软件中的漏洞。
CNN是一种深度学习模型,主要用于分析图像中的特征,但也已在源代码的特征提取上实现,以学习其向量表示。此外,由于代码不具有图像中存在的广泛特征,CNN可以通过学习源代码中的模式和上下文之间的关系来提取特征并理解程序的结构。在Russell等人的研究中,CNN实现的滤波器大小为9512个滤波器与批量归一化和ReLU配对,以确定顺序标记。
RNN允许提取比CNN更长的标记依赖性,因为其“内存”包含来自上一个和下一个标记的信息。Russel等人中使用的RNN的隐藏大小为256,并被最大池化以生成固定大小的向量表示。
LSTM是RNN架构的扩展版本,可以学习长期依赖关系。LSTM可以通过捕获序列数据的非线性并同时为时间序列数据生成更精确的预测来克服传统统计模型(如ARIMA)的局限性。LSTM解决了RNN的消失梯度问题。LSTM体系结构的构建块是一个存储块,它由一个存储单元组成,该存储单元可以通过自循环连接保存前一时间步的信息。BLSTM是LSTM深度学习模型的变体,但通过将其与另一个称为GRU的CNN模型配对来构建单向模型,以实施双向LSTM,即BLSTM。 μ V u l D e e P e c k e r μVulDeePecker μVulDeePecker实现了BLSTM的多特征融合方法,可以从全局特征学习模型、局部特征学习模型和特征融合模型中提取信息。
GRU是LSTM的一个替代版本,它被引入以避免消失梯度问题并提高LSTM的效率。GRU的体系结构比LSTM简单,需要学习的参数数量减少。它由两个门组成:更新门和重置门(相比之下,LSTM中包括三个门)。GRU通过控制哪些信息应该传递到未来状态,利用这两个门解决了RNN的消失梯度问题。LSTM模型中的输入门和遗忘门被集成到GRU更新门中,GRU更新控制门决定了应该将之前步骤中的多少信息传递给未来的时间步骤。类似地,对于LSTM中的输出门,GRU中的重置门结合了新的输入和以前的记忆,并决定了过去信息的多少记忆应该被遗忘。
在实现深度学习模型时,在这一研究领域观察到的数据集是C/C++语言的源代码。这些数据集很受欢迎,因为在量化数据集中出现的易受攻击的和恶意代码的数量方面进行了深入的审查,如图2所示。
软件保障参考数据集(SARD)包含生产、合成和学术安全缺陷或漏洞,国家漏洞数据库(NVD)包含生产软件中的漏洞。数据集由C/C++程序和软件产品组成,其中包含61638个代码小工具,包括17725个易受攻击的代码小工具和43913个不易受攻击代码小工具,如图2所示,10440个代码小工具对应于缓冲区错误漏洞(CWE-119),其余7285个代码小工具则对应于资源管理错误漏洞(CWE-399)。该数据集命名为代码小工具数据库(CGD),其扩展为基于语义的漏洞候选(SeVC)数据集(在SeSeVR期间使用)和多类漏洞数据集(MVD)(在 μ V u l D e e P e c k e r μVulDeePecker μVulDeePecker期间使用)。
该数据集包含从开源软件中挖掘的127万个函数的源代码,并通过潜在漏洞的静态分析进行标记。Draper VDISC数据集包含来自开源项目的C/C++代码:Debian Linux Distribution、GitHub上的公共git存储库和NIST Samate项目的SATE IV Juliet测试套件,其中前两个源项目是真实的,最后一个是合成的。Debian软件包版本提供了一系列精心管理和仔细挑选的代码,而GitHub数据集提供了数量更大、种类更广(通常质量更低)的代码,SATE IV Juliet测试套件包含118个不同的常见漏洞枚举(CWE)漏洞的合成代码示例。
ReVeal是一个真实世界的源代码数据集,其中跟踪了来自Linux Debian内核和Chromium开源项目的漏洞。该数据集包含C/C++源代码,是维护良好的公共项目,具有大量的发展历史,并且都代表重要的程序域(操作系统和浏览器)和大量公开可用的漏洞报告。可以使用Bugzilla for Chromium和Debian security tracker for Linux Debian Kernel收集公开可用补丁的修复问题。ReVeal数据集共包含18169个样本,其中16505个非易受攻击样本和1664个易受攻击样本,如图2所示。
FFMPeg+Qemu是一个从Github存储库收集的平衡的真实世界数据集,由4个大型C语言开源项目组成,这些项目在开发人员中很受欢迎,功能多样化,即Linux内核、Qemu、Wireshark和FFMPeg。该数据集的标记是基于提交消息和领域专家手动完成的。图2显示了数据集的平衡性质,其中23355条非易受攻击的提交信息和25332条提交信息具有漏洞。
该综述介绍了基于深度学习的软件漏洞检测研究领域的起步阶段。有多个问题尚未解决,但这表明需要进一步研究来解决这些问题,以便更好地发现易受攻击的代码。因此,我们汇编了一些挑战和未来可能的研究方向,这些挑战和方向已通过先前工作的结论性评论进行了评估。
数据集是训练漏洞预测模型的一个组成部分。如本文所述,各种研究利用各种数据集(如SARD和NVD或REVEAL数据集)来训练其模型,这表明缺乏涵盖大多数CWE漏洞的标准化基准数据集。因此,无法为基于深度学习的模型的评估制定统一和标准化的度量。此外,深度学习模型需要大量的训练数据来提供出色的性能,但目前的数据集在这方面还不够。因此,开发此类漏洞数据集是解决基本真实数据集问题的研究的一个重要方向。如图2所示,易受攻击代码与非易受攻击的代码的比例往往失衡得惊人。非易受攻击的代码非常丰富,但易受攻击代码是极少数,这导致深度学习漏洞预测模型没有足够的训练数据来检测漏洞,并导致模型过拟合。特定CWE漏洞中存在类不平衡,如Draper VDISC数据集中存在的CWE 469,导致预测不佳,而由于CWE 119大量存在,导致交叉验证期间模型中对该漏洞的最佳预测。
深度学习模型具有非线性和隐藏层,难以解释导致漏洞预测的行为。这引发了以下问题:模型是否准确?对漏洞发现的预测是否可靠?在特定的源代码中对易受攻击或非易受攻击进行分类的原因是什么?研究人员通过两种方法解决了这个问题。首先,使用LIME创建神经网络的线性模型以进行简单解释。其次,将代码注意力引入源代码表示,这使研究人员能够获得注意力向量,并定量测量深度学习模型中所有神经网络中对特定网络的关注程度。进一步的研究可以导致更好的源代码分析,这可以解释漏洞预测中基于深度学习的模型。
随着越来越复杂的大量软件应用程序的出现以及信息时代软件的持续流行,将需要基于自动深度学习的模型来学习和检测这些软件中的漏洞。在本次调查中,我们回顾了为源代码漏洞分析实施深度学习技术所进行的研究。首先,对用于源代码漏洞检测的深度学习模型的形成进行了概述。本文对最先进的源代码表示进行了详细的总结,它可以分解源代码的文本,并保持其行为,以输入深度学习模型进行训练。接下来,通过训练模型中使用的隐藏层的简单示例概述了用于漏洞检测的深度学习模型。最后,基于本文所提到的现有研究,指出了该研究领域的挑战和未来工作的方向。
这项工作得到了美国国家科学基金会(NSF)2100134、2100115、1723578、1723586奖和SunTrust奖学金的部分支持。本材料中表达的任何意见、发现、结论或建议均为作者的意见、发现和结论或建议,并不反映NSF和SunTrust的观点。
以上就是本篇论文翻译的全部内容了,内容不多也不是特别难,可以学到不少知识,加油!下篇博客见!