VULGEN:通过模式挖掘和深度学习实现逼真的漏洞生成

互联不一般哥 2024-06-03 21:33:10

VULGEN: Realistic Vulnerability Generation Via Pattern Mining and Deep Learning

Yu Nong, Yuzhe Ou, Michael Pradel, Feng Chen, Haipeng Cai∗

Washington State University

The University of Texas at Dallas

University of Stuttgart

引用

Nong Y, Ou Y, Pradel M, et al. Vulgen: Realistic vulnerability generation via pattern mining and deep learning[C]//2023 IEEE/ACM 45th International Conference on Software Engineering (ICSE). IEEE, 2023: 2527-2539.

论文:https://software-lab.org/publications/icse2023_VulGen.pdf

摘要

新的、强大的数据驱动型防御措施对抗流行的软件漏洞的建立需要大量且高质量的漏洞数据集,以及大规模对现有防御解决方案进行基准测试。自动生成数据可能是满足这一需求的有效方法,然而目前针对生成所需高质量易受攻击样本的研究较少。与此同时,现有的类似且可适应的技术在这方面存在严重的局限性。在本文中,被提出了VULGEN,这是一种基于注入的漏洞生成技术,不局限于特定类别的漏洞。VULGEN结合了确定性(基于模式的)和概率性(基于深度学习/DL的)程序转换方法的优势,同时相互克服各自的弱点。通过模式挖掘/应用和DL-based注入定位之间的密切合作,VULGEN分离了注入的方法和位置,并通过利用大型预训练的编程语言建模并仅学习位置,减少了对质量漏洞数据(用于训练定位模型)的需求。广泛的评估表明,VULGEN在生成的样本中,易受攻击的百分比以及与地面实况完全匹配的百分比方面,显著优于最先进的基于模式的对等技术以及基于Transformer和GNN的方法(分别提高了38.0–430.1%和16.3–158.2%)。VULGEN 生成的样本为两种最先进的基于DL的漏洞检测器带来了显著的性能提升(F1值最高提高了31.8%),接近地面实况样本带来的效果,远高于相同数量的现有合成样本所带来的效果。

1 引言

漏洞的普遍存在是现代软件系统安全风险的主要原因。为了应对这一挑战,本文中已经付出了大量的努力,通过检测和修复软件漏洞来帮助保护这些系统。大多数这类工作都采用了数据驱动的方法,例如基于机器学习或深度学习。这些方法近年来已经得到了越来越多的关注,根据最初报告的实验结果,它们显示出了良好的性能。 然而,高质量的漏洞数据集的稀缺性已经成为进一步推进这些数据驱动的防御技术的关键障碍。如果这些技术没有在这些数据集上进行训练,那么它们往往无法在真实世界的场景中表现良好,例如在大型/复杂的真实世界软件中检测漏洞,这一点是可以预料到的。这种稀缺性不仅阻碍了训练新的、更强大的基于学习的方法,而且也是现有技术评估的一个主要原因,无论这些技术是数据驱动的还是不是(例如基于代码分析的技术)。最近的一项研究将对逼真漏洞数据集的迫切需求置于聚光灯下。

高质量的漏洞数据集确实存在,但它们通常或甚至集体上规模不足以训练强大的数据驱动模型或进行大规模的基准测试。另一方面,现有的较大数据集并不能很好地代表真实世界的漏洞,而当前的自动数据收集方法在生成的数据集中存在很大的不准确性/噪声。为了解决这一数据短缺问题,已经提出了一些数据生成方法,主要基于模式挖掘/应用或机器学习/深度学习。然而,这些方法面临着重大挑战,严重限制了它们的潜力。

