【论文翻译】A Survey on Automated Software Vulnerability Detection using ML or DL

A Survey on Automated Software Vulnerability Detection Using Machine Learning and Deep Learning

摘要

软件漏洞检测对于软件安全至关重要,因为它可以识别软件系统中的潜在错误,从而能够在这些错误被利用之前立即实施修复和缓解措施。自动漏洞识别很重要,因为它可以比手动代码审核更有效地评估大型代码库。近年来,出现了许多基于机器学习(ML)和深度学习(DL)的模型来检测源代码中的漏洞。然而,缺乏对ML/ DL模型在漏洞检测中的应用进行总结、分类和分析的调查。如果没有全面的调查,可能很难发现现有研究的差距和未来改进的潜力。这可能会导致重要的研究领域被忽视或代表性不足,从而导致对漏洞检测最新技术的理解出现偏差。这项工作通过提出系统调查来解决这一差距,通过五个主要研究问题 (RQ) 来描述基于 ML/DL 的源代码级软件漏洞检测方法的各种特征。具体来说,我们的 RQ1 研究了利用 ML/ DL 进行漏洞检测的出版物的趋势,包括研究的演变和出版物地点的分布。 RQ2 描述了现有基于 ML/DL 的模型所使用的漏洞数据集,包括其来源、类型和表示形式,以及对这些方法所使用的嵌入技术的分析。 RQ3 探讨了基于 ML/DL 的漏洞检 测方法的模型架构和设计假设。 RQ4总结了现有研究涵盖的漏洞的类型和频率。最后,RQ5列出了当前需要研究的挑战清单,以及潜在研究路线图的轮廓,强调了未来工作的关键机遇。

简介

软件安全漏洞的自动检测是确保软件安全的关键组成部分。机器学习(ML)和深度学习(DL)的突破激发了人们对利用这些模型来发现通用软件系统中的软件漏洞的极大兴趣。[28,79,84,137,145]。 ML/DL 模型擅长从大型数据集中发现微妙的模式和相关性。它们可以自动从源代码等原始数据中提取有意义的特征,并识别可能表明软件漏洞的隐藏模式。此功能对于无漏洞检测至关重要,因为漏洞通常涉及微妙的代码特征和依赖性。此外,ML/DL模型可以处理各种数据类型和格式,包括源代码 [32,33, 64, 95, 128, 134, 138, 144]、文本信息 [60] 和数字特征,例如 commitcharacteristics [113, 147]。他们可以处理和分析这些数据表示,以有效地检测漏洞。这种灵活性使研究人员能够利用各种数据源并结合不同的功能来进行全面的漏洞检测。利用 ML/DL 模型进行软件漏洞检测的总体流程如下:** 数据收集**:构建漏洞检测模型的第一步是收集相关的漏洞数据来训练模型。漏洞检测数据集有多种来源(我们在 RQ2 中对此进行了详细说明),研究人员要么使用基准数据 [17,42,49,76,87,88,140,147,157,158,160],要么从公开收集根据需求和漏洞类型选择来源[25,45,110,114,120]。数据表示:收集数据后,需要对其进行预处理,为训练做好准备。预处理包括使用适当的表示技术,即图/树表示 [17,30,38,49,82,87,90,91,97,140,153,156,157,160],令牌(token)表示[25,42, 55, 58, 62, 76, 124, 158, 161],或使用提交特征(commit characteristics)。嵌入(Embedding):此步骤涉及将源代码表示转换为可由机器学习或深度学习使用的数字格式 [17, 45, 49, 55,58, 62, 76, 91, 114, 124, 161] (向量或嵌入)漏洞检测模型。模型选择和架构设计:必须根据软件漏洞检测任务选择合适的ML/DL模型。这可以包括从简单的 ML 算法(如 SVM 或随机森林 [24,123,155])到更高级的DL架构(如 CNN [60,62,145] 或 RNN)的一切。该模型的架构旨在从输入数据中提取重要的特征和模式。训练:在训练阶段,漏洞检测数据集被分为训练集和验证集,模型从标记数据中学习。使用梯度下降等优化技术,根据预测误差迭代更新模型的参数。评估和验证:训练完成后,将使用单独的测试数据集评估模型的性能。计算准确度、精确度、召回率和 F1 分数等各种指标, 以评估模型检测漏洞的有效性。该模型还可以针对现实世界的漏洞进行验证,以衡量其实用性。尽管许多研究已经利用 ML/DL 来检测软件漏洞,但尚未进行全面的审查来整合这些技术的各种方法和特征。进行这样的系统调查将有利于从业者和研究 人员更好地了解当前最先进的漏洞检测工具,并可以为未来的研究提供灵感。本研究进行了详细而全面的调查,从不同角度对漏洞检测论文进行回顾、分析、描述和 分类。我们分析了 2011 年至 2022 年在 37 个旗舰 SE 期刊和会议上发表的 67 篇文章。我们在本研究中调查了以下研究问题 (RQ):
• RQ1:使用ML/DL 模型进行漏洞检测的研究趋势是什么?
– RQ1.1。随着时间的推移,软件漏洞检测研究的趋势是什么?
– RQ1.2。发表地点分布如何?
• RQ2:软件漏洞检测中使用的实验数据集有哪些特征?
– RQ2.1。数据来源是什 么?
– RQ2.2。初步研究中使用的数据类型是什么?
– RQ2.3。输入数据如何表示?
– RQ2.4。如何将输入数据嵌入特征空间?
• RQ3。用于漏洞检测的不同ML/ DL 模型有哪些?
• RQ4。这些研究中最常见的漏洞类型是什么?
• RQ5。软件漏洞检测可能面临的挑战和开放方向是什么?
本文做出以下贡献:
• 我们深入分析了 67 项使用 ML/DL 技术检测安全漏洞的相关研究,涉及出版趋势、出版地点分布和贡献类型。• 我们进行了进行全面分析,以了解数据集、数据处理、数据表示、模型架构、模型可解释性以及这些基于 ML/DL 的漏洞检测技术所涉及的漏洞类型。
• 我们提供了以下应用中使用的 ML/DL 模型的分类基于这些模型的架构和技术选择策略分析的漏洞检测。
• 我们讨论了在漏洞检测中使用 ML/DL 技术的不同技术挑战,并概述了未来的关键方向。
• 我们已将我们的结果和分析数据作为复制包分享给让其他研究人员可以轻松地遵循本文并扩展它。
我们相信这项工作对于软件工程和网络安全领域的研究人员和从业者很有用,特别是那些对软件漏洞检测和缓解感兴趣的人。 此外,我们系统调查的结果也可能对政策制定者、软件供应商和其他关心提高软件安全性和降低网络攻击风险的利益相关者有用。这些人可以利用审查提供的见解来为他们有关软件开发、采购和风险管理的决策提供信息。
本文的其余部分组织如下:第 2 节总结了现有的研究,重点是提出软件漏洞检测的系统调查。第 2 部分介绍了使用 ML/DL 技术进行软件漏洞检测的系统调查的相关工作。第 3 部分介绍了本文提出的 论文收集研究方法以及纳入和排除研究的标准。第 4 节讨论研究问题和相应结果。第 5 节讨论了这项系统调查可能存在的局限性。最后,第六节讨论了结论和未来的方 向。

2 背景及相关工作

在本文的这一部分中,我们首先提供有关漏洞定义和软件漏洞检测的不同步骤的背景知识。然后我们讨论相关调查并强调它们与我们的调查相比的差异。

2.1 背景

软件漏洞管理现在对于保证软件系统的安全性和完整性至关重要[20,43,119,135]。鉴于金融交易等许多关键流程对软件的依赖日益增加,漏洞的出现频率带来了严重的风险. [57, 99], 自动驾驶 [46, 100] 和关键任务系统 [53, 56]。如果软件漏洞未被检测到或被忽视,则恶意实体可能会利用软件漏洞来获得未经授权的访问、泄露敏感信息或中断服务。 [56]。因此,出色的软件漏洞管理对于处理这些风险、保护用户隐私 [5]、维护系统可用性和确保软件应用程序的可信度 [104] 至关重要。通过主动检测、分析和修复漏洞,组织可以增强其软件系统以应对不断变化的网络安全威胁[6],并遵守安全软件开 发和部署的行业最佳实践。软件漏洞管理有多个步骤,包括漏洞检测[17] 、漏洞分析 [73]和漏洞修复[77]。在以下小节中,我们详细阐述每个步骤。

