Deep Learning Based Vulnerability Detection: Are We There Yet?论文分享

今天分享的论文是《Deep Learning Based Vulnerability Detection: Are We There Yet?》

原文链接:Deep Learning Based Vulnerability Detection: Are We There Yet? | IEEE Journals & Magazine | IEEE Xplore

开源数据集:https://bit.ly/3bX30ai

开源代码:https://git.io/Jf6IA

这是一篇关于深度学习漏洞检测的文章。

软件漏洞的自动检测是软件安全领域的基础性问题。现有的程序分析技术要么受限于高误报率,要么受限于高漏报率。深度学习(DL)领域的最新进展引发了人们对将其应用于自动漏洞检测的浓厚兴趣。近期多项研究表明,深度学习在漏洞检测中取得了令人瞩目的成果,准确率高达95%。在本文中,本文探讨:“在真实的漏洞预测场景中,最先进的基于深度学习的技术表现如何?” 令人惊讶的是,本文发现其性能下降了50%以上。通过系统调查导致这种性能急剧下降的原因,本文发现现有的基于深度学习的漏洞预测方法面临着训练数据方面的挑战(如数据重复、漏洞类别的不真实分布等)和模型选择方面的挑战(如简单的基于标记的模型)。因此,这些方法往往无法学习与漏洞实际成因相关的特征,而是从数据集中学习不相关的人工特征(如特定的变量/函数名等)。基于这些实证发现,本文论证了如何基于漏洞预测的真实场景,采用更具原则性的数据收集和模型设计方法来获得更好的解决方案。所开发的工具表现显著优于基准模型——与文献中性能最佳的模型相比,精确率提升了33.57%,召回率提升了128.38%。总体而言,本文阐明了现有基于深度学习的漏洞预测系统的潜在问题,并为未来基于深度学习的漏洞预测研究绘制了路线图。

安全漏洞的自动检测是系统安全领域的一个基本问题。传统技术已知存在高误报/漏报率的问题[1],[2]。例如,基于静态分析的工具通常会产生高误报率,将非漏洞(以下称为“中性”)情况检测为漏洞,而动态分析则受限于高漏报率。到目前为止,这些工具仍然不可靠,给开发人员带来了巨大的负担[2]。

深度学习(DL)的最新进展,尤其是在计算机视觉和自然语言处理等领域的进展,激发了人们使用深度学习以高精度自动检测安全漏洞的兴趣。根据谷歌学术的数据,2019年至2020年间,有92篇论文在主流安全和软件工程会议上发表,这些论文应用学习技术来检测不同类型的漏洞[2]。

事实上,最近的几项研究已经展示了非常有前景的结果,准确率高达95%[3],[4],[5],[6]。

鉴于深度学习模型在检测漏洞方面报告的显著成功,本文自然会问:为什么它们表现如此出色?这些模型学习了什么样的特征?它们是否具有泛化能力,即能否可靠地用于检测真实世界的漏洞?

深度学习模型的泛化能力通常受到数据集中隐含偏差的限制,这些偏差往往在数据集生成/整理/标注过程中引入,因此对测试数据和训练数据产生同等影响(假设它们来自同一数据集)。这些偏差使得深度学习模型能够通过学习特定于该数据集的高度独特特征来在测试数据中获得高准确率,而不是学习可泛化的特征。例如,Yudkowsky等人[7]描述了一个案例:美国陆军发现,一个用于检测伪装坦克的神经网络由于数据集偏差而泛化能力不佳,尽管该模型在测试数据中取得了很高的准确率。他们发现,数据集中所有带有伪装坦克的照片都是在阴天拍摄的,该模型只是学会了分类较亮和较暗的图像,而不是检测坦克。

在本文中,系统地评估了四种最先进的基于深度学习的漏洞预测(以下简称DLVP)技术[3],[4],[5],[6]的泛化能力,这些技术在现有文献中已被报道能以高准确率(高达95%)检测安全漏洞。本文主要关注以源代码为输入[3],[4],[5],[6],[8]并在函数粒度上检测漏洞的深度神经网络(DNN)模型。

本文主要贡献:

(1)本文系统地研究了深度学习漏洞预测(DLVP,Deep Learning Vulnerability Prediction)任务中的现有方法,并发现了当前数据集和建模实践存在的若干问题。
(2)基于实证结果,本文提出了一套最佳实践总结,可为未来的深度学习漏洞预测研究提供帮助,并通过实验验证了这些建议。
(3)本文从 Chromium 和 Debian 项目中开发者/用户报告的漏洞中整理出了一个真实世界的数据集。
(4)本文还开源了本研究中使用的所有代码和数据,以便更广泛地传播。

DLVP方法旨在通过从训练数据集中学习不同的漏洞模式来检测目标软件中的未知漏洞。最流行的DLVP方法包括三个步骤:数据收集、模型构建和评估。首先,收集用于训练的数据,并根据设计目标和资源约束选择合适的模型。根据所选模型偏好的格式对训练数据进行预处理。然后训练模型以最小化损失函数。训练好的模型旨在用于实际场景。为了评估模型的有效性,需要在未见过的测试示例上评估其性能。

下图为不同的深度学习漏洞预测(DLVP,Deep Learning Vulnerability Prediction)数据集及其合成/真实性质。从红色到绿色,颜色象征着数据集真实程度的递增。红色代表最合成(即最不真实),绿色代表最真实:

为了训练漏洞预测模型,本文需要一组标注为漏洞或中性的代码。漏洞代码的数量应足够大,以便模型从中学习。研究人员为DLVP使用了各种数据源(见上图)。根据代码样本的收集方式和标注方式,本文将其分类为:

- 合成数据:漏洞代码示例和标注是人工创建的。SATE IV Juliet[15]数据集和SARD[16]属于这一类。这里的示例是使用已知的漏洞模式合成的。这些数据集最初是为评估基于静态和动态分析的漏洞预测工具而设计的。

- 半合成数据:这里要么代码是人工派生的,要么标注是人工派生的。例如,Russell等人[5]提出的Draper数据集包含从开源存储库收集的函数,但使用静态分析器进行标注。SARD[16]和国家漏洞数据库(NVD[17])数据集的示例也来自生产代码;然而,它们通常经过修改,以展示漏洞,使其与原始上下文隔离。尽管这些数据集比合成数据集更复杂,但由于简化和隔离,它们无法完全捕捉真实世界漏洞的复杂性。

- 真实数据:这里的代码和相应的漏洞标注都来自真实世界的来源。例如,Zhou等人[6]整理的Devign数据集,包含来自四个开源项目的过去漏洞及其修复,其中两个是公开可用的。

模型选择主要取决于想要纳入的信息。DLVP的流行选择是基于标记或基于图的模型,并且输入数据(代码)会相应地进行预处理[3],[5],[6]。

- 基于标记的模型:在基于标记的模型中,代码被视为标记序列。现有的基于标记的模型使用不同的神经网络架构。例如,Li等人[3]提出了一种基于双向长短期记忆(BSLTM)的模型,Russell等人[5]提出了一种基于卷积神经网络(CNN)和随机森林的模型,并与基于循环神经网络(RNN)和CNN的基线模型进行了漏洞预测比较。对于这些相对简单的基于标记的模型,标记序列长度是影响性能的重要因素,因为模型很难对长序列进行推理。为了解决这个问题,VulDeePecker[3]和SySeVR[4]提取代码切片。切片的动机是代码中的每一行对漏洞预测的重要性并不相同。因此,不是考虑整个代码,而是仅考虑从代码中“感兴趣点”(例如,API调用、数组索引、指针使用等)提取的切片进行漏洞预测,其余部分被省略。

- 基于图的模型:这些模型将代码视为图,并纳入不同的语法和语义依赖关系。不同类型的语法图(抽象语法树)和语义图(控制流图、数据流图、程序依赖图、定义-使用链图等)可用于漏洞预测。例如,Devign[6]利用Yamaguchi等人[8]提出的代码属性图(CPG)来构建其基于图的漏洞预测模型。CPG是通过将不同的依赖边(即控制流、数据流、定义-使用等)添加到代码的抽象语法树(AST)中来构建的(见第4节)。

为了解决现有数据集的局限性(如问题1和问题2所强调的),本文通过跟踪两个开源项目(Linux Debian内核和Chromium(Chrome的开源项目))过去的漏洞,整理了一个更健壮和全面的真实世界数据集REVEAL。本文选择这些项目是因为:

(i)它们是两个流行且维护良好的公共项目,具有长的演化历史;

(ii)这两个项目代表了两个重要的程序领域(操作系统和浏览器),呈现出多样化的安全问题;

(iii)这两个项目都有大量公开可用的漏洞报告。

下图说明了REVEAL管道。它分为两个阶段,即特征提取(阶段I)和训练(阶段II)。在第一阶段,本文将真实世界的代码转换为图嵌入(第4.1节)。在第二阶段,本文在提取的特征上训练一个表示学习器,以学习最理想地将漏洞示例与中性示例区分开的表示(第4.2节)。

下表总结了本文研究的所有漏洞预测方法和数据集。本文评估了现有方法(即VulDeePecker[3]、SySeVR[4]、Russell等人[5]和Devign[6])和REVEAL在两个真实世界数据集(即REVEAL数据集和FFMPeg+Qemu)上的性能。FFMPeg+Qemu由Zhou等人[6]共享,他们在同一工作中也提出了Devign模型。他们的Devign实现没有公开可用。本文重新实现了他们的方法来报告本文的结果。本文确保本文的结果在相同设置下与他们报告的结果紧密匹配。

讨论与分析

内部有效性

- 混乱提交:混乱提交在软件工程中已被长期研究[58],[59],并且是软件演化历史驱动研究的主要障碍[60],[61]。开发人员经常在一个提交中组合多个不相关或弱相关的代码更改[60],导致这样的提交成为多个更改的纠缠。本文收集的REVEAL数据也面临包含混乱代码更改的威胁。也就是说,为了验证论文中的实证发现不受混乱提交的偏见,本文创建了REVEAL数据的替代版本,其中本文删除了任何更改超过一个函数的补丁。在该版本的REVEAL数据中,本文发现REVEAL实现了26.33%的F1分数(相比之下,REVEAL数据集中的F1分数为41.25%)。相比之下,如果本文不使用表示学习,REVEAL的F1分数降至22.95%。如果本文不使用数据平衡,REVEAL的性能降至13.13%。当本文从REVEAL管道中删除GGNN时,F1分数降至22.82%。这些结果证实了无论是否存在混乱的代码更改,GGNN、数据平衡和表示学习在REVEAL管道中的重要性。

外部有效性

- 未知漏洞:现有的DLVP模型,包括本文的管道,依赖于基于过去的语义和语法模式来推断漏洞。因此,这些模型可能无法有效发现过去训练数据中尚未见过的漏洞。为了发现此类漏洞,可以使用其他漏洞检测范式,如模糊测试[62],[63],或静态和动态分析技术的混合[64]。

相关工作

软件中的漏洞检测(漏洞预测)一直是软件工程中的一个重要研究问题。传统的漏洞检测系统分为三大类——静态分析[26],[65]、动态分析[66],[67]和符号分析[68],[69]。静态分析器分析代码的静态属性,即AST[70]、流/依赖图[8],[71]。虽然静态分析器通常是轻量级的,在开发管道的早期使用,但此类分析器通常会导致大量误报[72]。相比之下,动态分析器执行程序并根据程序的运行时行为分析程序的潜在漏洞[67]。动态分析器通过推理用户输入(例如,污点跟踪)或生成有用的程序输入来强制模型崩溃(例如,模糊测试)来检测漏洞。虽然动态分析器在真实输入上执行程序,但符号分析器基于符号输入分析程序[68],[73]。

做个总结

在本文中,系统地研究了基于深度学习的漏洞检测的不同方面,以有效地发现真实世界的漏洞。本文通过实证展示了现有数据集和模型的不同缺点,这些缺点潜在地限制了这些技术在实践中的可用性。本文的调查发现,现有数据集过于简单,无法表示真实世界的漏洞,现有建模技术没有完全解决漏洞检测中的代码语义和数据不平衡问题。根据这些实证发现,本文提出了一个收集真实世界漏洞数据集的框架。本文提出REVEAL作为一个可配置的漏洞预测工具,解决了本文在现有系统中发现的问题,并展示了其作为更好的漏洞预测工具的潜力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值