为了解决这些挑战,本文提出了VULGEN,这是一种新颖的自动生成数据方法,旨在通过模式挖掘/应用与深度学习的协同作用实现基于注入的逼真漏洞生成。本文首先利用现有的一对易受攻击样本和它们的修复版本的语料库,提取引入漏洞的代码编辑的模式,这些模式代表了如何注入漏洞,同时训练一个基于深度学习的模型(在同一语料库上)来定位注入位置。然后,给定一个正常程序,本文查询训练好的模型以识别候选注入位置,然后应用兼容的编辑模式实现漏洞注入。本文方法的关键见解是通过确定性过程(即模式挖掘/应用)和概率性过程(即注入定位)的协作以及分离注入的如何和何处部分,VULGEN结合了基于模式和基于深度学习的方法的优势,同时减轻了彼此的弱点。特别是,定位模型引导模式应用以减轻模式化方法的模糊性挑战;同时,挖掘出的模式也为定位模型选择最佳位置提供了信息。此外,训练(基于深度学习的)定位模型的鸡生蛋问题通过利用大型预训练的编程语言模型来减少一般数据需求,并且只学习预测注入位置而不进一步生成注入的代码,从而减少了任务特定数据需求(或者提高了给定数量训练数据下的模型性能,因为仅预测位置本身直觉上要比在预测的代码中生成注入代码更容易)。

本文在一个包含10,783对正常函数和相应易受攻击版本的真实世界漏洞数据集上评估了VULGEN的性能。VULGEN实现了14.6%的精度(即与地面实况完全匹配的生成样本的百分比)和69%的成功率(即确实易受攻击的生成样本的百分比)。在没有针对漏洞注入的现有同行工作的情况下,本文将一个基于模式的方法(最初设计用于漏洞修复),一个基于深度学习/Transformer的文本到文本翻译方法(最初用于漏洞修复),以及一个基于深度学习/GNN的神经代码编辑方法(最初用于一般代码编辑生成)作为基线。在相对精度和成功率改进方面,VULGEN分别比这些潜在的同行方法提高了16.3–158.2%和38.0–430.1%。本文还通过将VULGEN生成的样本添加到两种最先进的基于深度学习的漏洞检测器的原始训练集中来评估VULGEN生成的样本的实用性。这一添加显著提高了它们的性能(F1值提高了最多31.8%),无论是在重现还是复制设置下,都非常接近添加地面实况漏洞样本的效果,远高于添加相同数量的现有合成样本。VULGEN还具有高效的特点,可以在一个小时内生成900多个易受攻击的样本。

总而言之,本文具有以下贡献:

就本文所知,VULGEN是第一个注入式逼真漏洞生成的自动方法,而不局限于特定的漏洞类别。本文展示了将确定性和概率性方法结合起来进行程序转换的设计,其中模式挖掘/应用和定位分别处理注入的如何和何处部分,并在协同作用中合作。本文进行了大量实验,证明了这种VULGEN设计相对于基于模式和基于学习的(序列和图模型)方法的显著优点;我们的结果还显示了生成样本对漏洞检测带来的显著改进。

2 技术介绍

图1概述了我们的技术设计。如图所示,VULGEN包括三个主要的技术模块/阶段:模式挖掘、定位学习和漏洞注入,以两种模式运行。在挖掘/学习模式中,VULGEN从给定的现有易受攻击程序样本及其修复(即正常)版本的语料库中挖掘真实世界漏洞引入代码编辑的模式(即相应修复的反转),然后学习定位漏洞可能被注入的位置。利用得到的编辑模式和训练好的定位模型,在随后的生成模式中,VULGEN以给定的正常程序作为输入,查询模型以获取候选注入位置并应用兼容模式,从而产生易受攻击的程序。两个预处理步骤,AST构建和子词标记化,两种模式之间共享。

图1:VULGEN的概述,包括其三个关键技术模块(阶段)和两种工作流程(模式)

在模式挖掘阶段,VULGEN通过AST差异化从给定语料库中的(正常和相应易受攻击的)样本对中提取具体的(AST)编辑,然后通过反非一致性获取抽象的编辑,再通过层次聚类挖掘最终的编辑模式——这个想法类似于Getafix中用于提取bug修复模式的想法。然而,结果得到的模式通常要么太通用,与许多代码位置兼容但对于漏洞注入并不有用,因为这些模式往往具有许多不能被实例化的占位符(空洞),要么太具体,几乎与任何注入的代码位置都不兼容,如第II-B1节所示。因此,VULGEN引入了定位学习,一个专门的模块来消除基于模式的注入的歧义。在这个阶段,VULGEN旨在从真实世界开发者历史性漏洞修复代码更改位置中学习注入定位。鉴于此类修复的稀缺性,我们利用了CodeT5,这是一个基于状态的先进编程语言(PL)模型,它是在数百万个代码样本上针对相关目标进行预训练的。为了使其适用于我们的定位任务,VULGEN对其进行了微调,针对给定语料库中样本对之间的源代码级差异化获得的历史位置。请注意,此模块仅学习在何处注入(即预测注入位置),而不是如何注入(即生成注入的代码本身)。