2.1.1 漏洞检测

漏洞检测在管理软件漏洞的整个过程中至关重要 [17,17,28,64,87,90,95,134,136,158,160]。它包括检测和调查攻击者可能利用的软件系统中可能存在的安全漏洞。有几种常用的漏洞检测传统技术:
手动代码审核 [7,18,126,127,130]:在这种方法中,人类专家彻底检查源代码,目的是手动检测编码缺陷、不安全的程序和可能的漏洞。手动代码审查非常耗时,并且需要合格的开发人员或安全分析师的知识。然而,它提供了对代码的彻底掌握,并且可以揭示自动化工具可能忽略的微妙错误。
静态分析[39,41,75,103,129,139]:静态分析涉及使用自动化工具来分析源代码或编译的二进制文件无需执行该软件。它检查代码结构,识别潜在的编码问题,并检测常见漏洞,例如缓冲区溢出[56]、注入攻击和不安全的数据处理。静态分析工具采用数据流分析、控制流分析和模式匹配等各种技术来识别潜在漏洞。它们可以通过有效分析大型代码库来帮助扩展漏洞检测工作。
动态分析 [15,81,106]:动态分析的目标是评估软件运行时的行为。它需要在受控环境中或通过自动测试运行软件,同时监视其执行以及与系统资源的交互。动态分析可以检测输入验证[70]、访问控制和错误处理中的错误。这种方法可以通过分析软件的实时行为来识别仅静态分析无法检测到的漏洞。然而,动态分析可能在显着的系统开销方面受到限制[149]。

2.1.2 漏洞分析

检测到漏洞后,软件漏洞管理的下一步是漏洞分析和评估 [44,63,78,80,101,131,148]。此步骤包括进一步检查已识别的漏洞,以评估其严重性、影响和潜力可利用性。
严重性:出于多种原因,准确评估软件漏洞至关重要。首先,它允许组织根据漏洞的严重性确定响应的优先级。严重性是指漏洞被利用时可能产生的潜在影响[23,73,74,133]。通过准确评估严重性,组织可以将注意力集中在对软件系统的安全和功能构成重大风险的高严重性漏洞上。
影响:其次,准确评估漏洞有助于确定它们可能对组织产生的潜在影响[27, 47, 51、65]。影响是指利用漏洞的后果,例如拒绝服务 [56] 或数据泄露 [1]。通过了解潜在影响,组织可以就修复工作的紧迫性和优先级做出明智的决策。
可利用性:此外,准确评估漏洞有助于了解其潜在的可利用性[13,21,22]。这需要确定攻击者成功利用漏洞渗透软件系统的可能性。组织可以评估与每个漏洞相关的风险量,并通过评估利用的难易程度和利用技术的可用性等标准来相应地投资资源。

2.1.3 漏洞修复

通过打补丁、代码修改和修复等不同技术来解决检测到的软件漏洞的过程称为软件漏洞修复[8,16,26,117]。修复的根本目标是消除或减轻漏洞,以提高软件系统的安全性和可靠性。漏洞修复的一种常见方法是应用软件供应商或开源社区提供的补丁[50,83,141]。补丁是针对软件系统中发现的特定漏洞或弱点的更新或修复。

2.1.4 用于软件漏洞检测的ML/DL

通过利用数据分析、模式识别和机器驱动学习来查找软件安全漏洞,ML/DL 方法彻底改变了软件漏洞检测。 [28、79、84、137、145]。 这些技术提高了漏洞检测的准确性和效率,有可能实现自动检测、更快的分析以及识别以前未公开的漏洞。ML/DL 在漏洞检测中的一个常见应用是代码片段的分类 [32, 64, 128, 138],软件二进制文件 [61, 109, 116, 145],或从开源存储库(例如 GitHub 或 CVE)中挖掘的代码更改 [35, 60, 85, 94, 118, 123, 136, 154]。 ML 模型可以在带标签的数据集上进行训练,其中每个样本代表一个已知的漏洞或非漏洞。然后,这些模型学习从提供的示例中进行概括,并根据它们学到的模式对新实例进行分类。这种方法可以自动发现漏洞,无需手动检查,大大减少了分析所需的时间和精力。用于检测软件漏洞 的 ML/DL 模型比传统方法具有明显的优势。每个好处将在下一段中深入讨论。
自动化:自动化是一个显着的优势。 ML 模型可以自动扫描和分析大型代码库、网络流量日志或系统配置,标记潜在的漏洞,而无需对每个案例进行人工干预 [19]。这种自动化加快了检测过程,使安全团队能够专注于验证和缓解漏洞,而不是手动分析。
性能:ML/ DL 方法提供更快的分析。传统的漏洞检测方法依赖于手动检查或预定义规则的应用 [7,18,126,127,130]。相比之下,ML/DL 方法可以并行评估大量数据并快速生成预测,从而大大缩短发现漏洞所需的时间。
检测有效性:ML/DL 模型可以发现以前未知的漏洞,通常称为零日漏洞[10]。这些模型可能会发现漏洞的迹象,即使它们没有通过学习模式并从标记数据中进行归纳来进行专门训练。此功能有助于在软件中的未知弱点被攻击 者利用之前识别和解决这些弱点,从而改善整体安全状况 [2]。

2.2 相关工作

文献中已有几篇关于软件漏洞的调查论文。在本节中,我们根据不同方面分析现有论文,如表 1 所示。表中的列代表调查的不同方面,例如使用的数据源、表示、特征嵌 入、ML/DL 模型、漏洞类型和ML/DL 模型的可解释性。数据源表明调查是否审查了漏洞检测数据

在这里插入图片描述