最后,在漏洞注入阶段,VULGEN将给定输入正常程序的子词标记化代码输入训练过的定位模型,以获取候选注入位置,并选择与任何挖掘到的编辑模式兼容的位置,然后通过模式应用在选定位置注入漏洞。这将导致输入程序的易受攻击(即潜在易受攻击)版本。根据从定位模型获取的前几个候选位置,VULGEN可以生成一个或多个易受攻击的程序作为其输出。VULGEN的一个关键创新之处在于确定性过程(即模式挖掘和应用)与概率性过程(即注入定位)之间的密切协作,如模式-位置相互过滤步骤所反映的那样:(1)概率性的(定位)通知确定性的(模式应用)在哪里应用模式和应用哪些模式——结果位置有助于过滤出不兼容的模式,而(2)确定性的(模式挖掘)有助于选择由概率性的(定位)返回的最佳位置——挖掘到的模式有助于过滤出不兼容的位置。VULGEN通过两个原因实现的整体易受攻击样本生成(漏洞注入)过程是现实的。首先,当进行定位注入时,位置预测是基于真实世界的引入漏洞的代码位置。其次,当进行漏洞注入时,代码编辑是通过遵循(的反转)开发者如何在各种真实世界软件项目中进行漏洞修复而完成的。

图2:漏洞注入的动机/示例说明

2.1 模式挖掘

在模式挖掘阶段,VULGEN遵循Getafix的方法来挖掘用于漏洞注入的模式。VULGEN将正常函数和相应易受攻击版本的对作为模式挖掘(以及定位学习)的输入。每个对都是一个漏洞注入示例。为了将代码转换为AST,我们使用srcML [35],这是一种用于C语言的AST解析器,用于为每个示例获取AST。我们选择srcML是因为我们可以轻松地将解析的AST转换回源代码。然后,VULGEN使用GumTree [36]对AST进行差异化,以获取具体的编辑。然后,它遵循原始的Getafix方法执行层次聚类,并获取用于漏洞注入的编辑模式。

为了说明,考虑图2中第二个示例中的漏洞注入案例,VULGEN提取了以下具体的编辑模式:

然后,Getafix使用反非一致性将相似的具体编辑合并为抽象编辑。例如,模式1和safe_calloc(bufsize) => malloc(bufsize)可以合并为safe_calloc(h0) => malloc(h0),其中h0是一个占位符,可以匹配任何子树。通过反非一致性,Getafix执行层次聚类以获取漏洞注入的编辑模式。

2.2 定位学习

在这个阶段,VULGEN训练了一个基于Transformer的模型来定位漏洞注入点。我们将任务形式化为一个文本到文本的预测问题:给定一个正常函数,模型生成一个语句文本,指示在哪里应用编辑模式以注入漏洞。例如,在图2中,给定整个函数作为输入,模型输出红色矩形中的语句,而不进行任何修改。我们仅使用基于Transformer的模型进行定位,而不是漏洞注入,因为:(1)模型难以预测长的整个函数;(2)编程语言具有高度结构化,因此每个预测的标记都必须是正确的,这对于模型来说很难实现。

为了构建定位模型,VULGEN对预训练的Transformer模型CodeT5进行微调,因为CodeT5能够理解代码语义。为了解决代码相关任务中广泛存在的词汇表外(OOV)问题[37],我们利用了字节对编码(BPE)方法[38]来表示输入和输出文本。具体而言,BPE将原始标记分割为字符序列,并将频繁的符号对合并为新的标记。因此,它可以将罕见的标记分割为有意义的子词,从而可以减小词汇表的大小。

与传统的Transformer不同,传统Transformer利用绝对位置编码层,我们使用相对位置编码层[39]来捕获标记之间的相对信息。具体来说,在相对位置编码中,通过四个矩阵计算自注意力:查询矩阵Q,键矩阵K,值矩阵V[40]和编码相对位置信息的矩阵P。