来源。表示讨论调查是否在其分析中考虑了源代码表示。嵌入处理调查是否在其分析中分析特征嵌入。该表还将第六列中的 ML/DL 模型视为 ML 模型。该表还检查调查是否考虑了基于常见弱点枚举 (CWE) 编号的漏洞类型。最后一列表明调查是否考虑了 ML/DL 模型的可解释性。
Ghaffarian 等人。在数据驱动的安全漏洞检测方面,[48] 是与我们最接近的调查。在他们的调查中,他们从数据源、表示、嵌入类型和不同的 ML/DL 模型等各个方面分析了数据驱动的软件漏洞检测,如表 1 所示。但是,与我们的工作相比,存在一些差异。具体来说,这工作还从以下几个方面对漏洞检测进行了调查: 全面覆盖:了解多种类型的漏洞使研究人员能够创建和开发有效的漏洞检测模型,能够彻底发现安全漏洞。为了保证他们的检测系统覆盖尽可能多的漏洞类型,研究人员必须熟悉软件系统的各种攻击方法和潜在弱点。检测技术的定制:不同类型的漏洞需要不同的检测方法。为了构建可以发现某些类型漏洞的专门检测系统,研究人员必须首先了解每种漏洞类型的微妙之处。缓解工作的优先级:研究人员可以通过了解多种类型的漏洞,根据每个漏洞的严重性和影响来确定缓解工作的优先级。研究人员可以优先考虑对系统或组织构成最大危险的关键漏洞。更好地了解攻击模式:了解不同类型的漏洞可以让研究人员深入了解攻击者使用的不同攻击模式。这些知识可以帮助研究人员设计检测技术,不仅可以检测已知的攻击模式,还可以检测新的未知模式。可解释性是指解释模型如何做出特定决策或预测的能力。这在软件漏洞检测的背景下尤其重要,因为安全研究人员需要能够理解为什么模型将特定代码段标记为潜在易受攻击的代码。此外,可解释性可以帮助提高对模型预测的信任。 如果开发人员和安全研究人员能够了解模型如何做出决策,他们就更有可能信任其输出并根据其建议采取适当的行动。
[77]回顾了数据驱动的脆弱性评估和优先级研究。他们对利用机器学习和数据挖掘方法的软件评估和优先级划分的先前研究进行了回顾。他们研究了该领域的各种类型的研究,讨论了每种方法的优点和缺点,并强调了一些尚未解决的问题和潜力未来研究的领域。与我们的主要区别在于,我们在调查评估和优先级技术的同时审查漏洞检测方法。 漏洞检测、漏洞评估和漏洞优先级排序都是漏洞管理生命周期的重要组成部分,但它们涉及漏洞管理过程的不同阶段。我们的工作重点是漏洞检测,这是指识别软件系统中潜在漏洞的过程。漏洞检测的目标是识别系统中存在的所有漏洞,无论其严重程度如何。另一方面,漏洞评估涉及评估每个已识别漏洞的严重性和潜在影响。此评估可能涉及分析漏洞被利用的可能性以及可能导致的潜在危害等因 素。漏洞优先级划分涉及根据风险或严重性级别对已识别的漏洞进行排名。该排名通常基于漏洞评估的结果以及其他因素,例如解决漏洞的资源的可用性。
Lin 等人[89]检查了有关使用深度学习和基于神经网络的方法来检测软件漏洞的文献。与我们的调查相比,存在一些差异。首先,研究用于软件漏洞检测的常规源代码表示技术(静态代码属性)。在我们的调查中,出于几个原因,我们忽略了审查此类表示技术。静态代码属性(例如代码长度或复杂性)可能对漏洞检测无效,因为它们不能捕获代码在运行时的动态行为。漏洞可能会以静态代码中不明显的意外方式表现出来,因此很难仅通过静态分析来检测它们。此外,静态代码属性可能无法捕获代码的上下文,这对于理解代码如何与系统中 的其他组件交互非常重要。最后,静态分析工具可能会产生很高的误报率,这可能会耗费大量时间进行验证,并可能导致开发人员忽略重要的漏洞。其次,我们研究了期刊和会议论文中软件漏洞检测领域发表论文的趋势分析,因为它提供了对特定领域或研究领域的发表模式的全面了解。趋势分析可以揭示研究成果在不同出版场所的分布以及研究人员和作者的偏好变化。这些信息对于出版商、学术机构和研究人员等利益相关者做出与出版、资助和研究合作相关的战略决策非常有用。
[151]讨论了对软件中可利用漏洞的日益关注以及漏洞检测方法的开发,特别是机器学习技术的应用。该论文回顾了最近 22 项使用深度学习来检测漏洞的研究,并确定了对该领域产生重大影响的四个游戏规则改变者。该调查进一步根据软件漏洞检测的不同方面(包括数据源、特征表示、深度学习模型和检测粒度)对游戏规则改变者进行了比较。与我们的调查相比,存在一些差异。首先,我们分析了期刊和会议上发表的软件漏洞检测论文的趋势模式。这种分析有助于我们全面了解特定研究领域或领域的出版趋势。其次,我们涵盖了软件漏洞检测的更多方面。虽然它们只涵盖数据源、特征表示、深度学习模型和检测粒度,但我们涵盖了更多方面,包括漏洞类型和 ML/DL 模型的可解释性。此外,我们还提供了不同方面的更精细的分析。
Kritikos 等人[71] 和孙等人[132]专注于网络安全,旨在提高网络弹性。孙等人[132]讨论了从被动检测到主动预测的理解和防御网络威胁的范式变化,重点是使用多种类型数据源的网络安全事件预测系统的新研究。克里蒂科斯等人。 [71]讨论将应用程序迁移到云并确保其安全性的挑战,重点关注应用程序生命周期中的漏洞管理以及使用开源工具和数据库来更好地保护应用程序。虽然两个摘要的主题不同,但它们有着共同的目标,即提高网络安全性和弹性。两者都强调了主动采取措施预防或减轻网络威胁的重要 性,而不是仅仅依赖被动检测和响应。此外,两者都强调了利用各种数据源和工具来改进网络安全措施的重要性。虽然这两种方法都旨在提高应用程序的安全性,但它们的侧重点和所使用的技术有所不同。他们主要专注于提供指导和工具来支持应用程序生命周期中的漏洞管理,而在我们的调查中,我们专注于在源代码上使用 ML/DL 技术进行软件漏洞检测,旨在自动识别源代码中的漏洞。
[69]重点关注漏洞评估,这是在计算机系统中的漏洞被黑客利用之前发现并修复漏洞的过程。这凸显了对能够有效保护软件系统的自动化漏洞缓解策略进行更多研究的必要性。另一方面,使用 ML/DL 方法对源代码进行漏洞识别需要分析应用程序的源代码以发现安全缺陷。该方法不是评估整个系统的安全性,而是专注于查找代码本身的漏洞。
Nong et al.[111]探讨了软件漏洞检测研究的开放科学方面,并认为软件工程中缺乏开放科学问题的研究,特别是在软件漏洞检测方面。作者进行了详尽的文献研究,并确定了 55 篇提出基于深度学习的漏洞检测方法的相关著作。他们研究了开放科学方面,包括可用性、可执行性、再现性 和可复制性。研究表明,25.5% 的受检查方法提供开源工具。此外,一些开源工具缺乏足够的文档和彻底的实施,导致它们无法操作或不可复制。使用不平衡或故意生成的数据集会导致方法的性能被夸大,从而导致它们不可复制。
Chakraborty 等人 [19]研究了基于深度学习的尖端漏洞预测方法在现实世界漏洞预测场景中的性能。他们发现,最先进的基于 DL 的技术的性能在现实场景中下降了 50% 以上。他们还发现了训练数据的问题(例如,数据重复和易受攻击类别的不切实际的分布)和模型选择(例如,基于简单令牌的模型)。现有的基于深度学习的方法通常学习不相关的工件,而不是与漏洞原因相关的特征。与我们的调查研究相比, 显着的区别在于,在我们的工作中,我们专注于使用 ML/DL 模型进行软件漏洞检测,并描述漏洞检测流程中的不同阶段。另一方面,他们关注与使用最先进的深度学习模型进行软件漏洞检测相关的问题。
[93] 讨论了 DL 技术在软件工程研究中日益普及的原因,因为它们能够在无需大量手动特征工程的情况下解决 SE 挑战。作者强调了 DL 研究中经常被忽视的两个重要因素:再现性和可复制性。再现性是指其他研究人员是否可以使用作者的工件获得相同的结 果,而可复制性是指使用重新实现的工件和不同的实验设置获得相似的结果。与我们的研究相 比,主要的区别在于我们专注于 ML/DL 技术在软件漏洞检测管道中的使用,而他们则强调软件工程研究中报告结果的可复制性和可再现性。
Bi等人[9]强调了软件漏洞检测技术的重要性以及缺乏评估这些方法的系统方法。该研究首次调查并描述了软件漏洞检测基准测试的现状。该评估审查了有关漏洞检测基准测试的当前文献,包括技术提案出版物和实证研究中采用的方法。该调查研究了与基准测试软件漏洞检测方法相关的困难,并针对这些困难提出了替代解决方案。然而,与我们的工作不同,他们没有给出软件漏洞识别中使用的数据集、表示、嵌入技术和模型的特征。

3 系统调查方法

3.1 信息来源

在本文中,我们按照[68, 115]进行了实证研究。本研究的目的是收集和审查 2011 年至 2022 年的论文,重点关注使用机器学习和深度学习技术跨各种编程语言和源代码进行漏洞检测。 2011 年至 2022 年期间是审查数据驱动的漏洞检测的适当时间间隔,原因如下: a) 软件漏洞的数量和多样性增加:在过去的十年中,软件的数量和多样性显着增加已发现并报告的漏洞 2.截至 2021 年,国家漏洞数据库 (NVD) 中已有 150,000 条 CVE 记录。这种增长需要更复杂、更有效的漏洞检测方法,从而促进了新的数据驱动技术的发展。 b)** ML/DL 和数据分析的进步**:过去十年,机器学习取得了显着进步,包括深度学习算法 [52, 59]、自然语言处理技术 [34, 96] 以及其他数据驱动方法的发展,在检测软件漏洞方面非常有效。当我们开始收集论文时,我们从四个可用数据库中搜索相关研究论文,分别是 ScienceDirect、IEEE Xplore、ACM 数字图书馆和 Google Scholar。

3.2 搜索词

从早期的工作中,我们确定了搜索中使用的关键短语 [77,89,125,151] 以及我们在该主题领域的经验。以下是搜索词:
漏洞检测 OR 安全漏洞检测 OR 使用机器学习的漏洞 检测 OR 使用深度学习的漏洞检测 OR 源代码安全错误预测 OR 源代码漏洞检测 OR 源代码错误预测
vulnerability detection OR security vulnerability detection OR vulnerability detection using machine learning OR vulnerability detection using deep learning OR source code security bug prediction ORsource code vulnerability detection OR source code bug prediction