其中,P是一对输入的边表示。P作为值矩阵的一个子组件提供[39]。为了对CodeT5模型进行注入定位的微调,我们将我们的示例处理成一个微调数据集D = {(ni,si)}N i=1,其中每个样本包含一个正常函数n和相应的地面实况语句s,其中漏洞可以被注入,两者都以文本形式表示。将模型参数表示为θ,微调目标是最大似然估计,其最小化以下负对数似然损失:

为了获得地面实况语句s作为我们的定位目标,我们对每个示例应用diff工具,并使用修改后的语句作为地面实况输出。微调后,预计注入定位模型将在给定正常函数的情况下预测一个语句以注入漏洞。鉴于注入定位模型是一个概率模型,我们利用束搜索来选择给定正常程序的多个语句。预测语句候选的数量取决于一个称为束大小β的参数。束搜索选择具有最高概率的β个最佳语句候选。稍后,我们将使用不同的束大小来评估VULGEN和基准技术。

2.3 漏洞注入

一旦我们挖掘出编辑模式并训练好定位模型,预期VULGEN可以在给定新的正常函数时注入漏洞。首先,将此输入函数输入到定位模型中,模型会定位出一个适合注入漏洞的语句。由于编辑模式基于AST并最终应用于AST,我们再次使用srcML [35]将输入的正常函数解析为AST。由于定位模型输出的是源代码中的定位语句,我们将AST中的所有子树转换回源代码,并将每个子树的源代码与定位模型输出进行比较,以获取定位的子树。给定定位的子树,我们需要选择一个合适的模式来应用。原始的Getafix根据第II节中描述的三个评分对编辑模式进行排名。由于我们不能使用定位分数,因为没有静态分析器可以使用,我们只计算普遍性分数和专业化分数来对编辑模式进行排名。

具体来说,给定一个编辑模式E和训练集D中的正常函数n,VULGEN计算E的普遍性分数如下:

这计算了一个模式能够注入漏洞的可能性。请注意,在上述方程中,我们假设模式能够完美地找到适用的位置(即,将E应用于n中的一个适用位置可以注入漏洞,则E可以向n注入漏洞)。

因此,给定一个编辑模式E和一个新的正常函数n',VULGEN计算专业化分数如下:

这避免了选定的模式过于普遍,并优先考虑更具体的模式。

给定一个编辑模式E和一个新的正常函数n',VULGEN计算每个模式的排名分数sE,n′= sE prevalence × sE,n specialization,并使用排名分数对编辑模式进行排序。其理念是选择一个不仅可能注入漏洞,而且足够专业化的模式。然后,VULGEN从得分较高到较低的排名中选择第一个匹配定位语句以注入漏洞的模式。然而,有可能某个给定函数不涉及任何安全相关的代码,因此无法注入漏洞。因此,为了减少误报,如果定位语句无法匹配任何模式,VULGEN将不会输出函数,并且将输入函数标识为“无法注入漏洞”。否则,输出函数预期会存在漏洞。

举例说明,考虑图2中的第三个示例。一旦定位模型定位到红色矩形中的if语句,VULGEN将使用上述排名分数对模式进行排名。然后,适用于排名中的第一个编辑模式,如if(h0|h1)h2 => if(h1)h2将被应用,正常函数将被注入漏洞。

3 实验评估

3.1 研究问题

RQ1:VULGEN在漏洞生成方面的效果如何?RQ2:VULGEN与基于Transformer的程序转换方法相比如何?RQ3:VULGEN与传统基于模式的代码生成方法相比如何?RQ4:VULGEN与基于GNN的代码编辑方法相比如何?RQ5:VULGEN生成的漏洞对训练基于DL的漏洞检测器有多有用?RQ6:VULGEN在漏洞生成方面的效率如何?

3.2 RQ1:生成漏洞的有效性

我们评估了VULGEN生成真实世界漏洞的能力,使用评估数据集中的示例。我们将10,783个示例分为9:1用于训练和测试,如之前的研究所做的[37],这也给了我们一个可观的测试集(即>1000个样本)。我们还检查了训练集和测试集之间的重复项,并将其删除,以确保两个集合没有重叠。结果,我们有9,704个示例用于模式挖掘和定位学习。剩余的1,078个示例用于漏洞注入阶段,以测试VULGEN的有效性。对于每个测试示例,我们将正常函数输入VULGEN,并在能够向其注入漏洞时输出一个(潜在的)易受攻击的函数。我们统计了与地面真相漏洞函数完全匹配的输出函数的数量,并通过在输出函数中的完全匹配函数的比例来计算精度。

通过1,078个测试示例,VULGEN输出了963个函数,剩余的115个被确定为“无法注入漏洞”(见IV.C节)。在这963个函数中,有141个与地面真相完全匹配。因此,精度为14.64%。

然而,可能存在漏洞注入但输出函数与地面真相不完全匹配的情况。这通常发生在输入函数具有多个位置进行漏洞注入时。因此,为了进一步评估VULGEN的有效性,我们将定位模型的beam大小增加到10。因此,给定一个正常函数,模型输出10个语句用于注入漏洞的编辑模式,并且一个正常函数可以用来生成多达10个函数。通过1,078个示例,VULGEN生成了9,573个函数。我们随机抽样了100个生成的函数,并手动检查它们是否存在漏洞。请注意,相对于用于我们比较研究中的总样本数来说,100是可观的。最近的同行工作只使用了<60个样本进行类似目的的手动验证[22]。这仍然不理想,但手动检查样本是繁琐且昂贵的,而通用的、准确的自动漏洞检测不可用。手动检查由本文的第一位(评分者1)和第二位(评分者2)作者以及一个非作者的博士生(评分者3)进行,并且他们都具有2到4年的软件工程和安全经验,所有人都遵循相同的标记过程。基于他们达成一致的标签,我们计算了评分者之间的一致性,根据Cohen的Kappa系数为0.7877、0.7476和0.6826,这些一致性都是实质性的,显示了我们手动标记的合理可靠性。由于每个生成的样本都有一个相应的正常样本,它们都集中在对这对之间的改变代码,并主要检查改变是否引入了漏洞(通过跟踪改变行的数据/控制流),这也有助于减轻在这些手动过程中可能存在的任何偏见。结果,经过检查的100个函数中有69个是易受攻击的。因此,通过子抽样估计的易受攻击样本的成功率为69%。

我们还通过检查100个随机抽样函数的漏洞类型并为它们分配CWE漏洞类型ID[42]来评估VULGEN的通用性。在其中,VULGEN的成功案例涵盖了18个不同的CWE ID,而Getafix、T5和Graph2Edit的成功案例只涵盖了12、8和5个类别,这表明通过解耦何时注入和如何注入,VULGEN允许通过模式匹配/应用以确定性地识别可注入漏洞的代码位置,因此比早期方法具有更灵活/多样化的漏洞生成能力。此外,VULGEN从训练数据中学习不同漏洞类别的注入模式,使其不受限于生成特定类别的漏洞。

3.3 RQ2:与基于Transformer的方法比较

VULGEN基于Transformer/CodeT5的定位和基于模式的代码编辑组合注入漏洞。然而,正如其他研究所显示的,经过微调的CodeT5模型具有直接生成编辑后代码的能力,人们可能会提出一个问题:我们是否可以直接对CodeT5模型进行微调以生成易受攻击的函数。

为了测试这一点,我们移除了模式挖掘阶段,直接对CodeT5进行漏洞注入的微调。在微调CodeT5时,我们用原始的注入漏洞语句,即原始的用于注入漏洞的语句,替换为相应的易受攻击的函数。微调后,模型应该能够根据正常函数输出相应的易受攻击的函数。我们保持训练和测试样本与VULGEN相同。

对于1078个测试样本,模型为每个测试样本生成了一个新函数。因此,模型生成了1078个新函数。然而,在生成的1078个函数中,只有111个与地面实况易受攻击的函数完全匹配,使得精确度仅为10.29%,而VULGEN的表现优于其42.27%。

我们再次将beam大小增加到10,并随机抽取100个输出,并手动检查它们是否确实易受攻击。在1078个测试样本中,模型生成了10780个新函数。在100个抽样输出函数中,只有17个是易受攻击的,因此生成易受攻击函数的成功率仅为17%,这太低,无法构建高质量的漏洞数据集。