3.3 研究选择

选择纳入我们调查的研究的过程包括以下阶段:(1)根据标题初步选择研究,(2) 审查摘要后选择研究,(3)阅读全文后进行进一步选择。请注意,初始搜索结果包含与安全漏洞检测无关的条目。这可能是由意外的关键字匹配引起的。我们手动检查每篇论文并删除这些不相关的论文,以确保我们的调查数据集的质量。我们还观察到, 由于同一研究可能被多个数据库索引,因此搜索结果中存在重复论文。然后我们就丢弃了手动重复研究。为了帮助选择提出新的基于机器学习或深度学习的软件漏洞识别模型的论文,我们提供以下纳入和排除标准:
• 研究应经过同行评审
• 研究应有实验结果
• 研究应采用ML 或 DL 技术
• 这些研究改进了现有的数据驱动的漏洞检测技术
• ML/DL 模型的输入应该是源代码、提交(commit)或字节码(byte-codes)
此外,我们有以下排除标准来过滤掉不相关的论文:
•关注其他工程领域的研究
• 涉及静态分析、动态分析、突变测试、故障定位的研究
• 评论论文(Review papers)
• 关注Web 和Android 应用程序漏洞检测的研究
• 属于以下类别之一的研究:书籍、章节、教程、技术报告
• 使用代码相似性或克隆检测工具的研究
• 专注于移动设备上的恶意软件检测、入侵 检测和使用静态代码属性的错误检测的研究
使用这些标准,我们通过检查每篇论文的标题、摘要和内容来缩小我们的发现范围,以获得最相关和高质量的研究论文。 为了使人力易于管理,我们开发了一个脚本来自动获取接近软件漏洞检测问题的高质量记录。总而言之,第一阶段,我们从数据库中检索到了总共3,154篇论文。从最初的论文库中,选择了 880 篇论文进行第二阶段的进一步评估。第二阶段根据摘要进行评审,最终选出116篇带有相关摘要的论文。最后,在第三阶段,阅读全文后,最终选出67篇论文纳入研究。

3.4 研究质量评估

对于每项最终选定的研究,我们回答了以下问题来评估其质量:
• 是否存在与软件漏洞检测相关的明确研究目标?
• 所提出的漏洞检测方法是否使用了机器 学习或深度学习技术?
• 是否有明确的定义和可重复的技术?
• 对漏洞检测有任何明确的贡献吗?
• 是否有明确的方法来验证该技术?
• 选择进行验证的主题项目是否适合研究目标?
• 是否有控制技术或基线来证明其有效性
• 评估指标是否与研究目标相关(例如,评估所提议技术的有效性)?
• 研究中提出的结果是否与研究目标一致,是否以清晰且相关的方式提出?

3.5 选型验证

为选定的 67 项初步研究创建分类法的过程涉及几个步骤。首先,主要作者建立了一 个初步分类法,根据研究问题将这些研究分组在一起。该分类法为以有意义和系统的方式组织研究提供了基本框架。接下来,主要作者通过分配新的分类法来扩展分类法论文初步分类。如果一篇新论文无法融入分类法中的任何现有类别,则会创建一个反 映该论文独特特征的新类别。为了确保分类法的准确性,第二和第三作者(不参与分类法创建过程)从工作流程中随机选择 20 篇论文,并检查创建的分类法是否存在差 异。然后,他们标记他们发现的任何分歧,所有三位作者讨论并解决这些分歧。最初,分歧率为 30%,但经过第二轮审稿和论文交叉检查后,作者消除了所有分歧。
image.png

4 结果

我们在本节中介绍我们的分析和发现,以解决我们在第 1 节中设计的研究问题。

4.1 RQ1. 使用ML/DL模型进行漏洞检测的研究趋势是什么?

为了了解出版物的趋势,我们检查了出版日期及其发布地点。

4.1.1 RQ1.1. 随着时间的推移,软件漏洞检测的研究趋势是什么?

图2展示了2011年 至2022年11年间漏洞检测研究的发表趋势。可以看出,这些年的发表数量逐渐增加。 2011年至2016年仅有1篇出版物,2021年出版物数量增加至18篇。但2022年出版物数量较2022年有所减少到上一年。我们还检查了图 2 中所示的累积出版物数量。值得注意的是,拟合分布的曲线显示 2018 年至 2022 年间斜率显着增加,这表明自 2017 年以来使用 ML/DL 技术进行软件漏洞检测已成为流行趋势,并 且广泛的研究已经利用 ML/DL 模型来解决该领域的挑战。
image.png

4.1.2 RQ1.2. 发表地点分布如何?

在这项研究中,我们总体分析和审查了来自不同出版场所的 67 篇论文,其中包括 43 篇会议和研讨会(symposium)论文以及 24 篇期刊论文。我们在表 2 和表 3 中列出了会议和期刊的缩写词及其完整名称以供参考。表 4 显示了每个出版地点的主要研究分布。 64.1%的出版物发表在会议和研讨会上,35.8%的论文以期刊论文形式发表。可以看出,MSR、IJCAI 和 ECSE/FSE 是最受欢迎的初级研究数量最多的场所,每个场所都包含 4 篇论文。同时,在期刊中,TDSC 和 TSE 的研究数量最多, 分别为 6 篇和 4 篇。
image.png
image.png

在这里插入图片描述

RQ1的答案:
(1)结果表明,ML/DL技术在软件漏洞检测中的应用在过去几年中呈显著上升趋势。
(2)近年来发表了大量论文,即2021年和2022年。
(3) MSR、IJCAI和ECSE/FSE是最受欢迎的会议场所。另一方面,TDSC 和 TSE 是最受欢迎的期刊场所。

4.2 RQ2. 软件漏洞检测数据集有哪些特点?

数据对于构建和评估基于 ML/DL 的软件漏洞检测模型非常重要 [30,32,37,90,92]。数据集的质量可以通过不同的因素来评估,例如数据来源、数据大小和规模、数据类型以及对数据执行的预处理步骤。例如,对数据不适当的预处理(表示)可能会导致深度学习模型的性能不佳 [121]。在本节中,我们检查了漏洞检测研究中使用的数据,并对数据源、数据类型和数据表示的步骤进行了全面分析。

4.2.1 RQ2.1. 数据集的来源有哪些?