失败表明了基于Transformer的代码编辑模型在漏洞生成方面的局限性。通过手动检查生成的样本,我们注意到许多生成的函数在语法上不是有效的。例如,一些生成的代码在函数的中间结束。有些生成的代码只是重复标记,直到输出标记的最大限制。我们注意到,当函数更长时,这样的失败更为严重。

3.4 RQ3:与基于模式的方法(Getafix)比较

为展示VULGEN基于CodeT5的本地化模型的有效性,我们移除了本地化模型,使用原始的Getafix方法来注入漏洞。我们直接使用排名的模式来编辑正常函数以注入漏洞。由于基于静态分析器错误消息的本地化分数不可用,我们无法对模式可以匹配的语句进行排名。因此,给定一个正常函数,我们首先获取排名前10的模式,并提取这10个模式可以匹配的语句。然后,我们随机选择一个语句和一个匹配该语句的模式来注入漏洞。

在给定的1078个示例中,Getafix生成了1073个新函数。其中只有61个与它们的地面真实漏洞函数匹配,使得精确匹配率为5.67%,VULGEN的性能超过了158.20%。为了比较VULGEN和基于Transformer的代码编辑方法的10个beam大小的结果,我们随机选择了10对模式和语句来为每个给定的正常样本生成新函数。如果模式和语句少于10对,我们将使用所有对来生成新函数。因此,Getafix生成了8114个新函数。通过随机抽样100个新函数并手动检查,其中50个是有漏洞的,因此生成有漏洞函数的成功率为50%。

结果表明了传统基于模式的方法在漏洞注入方面的局限性,并展示了使用语义感知模型进行注入本地化的重要性。5.67%的精确匹配率表明,尽管挖掘出的模式在语法上有能力匹配用于注入漏洞的语句,但是没有语义本地化,它们很难找到正确的位置来注入漏洞。然而,50%的漏洞注入成功率也表明了传统基于模式的方法的价值。与基于Transformer的代码编辑方法相比,它确保了语法的有效性,并具有匹配一些特殊标记(例如,memset,free等)的能力,尽管它没有理解上下文代码的能力。这进一步表明了将语义感知方法与传统基于模式的方法相结合的必要性。

3.5 RQ4:与基于GNN的方法(Graph2Edit)比较

在研究[15]中,Nong等人表明基于图神经网络(GNN)的代码编辑方法Graph2Edit [31]在漏洞注入方面取得了最高的效果。Graph2Edit将给定程序的AST作为输入,将其转换为图,并使用其GNN嵌入来预测一系列AST编辑操作以生成新的程序。编辑操作的设计和动态规划算法使Graph2Edit在效果上优于其他基于深度学习的代码编辑器[15]。因此,我们将Graph2Edit的效果与VULGEN进行比较。

我们按照[15]中的实验设置了Graph2Edit,将我们的示例预处理为AST,并使用相同的示例来训练和测试Graph2Edit模型。对于beam size为1,Graph2Edit生成了1024个新函数,其中129个与其对应的真实漏洞函数完全匹配。因此,准确匹配精度为12.59%,VULGEN的性能优于其16.28%。对于beam size为10,Graph2Edit生成了10240个函数。从中随机抽取100个函数进行手动检查,只有13个函数是有漏洞的,使得成功率仅为13%。

结果表明了与基于GNN的方法相比,VULGEN的优势。我们注意到,与我们的定位模型相比,Graph2Edit没有理解代码语义的能力。其中一个主要原因是我们的定位模型基于CodeT5进行训练,而CodeT5是在数百万个代码样本上进行训练的。因此,微调模型具有处理更多种类代码的能力,并且更擅长理解代码语义,而不是使用无关的代码特征(例如,程序长度或单个标记)来编辑代码。相比之下,Graph2Edit是一个随机初始化的模型,并且只使用了我们数据集中的9704个示例来训练模型。考虑到深度学习模型需要大量数据(通常> 100,000个样本)来良好地训练模型,我们的9704个示例太少了。因此,Graph2Edit模型过拟合并且无法处理复杂的代码编辑场景。鉴于缺乏用于训练深度学习模型的漏洞数据,基于GNN的代码编辑方法可能不适合漏洞注入。

3.6 RQ5:VULGEN的实用性

为了评估VULGEN的实用性,我们探讨了使用生成的函数来改进基于DL的漏洞检测器的效果。我们按照[15]中的实验设置,在Devign [2]和ReVeal [11]上执行评估,这些是C语言函数级别的最先进漏洞检测器。可能会有其他更先进的基于DL的检测器(例如,在未来)。然而,我们在RQ5中的主要目标是展示我们的生成样本可以带来的改进,而不是关注检测准确率的绝对数值。因此,选择的检测器是否胜过所有其他选项可能并不是我们这篇论文的主要关注点。我们相信,如果我们的样本可以帮助改进所选择的检测器,它们也应该能够帮助其他检测器(例如,LineVul [37])。

类似于[15],我们采用独立测试,即训练样本和测试样本来自不同的数据集,以模拟真实世界的漏洞检测情景。我们使用[15]中的数据集作为基线数据集进行训练和测试。由于我们的生成函数涉及Devign和ReVeal数据集中的样本,我们删除了漏洞检测数据集中的重复项。因此,我们实验中的样本数量与[15]中的数量不同。我们使用Devign数据集(其中包含9,744个易受攻击样本和11,012个非易受攻击样本)进行训练,并使用ReVeal(其中包含1,630个易受攻击样本和16,487个非易受攻击样本)和Xen(其中包含531个易受攻击样本和7,436个非易受攻击样本)进行测试,因为Devign数据集相对平衡。

然后,我们将来自VULGEN的963个生成函数添加到Devign的训练集中,观察新训练集是否改善了检测器的性能——由于我们有963个由VULGEN生成的样本,我们简单地全部使用它们。为了避免由于数据集平衡(易受攻击样本数量与非易受攻击样本数量的比例)的任何改变对训练带来的影响,我们还将与原来相同数量的真实世界正常样本(来自[43])添加到训练集中,以保持平衡与之前相同。表1的Baseline列显示了两个检测器在使用原始Devign训练集的ReVeal和Xen测试集上的性能。Generated列显示了与基线相比使用新训练集的改进情况。我们可以看到,VULGEN的生成函数显著提高了漏洞检测器的性能。例如,在复制设置中,我们的训练集将Devign的F1提高了31.84%,这通常显示了生成函数的有效性。为了表明VULGEN的生成函数比合成样本更好,我们用相同数量的来自SARD [20]的合成易受攻击函数替换了963个生成函数,并重新训练了Devign和ReVeal检测器。Synthetic列显示了使用合成样本的改进情况。我们注意到,合成样本比VULGEN的生成样本改进要少得多(对于Devign和ReVeal的复制设置),甚至可能降低性能(对于Devign和ReVeal的复制设置)。这表明了VULGEN的生成函数比合成函数更有用。

表1 VULGEN生成的易受攻击样本是否有助于改善基于DL的漏洞检测器?

我们还将VULGEN的生成函数与它们各自的真实易受攻击函数进行了比较。Ground Truth列显示了使用963个生成函数的真实易受攻击函数的改进情况。我们注意到,与生成的函数相比,改进情况大多都更好(除了Devign的复制设置实验),这是可以预期的,因为我们的生成函数成功率为69%,剩下的生成函数带来了噪音。

为了显示VULGEN不仅限于使用漏洞修复示例中的正常函数来生成易受攻击函数,我们使用BigVul数据集[17]中未修复的正常函数来进行注入。为了支持这一点,并使实验具有可比性,我们随机选择了相同数量(963个)的生成函数来改进训练集,列Wild显示了改进情况。我们注意到,尽管改进幅度比生成和地面实况实验中的要小,但仍然比合成实验中的要好,这表明了VULGEN生成大量有用的易受攻击函数的潜力。

3.7 RQ6: VULGEN的实用性

我们通过跟踪生成963个函数的时间成本来衡量VULGEN的效率。实验在我们在第III.F节中描述的机器上执行。我们采用了15个进程的并行计算来完成任务。总体而言,VULGEN花费55分钟生成963个函数,因此平均每分钟生成17.5个函数。

转述:王越

0 阅读:0

互联不一般哥

简介:感谢大家的关注