基于 ML/DL 的软件漏洞检测的主要挑战之一是可用于训练操作的数据量不足 [24, 92]。因此,在如何获取足够的数据集以促进 ML/DL 的训练方面存在研究空白软件安全漏洞检测模型。为此,我们分析了所研究的 67 项初步研究中的数据集来源。我们的分析表明,用于此目的的数据集可大致分为三类,即Benchmark、Collected和Hybrid soures。
Benchmark 包含用于评估漏洞检测方法和技术性能的标准化数据集 [32, 33, 55, 60, 62, 64, 72, 95, 98, 109, 116, 123, 134, 138, 144, 145,150, 161]。软件漏洞检测的基准数据集通常由三个主要来源构建。第一个数据来源是从开源中收集代码片段。这可以包括开源软件项目 [67]、 公共漏洞数据库 [11] 和错误存储库 [14]。目标是收集代表不同应用程序领域的一组不同的程序或代码片段,编程语言和漏洞类型。从收集的数据中,选择特定的程序或代码片段以包含在基准数据集中。选择过程会考虑程序复杂性、漏洞多样性和代码质量等因素。目的是创建一个涵盖广泛漏洞并代表真实场景的数据集。在某些情况下,基准数据集可能包括自动生成的合成程序[12]。这些程序通常是使用代码生成技术创建的,并遵循某些模式或模板。综合生成允许创建大规模数据集,并可以帮助系统地覆盖更广泛的漏洞。除了合成程序之外,基准数据集通常还包括现实世界的软件应用程序或手工编写的代码片段。这些手动创建的案例确保数据集包含反映实际编码实践的真实漏洞。手动创建涉及识别代码中的脆弱点、引入适当的弱点以及保持代码质量和现实性之间的平 衡。
Collected数据集是从 Github 或 Stack Overflow 等存储库网站上托管的公开可用项目收集的 [24,28,94,118,154] ,155]。此外,一些研究使用不同来源的组合进行漏洞检测,以提高其研究结果的外部有效性[24,58,79,84,122,136,155],这在本工作中指的是Hybrid soures。
初级研究中数据集来源的分布如图3所示。我们可以看到,65.7%的初级研究使用了Benchmark数据集来进行软件漏洞检测。这一趋势背后的理由是基准数据集对所有研究人员来说都很容易访问, 并且可以促进先前研究的可重复性。研究人员经常使用Collected datasets来评估所提出的基于 ML 或 DL 的安全漏洞检测模型。根据我们的观察,25.4% 的研究使用收集的数据集构建漏洞检测模型。原因有几个,首先,像 GitHub 这样的开源存储库包含由来自不同背景的开发人员编写的大量实际代码。这些数据反映了软件项目中存在的现实世界编码实践、模式和漏洞。通过分析此类数据,研究人员可以深入了解现实世界软件中常见的漏洞类型及其出现频率。其次,开源存储库提供了识别基准数据集中可能不存在的新漏洞的机会。通过分析不同的代码库,研究人员可以发现以前未知的漏洞或已知漏洞的变体,这有助于推进最先进的技术。
image.png
第三个主要数据来源是Hybrid soures,占初级研究的 9%,它是不同来源的组合。研究人员经常使用混合源进行软件漏洞检测,以解决单个数据源的一些局限性并获得更加多样化和全面的数据集。例如,研究人员可以将基准数据集的数据与来自其他来源(例如 Github、开源项目或商业公司的数据)的数据相结合,以创建更能代表现实世界场景的混合数据集。通过这样做,他们可以提高模型的通用性,并增加检测更广泛漏洞的机会。
表 5 显示了初步研究中使用的 benchmark data 的详细分布。可以看出,NVD 和 SARD 是基准类别中使用最广泛的数据源。这是因为 SARD 和 NVD 是公开可用的基准源,研究人员可以不受限制地访问。他们提供了大量的漏洞数据,使研究人员能够获得各种漏洞进行实验和分析。这些材料的可用性促进了软件漏洞检测研究人员之间的可重复性和协作。总体而言,有 35 项独特的初步研究使用来自不同来源的基准数据集。
image.png
表 6 显示了Collected source of data的详细分布。如图所示,Github 是软件漏洞检测最流行的数据源,占 14 项主要研究。研究人员可以通过抓取平台并提取相关代码存储库或使用 Github 的 API 以 编程方式访问数据来从 Github 收集数据集。使用 GitHub 作为数据源的优点之一是它可以访问开发人员编写的实际代码,这些代码可用于训练和测试漏洞检测模型。该数据对于检测基准数据集可能未涵盖的新的和正在出现的漏洞特别有用。 Jira、CVE 和 Bugzilla 紧随其后,各有 2 项初步研究。总体而言,有 17 项独特的初步研究使用收集的数据源进行软件漏洞检测。
image.png

4.2.2 RQ2.2. 先前的研究中使用的软件漏洞检测数据集有哪些类型?

当涉及到检测软件漏洞时,数据集可以具有不同的数据类型,例如,现有的软件漏洞检测模型可以发现源代码或提交中的漏洞。仔细检查数据类型是至关重要的,因为它们需要不同的预处理技术,并且在使用 ML/DL 模型时必须以不同的方式表示。此外,不同的数据类型需要不同的 ML/DL 模型架 构方法。本节概述了各种数据类型及其分布。我们将所使用的数据集的数据类型分为三大类, 即基于代码的、基于存储库的和混合的。
图4显示了初步研究中数据类型的分布。我们可以观察到,大多数初步研究(70.1%)主要集中于分 软件漏洞检测的源代码。这表明代码级分析在识别漏洞方面的重要性。存储库级数据(例如提交历史 记录和更改日志)的利用也很突出,占初级研究的很大一部分(25.4%)。这表明存储库级别的信息 在漏洞检测中被认为是有价值的。此外,一小部分(4.5%)的研究采用混合方法,结合了代码级分析和存储库级信息。这些技术利用两种数据源的优势来提高漏洞检测的准确性和有效性。
image.png
表 7 详细阐述了初步研究中使用的详细数据类型类别。该表显示,42项初步研究使用了基于代码的类别,该类别的主要数据类型是源代码[38,42,82,84,86,87,90,143,153,157,158,160]。二进制代码是基于代码的类别中的第二个主要数据类型[61,109,116,145],占 5 项初步研究的比例。关于基于存储库的类别,13 项主要研究侧重于通过从开源软件存储库中抓取不同的工件来提取有用的信息和模式。主要工件是代码更改,涉及 8 项主要研究 [25、35、45、58、85、94、118、154],Commit 是第二个,有 5 项主要 研究。最后一类数据类型是混合数据类型,其中研究使用不同数据类型的组合来进行软件安全漏洞检测、核算
image.png

4.2.3 RQ2.3. 输入数据如何表示?

如前几节所述,专注于软件漏洞检测的研究依赖于不同的数据源和数据类型。这种异质性需要使用不同的表示技术,这反过来又需要 ML/DL 模型的不同架构方法和设计假设。我们将所使用的数据集的输入表示分为五 类,即基于图(Graph-baseed)、基于树(Tree-based)、基于令牌(Token-based)、基于度量(Metric-based)和混合(Hybrid)。图 5 显示了初级研究中使用的不同输入表示的分布。从饼图中,我们可以观察到最流行的输入表示是使用基于图/树的 表示,占最大切片(即基于图的表示为 38.8%,基于树的表示为 16.4%)。基于token的表示紧随其后,占初级研究的很大一部分(29.9%)。混合表示结合了多种表示或方 法,所占比例较小(10.4%)。最后,使用Commit Metrics漏洞检测的比例最小 (4.5%)。在下面的段落中,我们将详细阐述每个类别。
**基于图/树的表示 **[17, 28, 30, 36, 38, 49, 61, 64, 72, 85,87, 97, 98, 107, 108, 116, 134, 140, 146, 150, 153, 154 , 157, 159, 160, 160]:允许检测不同代码元素之间的复杂模式和关系。通过将源代码表示为图或树,不仅可以捕获代码的语法和结构,还可以捕获其语义、控制流和数据流。 有许多基于图/树的表示技术,例如抽象语法树(AST)[35,86,90,91,102,142]和代码属性图(CPG)[38,49,154]用于将源代码转换为 AST。
基于令牌的表示[3, 33, 37, 60, 79, 94, 109, 118, 122, 144, 155]:将源代码视为字符串令牌序列,然后将源代码转换为令牌向量。输入数据首先被分割成一系列标记,然后转换为可以由机器学习算法处理的数值向量。标记化涉及将一串文本或源代码分解为更小的单元或标记,然后可以将其用作进一步分析的基础。对于源代码,标记可能包括关键字、运算符、变量和编程的其他元素语言语法。
提交指标 [110, 113, 147]:利用从提交中提取的指标来表示代码提交。来自提交的特征(例如代码更改的大小、修改行的数量、更改的复杂性或使用的编程语言)可以用作训练 ML/DL 模型的输入。然后,这些模型可以学习提交特征与漏洞存在之间的模式和关系,从而实现基于新提交的自动检测。
混合表示[24,28,60,79,122,123,136,155]:使用不同表示的组合进行软件安全漏洞检测。组合输入数据的不同表示可以得到更全面、更丰富的源代码输入表示,从而可以提高漏洞检测模型在预测或检测等任务中的性能。组合不同的表示(例如基于标记的表示和基于图形的表示)可以帮助捕获代码的语法和语义,以及代码的不同组件之间的关系。
image.png
表 8 显示了 ML 使用的不同工件所分布的表示技术/DL 模型。可以看出,基于图/树的表示是初级研究使用的最主要技术,总共占 32 项独特的初级研究。这些研究通过源代码作为图、源代码作为树和二进制代码作为图来表示 ML/DL 模型的输 入。源代码作为图表是初级研究使用的主要表示技术 [17, 28,30, 36, 38, 49, 61, 64, 72, 85, 87, 97, 98, 107, 108, 116, 134, 140 , 146, 150, 153, 154, 157, 159, 160, 160] 统计了 22 项研究。源代码作为树[32,35,82,86,90,91,95,128,136,138,156]是第二个主要的表示技术,占 9 项初步研究。一些研究人员使用二进制代码作为图[61, 116]来构建二进制级别的漏洞检测模型,占初步研究的2。有 14 项主要研究使用基于令牌的表示,其中 10 项主要研究将源代码表示为令牌序列,三项主要研究将二 进制代码建模为令牌,一项研究将文本表示为令牌序列[155]。混合表征有 5 种不同类型,涉及 8 项 主要研究。 Token Sequence+Commit Metrics 是用于增强软件漏洞检测中输入表示的主要工具, 占 4 项主要研究的比例。它结合了来自代码令牌序列的信息和来自软件提交的附加指标。这种方法利用了代码的结构和历史方面,为构建漏洞检测模型提供了更全面的表示。
Commits是 3 个主要研究中使用的第四少的输入表示。在这种表示中,commit 特征用于构建软件漏洞检测模型。
image.png
图 6 显示了软件漏洞检测研究中数据类型表示随时间的分布。如图所示,与其他输入表示技术相比,基于图的表示显示出实质性的存在。这种趋势有几个原因。首先,图形提供了一种自然直观的方式来表示源代码中的结构关系。通过将代码建模为图形,可以有效地捕获函数、类、方法和变量之间的关系。这使得漏洞检测算法能够在更高的抽象级别上分析代码, 并捕获代码元素之间复杂的依赖关系和交互。其次,基于图形的表示可以更好地理解可能存在漏洞的上下文。通过考虑周围的代码结构和依赖性,基于图的方法可以捕获信息流并识别可能导致漏洞的潜在路径。这种上下文理解有助于识别可能引入安全漏洞的代码模式、控制流路径和数据依赖性。基于令牌的表示也越来越受欢迎,在 2021 年达到顶峰。这是因为它提供了代码的细粒度表示。它通过将代码的复杂性降低为标记序列来简化代码分析过程,从而更容易应用传统的自然语言处理技术或 ML 模型。它还可以轻松应用于多种编程语言。虽然令牌本身可能因语言而异,但将代码分解为离散单元的概念仍然是相同的。这种多功能性允许基于令牌表示的漏洞检测技术应用于不同的编程语言和代码库,这进一步提高了漏洞检测模型的外部有效性。然而,2022 年略有下降,表明输入表示形式的选择可能发生变化或多样化。自 2021 年以来,混合表示受到关注,这表明组合不同表示受到软件漏洞检测研究人员的青睐,这可能是由于多种表示提供的互补优势。
image.png

4.2.4 RQ2.4. 如何将输入数据嵌入特征空间?

在上一节中,我们讨论了各种表示技术,在本节中,我们进一步研究可以将这些表示转换为 ML/DL 模型可以理解的输入的嵌入方法。表示技术采用人类可读的格式,无法直接由机器解释。因此,研究人员使用不同的嵌入技术将这些表示转换为数字格式。我们在下面的段落中讨论嵌入技术。
基于图 7 所示的分布。该图说明了初级研究中使用的特征嵌入技术的分布。该图表显示了以下类别及 其对应的百分比:Wordԑvec (25.4%)、图嵌入 (25.4%)、Token 向量嵌入 (11.9%)、其他 (16.4%)、混合 (7.5%)、单热嵌入 (6.0%) 、代码标记嵌入 (4.5%) 和 N-gram 特征 (3.0%)。
Word2vec [24, 37, 62, 64, 84, 85, 90, 92, 94, 114, 118, 120, 123, 124, 144 , 145, 154, 155, 160, 161]:是审查论文中最广泛使用的源代码嵌入技术之一,占初级研究的 25.4%。这可能是因为它已被证明可以有效捕获不同代码组件之间的语义和关系。 Word2vec 可以在代码语料库上进行训练, 以学习不同代码组件(例如变量、函数和运算符)的嵌入。通过考虑这些组件出现的上下文, Word2vec 可以捕获它们之间的语义关系。此外,Word2vec 是一种计算效率高且可扩展的技术,可以在大型代码语料库上进行训练。这对于源代码嵌入很重要,因为代码语料库可能比自然语言处理中通常使用的文本语料库大得多。
图嵌入[17,35,38,49,98,116,136,140,150,153,157] :是初级研究中另一种广泛使用的嵌入技术,占初级研究的25.4%,主要用于图神经网络。这可能是因为它可以捕获不同代码组件(例如函数、类和方法)之间的结构关系。与基于标记的表示或基于序列的表示相反, 图嵌入可以显式地表示不同代码组件之间的连接和依赖关系。在基于图的表示中,代码组件表示为节点,它们之间的关系表示为边。这允许更细粒度地表示代码结构。
令牌向量嵌入[25, 32, 33, 45, 58, 60, 91, 95, 102, 138, 142, 143]:也是初级使用的流行技术研究占论文的11.9%。在这种技术中,输入被转换为一系列标记,每个标记被转换为一个数值。然后,这些值被输入到 ML/DL 模型中 以进行进一步计算。
独热嵌入 [55,60,76,109]:是编码分类数据的典型方式,其中每个类别由零和一的二进制向量表示。该方法还可以用于对源代码进行编码以进行漏洞检测,占研究的6%。
代码标记嵌入[32,33,95]:用于将源代码标记表示为连续向量空间中的稠密向量。代码令牌嵌入通过将令牌转移到低维向量空间来捕获令牌之间的语义和句法链接,而不是独热编码,后者将每个令牌表示为稀疏二进制向量。
N-gram 特征 [79, 128]:是一种将代码片段表示为固定长度密集向量的方法,每个向量代表一个 n-gram 标记。 N-gram 是 n 个标记的序列,例如单词或字母,它们捕获本地上下文和相邻标记之间的相互依赖关系。我们观察到 3% 的初级研究使用 N-gram 特征进行嵌入。
混合 [28,64,84,85,154]:我们发现 7.5% 的初级研究使用多种嵌入技术将输入转换为 ML/DL 模型。不同的嵌入技术捕获数据的不同方面。通过结合多种技术,研究人员可以利用每种技术提供的补充信息。例如,一些嵌入技术可能侧重于语法,而其他嵌入技术可能会捕获语义或上下文信息。
其他 [30,42,61,72,110,113,123,147,152,156,158]:剩余的16.4%出现很少且不属于任何群体的人被归类为"其他"。例如,张等人 [152]定制了graphCodeBERT [54], 提出了一种用于漏洞检测的图引导屏蔽注意机制,其中捕获变量依赖关系并将图结构集成到 Transformer 模型中。

在这里插入图片描述


RQ2的答案:
(1) 65.7% 的初级研究使用基准数据进行软件漏洞检测。这可能是因为基准数据集可供所有研究人员轻松访问,并且可以促进研究的可重复性。
(2) 所检查的漏洞检测研究中最常见的数据类型是代码基于数据类型,涉及 47 项研究。 在这一类别中,源代码是最突出的子类型,占 42 项研究。
(3) 基于图和基于令牌的输入表示是初级研究中最流行的输入表示技术,分别占初级研究的 38.8% 和 29.9%。
(4)图嵌入和Word2vec是初级研究中使用最广泛的两种嵌 入技术,分别占研究的25.4%。

4.3 RQ3. 用于软件漏洞检测的 ML/DL 模型有哪些?

在本节中,我们提供有关用于软件漏洞检测的各种 ML/DL 模型的详细信息。首先, 我们根据初步研究对 ML/DL 模型的使用分布进行分析。随后,我们深入研究了初级研究中深度学习模型的使用随时间的分布。然而,我们没有广泛分析 ML 模型的分布,因为与 DL 模型相比,它们的流行程度相对较小。尽管如此,我们提供了初步研究中常用的经典 ML 模型的完整列表。
从图 8 中可以看出,79.1%使用 DL 模型进行软件漏洞检测的研究 [4, 28, 32, 33, 60, 64, 79, 92, 94, 95, 98, 116, 118, 122, 134, 136, 138, 154],而只有 16.4 % 的研究使用经典的机器学习模型 [72, 109, 113, 114, 120, 124, 142, 143]。此外,有限数量的研究使用表示为 LM [112, 128] 的语言模型和表示为 DM [61, 144] 的距离度量。
image.png
图 9 中的图表说明了 2016 年至 2022 年 DL 模型在检测软件漏洞方面的使用趋势。顺应这一趋势,DL模型于2016年首次引 入用于漏洞检测,此后使用RNN进行漏洞检测呈上升趋势。该图还表明,从2020年到2022年,使用 GNN 进行漏洞检测的趋势呈上升趋势。
image.png
这可能是因为 GNN 在检测漏洞方面比 RNN 更强大,因为它们可以捕获输入源代码更有意义的语义表示。由于漏洞类型通常具有复杂的结构,因此 GNN 非常适合检测隐藏的结构信 息。
表 9 显示了初步研究中使用的 DL 模型的分布。如表所示,LSTM 是最常用的循环模型,出现在 8 项研究中。 BiLSTM 和 BGRU 也是流行的模型,分别有 8 项和 6 项研究。还可以看出,GGNN 是最流行的基于图的模型,出现在 4 项研究中。 GCN、GAT 和 DR-GCN 也很常用,分别占 4、3 和 2 个研究的比例。这些模型的存在凸显了在漏洞检测中捕获图形结构和代码元素之间的关系的重要性。 7 项初步研究也使用了注意力模型。注意力机制允许模型更多地关注代码或输入中更可能包含漏洞相关模式的特定部分。这种本地化相关信息的能力有助于更有效地识别和理解导致漏洞的因素。 6 项研究中使用了 CNN。虽然不像循环模型或图模型那样普遍,但 CNN 仍然被认为可以有效捕获漏洞检测任务中的局部模式和特 征。 DBN、Auto Encoders、Memory Neural Networks、GAN、Para2Vec等通用模型也有少量使用,表明深度学习技术在漏洞检测中的多样化探索。 Transformer 是初级研究中使用频率最低的 DL 模型家族。这是因为它们最近被引入用于软件漏洞检测。Transformer在这个领域是有效的,因为它们为输入序列中的每个标记生成上下文表示。通过考虑周围的标记及其交互,变压器捕获丰富的上下文信息,这对于理解依赖于代码整体上下文或漏洞相关文本的漏洞至关重要。
image.png
表 10 显示了初级研究中使用的 ML 模型的分布。如图所示,随机森林是最常用的 ML 模型,出现在 7 个研究中。 SVM、朴素贝叶斯和逻辑回归是热门选择,分别出现了 6 次、5 次和 4 次。一项研究中使用了 N-Gram 模型,表明它们在捕获漏洞检测中的顺序模式和基于语言的特征方面的应用。 N-Gram 模型通常用于文本分析,并且已适用于代码分析任务。两项研究利用距离测量来检测漏洞。这些指标有助于量化代码元素或功能之间的相似性或相异性,从而能够根据与已知漏洞的接近程度来识别潜在易受攻击的代码段。

在这里插入图片描述


RQ3的答案:
(1) 79.1% 的初步研究使用深度学习模型进行漏洞检测,而只有 16.4% 的初步研究 使用经典的机器学习模型。
(2) RNN 和 GNN 是迄今为止软件漏洞检测中最流行的基于深度学习的模型分别占初级研究的 28% 和 22%。
(3) LSTM 是基于 RNN 的模型中最流行的架构。
(4) 基于图的模型是软件安全漏洞检测中第二流行的模型,占 15 项研究。在这个家族中,GGNN 是最流行的架构。
(5) 除了 DL 模型之外,ML 模型在软件漏洞检测中也很流行。随机森林是最流行的模型,有 7 项研究。

4.4 初步研究中最常见的脆弱性类型是什么?

软件漏洞检测数据集支持不同的漏洞类型。例如,NVD和SARD基准测试总共支持96种类型的漏洞。本研究问题旨在总结初步研究涵盖的最流行的漏洞类型及其频率。表11显示了有关漏洞类型的统计信息。列CWE-Type指示CWE 的类型。某些类型的 CWE 还存在一 个数字分数,表明弱点的严重程度。值越大表示危险性和严重程度越高 5 。请注意,一些常见类型没有 CWE 分数,因此我们用"-“表示主题。 CWE网站上有很多漏洞分类的类别,包括按软件开发分类、按硬件设计分类、按研究概念分类。
表 11 中显示的分类基于研究概念的分类,因为该分类与初步研究中报告的漏洞类型完美匹配。表 11 表明,参与度最高的漏洞类别与资源在其生命周期中的不当控制有关(CWE-664),共有 42 项研究(18 项独特的研究)。此类别主要涉及管理系统资源,这些资源是根据预定义的指令集创建、使用和处置的。当软件系统未能遵循这些资源使用准则时,可能会导致意外行为,从而造成潜在的危险情况。攻击者可以利用这些情况来利用软件系统来达到自己的目的。可以看出,CWE-119 [17,25,28,38,42,45,76,88,90,95,109,122,136,145]是初步研究中最常见的漏洞类型。该漏洞当软件系统尝试访问或写入系统缓冲区允许边界之外的内存位置时,就会发生这种情况。攻击者 可以通过控制内存位置并执行自己的代码或命令来利用此漏洞,从而有效地操纵系统内存。尽管这种漏洞类型的得分不高,但针对该漏洞类型的初步研究的频率可以作为一个有价值的指 标,表明其在检测和解决漏洞方面的重要性。在此类别中,最严重的漏洞类型是 CWE-787,得分为 65.93,在 5 项初步研究中对此进行了讨论。此漏洞被认为是严重且关键的,因为它可能导致数据损坏、系统崩溃或恶意代码的执行。当软件系统尝试将数据写入超出预期缓冲区(在缓冲区开始之前或超过缓冲区末尾)时,就会发生这种情况。 CWE-22是另一种由初步研究解决的常见漏洞类型,占 4 项初步研究 [17,28,45,49]。此漏洞被称为"路径遍历”,攻击者利用特殊元素,例如"…“或” /",构建自己的路径并获得对受限制位置的未经授权的访问。此漏洞尤其严重,因为攻击者可以利用它来修改易受攻击的软件系统中的受限制文件或目录,通过上传恶意代码或命令可能导致系统崩溃。在关键的金融软件系统中,攻击者甚至可以访问客户的银行账户信息。鉴于该漏洞类型的严重性(得分为 14.69)以及涉及该漏洞的论文频率,检测和解决该漏洞至关重要。因此,需要更先进的ML/DL模型来有效检测此类漏洞。该系列中最不常见的漏洞类型是 CWE-120 [17, 122],它是一种经典的缓冲区溢出,占 2 项主要研究的影响。 当软件尝试将值复制到输出缓冲区而不首先验证其大小时,就会出现此漏洞。如果值的范围对于输出缓冲区的长度来说太大,则可能会发生缓冲区溢出。虽然在某些情况下检测缓冲区溢出可能具有挑战性,但静态错误检测工具已经解决了此漏洞,并且当前的检测方法也可用。
不当中和(Improper Neutralization) - (CWE-707) 是 16 项主要研究涵盖的第二个主要漏洞类型系列,包括9 项独特的初级研究。在这种类型中,攻击者会利用格式错误或未正确验证的输入和输出数据。有几种情况可能会导致数据中和缺陷。第一个场景涉及检查输入和输出数据是否安全,而第二个场景涉及过滤输入和输出数据以确保任何数据转换都是安全完成的。第三种情况涉及防止外部攻击者直接操纵输入和输出数据,而第四种情况涉及在任何情况下都不处理输入和输出数据。所有这些情况都可能是数据中和弱点的根本原因。可以看出,CWE-20 是 6 项初步研究中最常见的漏洞类 型。 CWE-20 指的是软件系统中输入验证未正确完成的情况,使软件系统容易受到可利用输入数据的恶意个人的攻击。当输入数据未经验证时会发生这种情况

在这里插入图片描述


为了安全或符合预定义的规格。此问题的严重性和发生率非常高,凸显了对其进行检测的必要性,因为它可能会带来严重风险。 CWE-78 是 5 项初步研究涵盖的第二个主要漏洞类型 [28,49,86,136,146]。此类安全漏洞与操作系统命令注入有关,其中外部攻击者可以通过使用未经充分验证的组件的输入数据来构造操作系统命令。然后,攻击者可以执行有害命令,可能导致系统意外运行或崩溃,并将其置于危险状态。
RQ4的答案:
(1) 初步研究中最常见的漏洞类型是资源生命周期的不当控制 (CWE-664),占 18 项独特的初步研究的影响。 CWE-119:内存缓冲区范围内操作的不当限制是此类漏洞中最常见的类型,涉及 14 项主要研究,而 CWE-787:越界写入随后被 5 项主要研究涵盖。最不常见的漏洞类型是 CWE-120,由 2 项研究涵盖。
(2) 不当中和 (CWE-707)是总共 9 项独特的初步研究涵盖的第二个主要漏洞类型家族。在这个 系列中,CWE-20:不正确的输入验证是 6 个主要研究涵盖的最常见类型, CWE-78:操作系统命令中使用的特殊元素的不正确中和(“OS CommandInjection”)紧随其后,有 5 个主要研究
(3) 一些漏洞类型具有较高的 CVSS 分数,但现有的漏洞检测研究尚未充分解决,包括但不限于 CWE-79 和 CWE-89。

4.5 RQ5. 软件漏洞检测可能面临的挑战和开放方向是什么?

我们将之前研究中的挑战总结为五个不同的类别,讨论如下:
挑战1:语义表示。通过学习进行漏洞检测的最大挑战是当前模型对复杂漏洞的综合语义建模不足[28,30,32,33,38,60,64,82,86,87,97,107,108,116,128 , 138, 140, 146, 153, 154, 156]。这些漏洞通常表现出复杂的特征和模式,而现有的 ML/DL 模型无法完全捕获这些特征和模式,这些模型将源代码片段视为像自然语言一样的线性序列,或者仅部分代表源代码代码片段。与自然语言不同,现实世界项目的源代码包含使用 AST、数据流和控制流的 ML/DL 模型必须考虑的结构和逻辑信息。因此,当前的 ML/DL 方法无法识别复杂的漏洞模式。
挑战 2:预测粒度。深度学习模型识别漏洞位置的能力受到其输入的粒度级别的影响。当前的深度学习模型使用较粗的粒度(例如方法和文件)来进行漏洞检测。为了实现更细粒度的输入,程序切片是必要的,但这也带来了挑战。关键问题是如何有效地进行程序切片,以消除输入数据中不需要的噪声并提供更具体的输入。当前的工具 [17、35、36、45、84、91、113、159、160] 专注于库/API 函数调用、算术运算和指针使用,但这种方法还不够,因为并非所有漏洞都源于这些切片标准。
挑战 3:误报去除。用于检测软件漏洞和错误的最常用工具是静态分析器[55、72、85、150、155、158、160]。这些工具利用专家定义的硬编码规则来对程序的运行时行为进行建模,而无需进行编译。这种方法有几个好处, 例如有效地识别源代码中的漏洞位置,这在具有数千个文件和工件的大型项目中具有挑战性。此外,静态分析器用于软件开发过程的早期阶段,这有助于降低软件维护成本。然而,依赖专家定义的规则会带来很高的误报率,因为这些规则可能无法推广到具有错综复杂的程序语义的新漏洞。另一个重要问题是, 定义和更新规则是一个劳动密集型且耗时的过程,需要专家对新出现的漏洞有深入的了解。这就是为什么数据驱动的漏洞检测应运而生,以克服上述挑战 [55,72,85,150,155,158,160]。
挑战4:缺乏训练数据。深度学习模型的一个显着弱点,特别是在软件漏洞检测方面,是它们对数据的无限需求 [24,90,95,110,147]。在图像分类等领域,有充足的标记数据,使得有效训练深度学习模型成为可能。此外,还有许多预训练的模型可以针对检测任务进行微调。然而,在软件漏洞检测中,数据稀缺是一个主要问题,因为标记真实信息是一项具有挑战性的任务。为了获取训练数据,使用了多个在线平台,例如 Stack Overflow、GitHub 以及问题跟踪或错误跟踪系统。虽然这些平台包含数十亿条记录,但标记过程很困难并且通常是手动完成的。一种可能的解决方案是自动标记数据,但这种方法具有挑战性,因为它经常产生许多误报。此外,一些研究人员使用无监督分类来进行漏洞检测,但这种方法也存在精度有限的问题。
挑战 5:缺乏模型可解释性。深度学习模型中的可解释性是指理解和解释模型做出的决策的能力 [40, 105]。在软件漏洞检测 [84,97,161] 的背景下,存在一些挑战,使得深度学习模型的可解释性面临挑战。首先,源代码可能非常复杂,尤其是在大型软件项目中。它通常由多个文件、函数和依赖项组成,因此很难从代码中提取有意义且简洁的解释[66]。软件系统是动态的,会随着时间的推移而发生变化。代码经常被维护、更新和重构,这可能会给解释人工智能模型做出的决策带来复杂性。如果自模型训练以来代码已发生变化,则模型的解释可能不适用于当前版本的代码。
RQ5的答案:
(1)当前模型不足以捕获复杂漏洞的全面语义,因为它们未能考虑源代码片段中存在的结构和逻辑信息。现有的ML/DL模型将源代码视为线性序列,这限制了它们识别复杂漏洞模式的能力
(2)DL模型通常使用粗粒度级别进行漏洞检测,例如方法和文件级别。实现更细粒度的输入需要有效的程序切片技术来消除噪音并提供更具体的输入。当前的方法侧重于某些切片标准,但漏洞也可能来自其他来源。
(3)DL 模型需要大量标记数据才能进行有效训练。然而,在软件漏洞检测中,由于手动标记的任务艰巨,导致标记数据稀缺。自动标记方法经常产生误报,而无监督分类的精度有限。

5 有效性威胁

外部有效性。我们工作的外部有效性的主要威胁之一是内部数据收集。我们收集了 2011 年至 2022 年 11 年期间的数据,以涵盖该期间发表的所有可能的研究。对外部有效性的另一个威胁来源是软件漏洞检测中输入数据类型的覆盖。为了应对这一威胁,我们重点关注源代码片段和存储库数据,即可以从开源中提取的数据,包括 GitHub 和 CVE。
内部有效性。我们工作的内部有效性的主要威胁之一是自动收集数据进行分析。 我们的数据收集技术在最初的步骤中是自动化的,其中我们可能会错过一些重要的漏洞检测论文。事实上,我们开发了一套脚本,使我们能够提取 11 年期间的论文。即使后续步骤是手动监督的,自动过滤仍然会遇到这个问题。我们数据收集的第二个重要问题是可能存在偏差。偏见的根本原因是论文分类过程中不可避免的分歧,因为两名研究人 员共同根据论文的标题、摘要和内容对论文进行分类。如果研究人员无法达成一致,第三位研究人员会加入解决分歧,从而在某种程度上缓解问题。
构建有效性。我们调查的结构有效性的主要威胁是我们对每项初步研究进行的分析的粒度水平。对于每项研究, 我们都深入分析了论文中解释的工件,并以表格和图表的形式显示了它们的分布。例如,在基准数据来源方面,我们深入分析了17个来源,占53个总体上进行了初步研究。结构有效性的第二个威胁是每项初步研究的覆盖程度。我们从输入数据、输入表示、嵌入技术、模型、漏洞类型以及研究是否支持漏洞检测模型的可解释性等五个方面分析了每项初步研究。

6 结论

在这项研究中,我们对 67 项使用 ML/DL 模型进行软件安全漏洞检测的初步研究进 行了系统调查。我们收集了来自不同期刊和会议地点的论文,包括 25 个会议和 12 种期刊。我们的综述是基于五个主要研究问题和一组子研究问题而建立的。我们以全面的方式设计了研究问题,涵盖了软件漏洞检测的各个维度。我们对初步研究的分析表明,使用 ML/DL 模型进行软件漏洞检测的增长呈现蓬勃发展的趋势。我们对原始研究数据源的深入分析表明,65.7%的研究使用基准数据进行软件漏洞检测。我们还发现了6大类深度学习模型以及14种用于软件漏洞检测的经典机器学习模型。 DL模型的类别分为循环模型、图模型、注意力模型、卷积模型、通用模型和变压器模型。 RNN 是迄今为止软件漏洞检测中最流行的 DNN。我们的分析还发现,具有 LSTM 单元的 RNN 是循环模型中最流行的网络架构,占 8 项初步研究的一部分。在图模型类别中,GGNN 是 4 项主要研究使用的最流行的 DL 模型。我们对漏洞类型的结果表明,现有研究中最常见的漏洞类型是对资源整个生命周期的不当控制(CWE-664), 占18 项初步研究的比例。总之,我们发现了一系列持续存在的挑战,需要在未来的研究中进一步探索,涉及利用 ML/DL 模型进行软件漏洞检测。
期的不当控制(CWE-664), 占18 项初步研究的比例。总之,我们发现了一系列持续存在的挑战,需要在未来的研究中进一步探索,涉及利用 ML/DL 模型进行软件漏洞检测。

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值