【论文阅读】VulGAI:基于graphs and images的漏洞检测

基本信息

alt

摘要

深度学习模型在漏洞检测领域得到了广泛应用。基于深度学习的漏洞检测方法可以自动学习代码模式。有些方法将代码处理为文本序列,以实现可扩展的漏洞检测。它们利用自然的语言处理模型来提取代码特征。这些方法不考虑代码的语义结构,并将代码切片视为文本。基于图结构和图神经网络的漏洞检测方法比基于文本的方法更准确。但是,这些方法在实践中缺乏可扩展性。图表生成和图神经网络培训都很耗时。我们提出了一种基于图和图像的漏洞检测方法(VulGAI)VulGAI选择更合理的节点中心度来生成图像。它可以保留程序细节,并从不同的角度区分节点重要性。此外,我们设计了一个更高效的CNN模型,它减少了计算开销,提高了检测性能(时间和准确性)。我们实现VulGAI并评估六种方法(VulDePecker、SySeVR、Devign、VulCNN、mVulPreter和VulGAI)40,657个函数。实验结果表明,VulGAI在精度、TPR和F1-Score方面均有较高的表现。此外,我们在30270个真实世界函数上比较了VulGAI和VulCNN。VulGAI的TP数是VulCNN的1.48倍。VulGAI在检测时间上比VulCNN快3.9倍。

关键点

节点中心性选择和高效CNN

解决的问题

基于NLP的方法:基于自然语言处理的方法。但是,这些方法将代码片视为文本。它们不能反映代码的逻辑和结构。

Devign等:致力于提取代码属性图(Yamaguchi et al., 2014)。然后,他们利用门控图序列神经网络(以下简称GGNN(Li et al., 2015))来提取图的向量表示并执行漏洞检测。它们的可扩展性比基于 NLP 的方法差(Li et al., 2018;Zou 等人,2019 年)

VulCNN:katz中心性(Katz,1953)无法区分节点。Katz中心性和亲密中心性(Freeman et al., 2002)具有重复性。此外,VulCNN 的 CNN 模型在计算上很昂贵。

背景

手动检查漏洞变得非常困难且耗时。因此,我们迫切需要一种高效的大规模漏洞代码检测方法(Hanif et al., 2021;Ghaffarian 和 Shahriari,2017 年)。

漏洞检测通常被视为二元分类问题。基于深度学习的漏洞检测方法是基于模式的方法。这些方法不需要依赖特定的专业知识和规则。他们使用神经网络来自动学习漏洞模式。

当前研究进度

  1. 视觉解释图像技术:许多用于视觉解释图像的技术。我们可以利用这些可视化技术来解释分类结果(Chattopadhay 等人,2018 年;Selvaraju 等人,2017 年)。换句话说,它可能解释了代码行的重要性。

  2. joern:将代码处理成程序依赖关系图(Yamaguchi et al., 2014)。程序依赖关系图包含代码的数据依赖关系和控制关系。

本文主要方法

本文要解决的两个问题

  1. 应该选择哪个节点中心性来保存程序的有效信息?
  2. 如何设计高效的CNN模型来提高漏洞检测性能?

方法

节点中心性选择:

我们考虑其值的变化程度,浮点值越大,节点之间的差异就越大。我们选择了度中心性、接近中心性和second_order中心性三个中心性来保留程序的有效信息。

利用这三个中心性将程序依赖关系图转换为RGB图像(Wu et al., 2022)。具体来说,我们使用节点向量将三种中心性相乘得到度、接近度和second_order,分别对应R、G和B三个通道。

我们的漏洞检测模型包括跳跃结构的二维卷积神经网络、一维卷积神经网络和全连接层。具有跳转结构的CNN模型可以保留每一层的程序细节。这是一种新型的漏洞检测网络。为了解释代码行是否易受攻击,我们使用梯度加权类激活映射++(以下简称Grad-CAM++)(Chattopadhay et al., 2018)来获得相应的热图。这可以解释哪一行代码更有可能是易受攻击的代码。我们的方法可以快速帮助程序员检查漏洞。

不同节点中心性对于检测效果的影响

本文相比于Vul,给出了不同节点中心性对于区分节点的影响程度,从各个中心性影响程度的相似性看出来哪些相似度的作用是重叠的 alt

  • 从图2a和图2b中,我们可以发现黑线(katz中心性)和绿线(接近中心性)几乎重合,它们的值几乎没有区别。因此,这两个中心是重复的。

  • 从这三个例子中,我们发现许多节点的 katz 中心性和 PageRank 之间的差异非常小(黑线和紫线)。因此,katz 中心性不适合区分节点。

  • 图2a和图2b中的接近中心性之间的差异非常小。然而,图2c中的接近中心性仍然可以区分不同的节点。因此,本文仍然保留了亲近的中心性。

  • 每个节点的度中心性和second_order中心性差异很大,可以完全区分节点的重要性。这似乎是合理的,因为代码行之间存在不同的依赖关系。

经典四部曲

可以发现,和VulCNN的步骤如出一辙。

包括源代码的处理,图生成,sent2vec,向量固定长度为128等。

alt

但是CNN模型有优化。

CNN

使用具有跳跃结构的二维卷积神经网络将图像的特征信息保留在网络的上层。二维卷积神经网络可以穿越多个卷积层和激活函数,模型可以提取更抽象、更高级的特征。此外,我们利用一维卷积神经网络和池化层来提取图像的不同局部特征。

alt

在二维卷积神经网络中,我们包括四个CPR2d(Conv2d + ZeroPand2d + ReLU)模块,每个CPR2d包含一个Conv2d,一个ZeroPand2d和一个激活函数ReLU。我们利用跳转结构来保留前一层的图像信息。其中,第一个Conv2d输入输出大小为(3,32),kernel_size为(3,128)。但是,其他三个 Conv2d 的输入和输出大小为 (32,32),kernel_size为 (3,1)。在一维卷积神经网络中,我们包括两个CRP1d(Conv1d + ReLU + MaxPool1d)模块,每个CRP1d包含一个Conv1d、aReLU和一个MaxPool1d。Conv1d 的输入输出大小为 (32,32),MaxPool1d 的kernel_size为 3,步幅为 2。最后,我们添加一个全连接层进行分类。

97.6%的功能代码在120行以内,99%的功能代码在200行以内。此外,在实验 2 中,我们得到了 50、80、100、120、150 和 200 行的漏洞检测性能。我们发现,当线路阈值为120时,漏洞检测性能达到稳定状态。因此,本文选择120行作为生成图像的阈值。对于长度超过 120 行的代码,我们将删除向量的冗余部分。对于少于 120 行的代码,我们在向量的末尾添加 0。因此,我们生成的图像的大小是 3 × 120 × 128。其中 3 表示 3 个通道(度、接近度和 second_order),128 对应于节点的向量长度,120 对应于线路阈值

实验

包括实验开头问的问题,不能说一模一样,只能说略有差别。(/doge)

  1. RQ1:VulGAI的漏洞检测性能如何?
  2. RQ2:线阈值、CPR2d层数和节点嵌入方法对VulGAI有何影响?
  3. RQ3:VulGAI在现实世界中的漏洞检测性能如何?

但是本文解答的比较直接清楚。

RQ1,我们设计实验 1。实验1:为了验证VulGAI的漏洞检测性能,我们比较了基于深度学习的高级漏洞检测方法,即切片级漏洞检测方法VulDePecker(Li et al., 2018),SySeVR(Li et al., 2021b)和函数级漏洞检测方法Devign(周 et al., 2019)和VulCNN(Wu et al., 2022)。最后,我们记录了这些方法的漏洞检测结果(准确率、TPR和F1-Score值)。

RQ2,我们设计了实验 2、3 和 4。实验 2:为了验证不同代码行阈值对 VulGAI 的性能影响,我们对行阈值进行了敏感性分析。在图像生成阶段,我们分别使用 50、80、100、120、150 和 200 来生成图像。也就是说,图像大小为 3 ×50×128、3 ×80× 128、3 × 100 × 128、3 × 120 × 128、3 × 150 × 128 和 3 × 200 × 128。最后,我们利用CNN模型进行漏洞检测,并记录这些阈值的F1分数。实验3:为了验证不同层数的CPR2d(Conv2d+ZeroPand2d+ReLU)对VulGAI性能的影响,我们对CPR2d的层数进行了敏感性分析。在漏洞检测模型阶段,我们使用 2、3、4、6 和 8 层进行分类。最后,我们记录这些测试的准确性。实验4:验证不同节点嵌入方法对VulGAI的性能影响。我们对节点嵌入进行敏感性分析。在节点嵌入阶段,我们选择Sent2vec(Pagliardini等人,2018),Node2vec(Grover和Leskovec,2016)和Struc2vec(Ribeiro等人,2017)作为节点嵌入方法。最后,我们利用CNN模型进行漏洞检测。我们记录了这三种方法的准确率、TPR 和 F1 分数值。

RQ3,我们设计了实验 5 和一个案例研究。实验5:验证VulGAI在真实世界中的漏洞检测性能。我们从FFmpeg和QEMU项目中选择了一个真实的函数示例,我们称之为ffmqem(周等人,2019)。ffmqem 数据集包含 9776 个易受攻击的函数和 20494 个中性函数。我们在SARD_NVD上训练 VulGAI 和 VulCNN 模型。最后,我们得到了检测ffmqem的最佳模型。我们记录了 VulGAI 和 VulCNN 检测到的漏洞数量和检测时间。个案研究。我们展示了一些正确检测到的漏洞的示例。最后,我们解释了一个使用梯度加权类激活映射++的代码示例(图像)(Chattopadhay 等人,2018 年)。

数据集

同VulCNN, 7:2:1 的比例将数据集分为训练集、验证集和测试集.

结果

alt

mVulPreter表现出优异的性能。在误差范围内,mVulPreter 接近 VulGAI 性能。具体来说,VulGAI 比 VulCNN 高出约 2 个百分点。在模型的计算性能方面,VulGAI 有 77178 个计算参数,但 VulCNN 是 VulGAI 的 8.77 倍,而 VulCNN 的计算参数676802。在时间表现方面,VulCNN一个周期的平均训练时间和测试时间分别为182 s和16 s。但是,VulGAI 只有 35 秒和 4 秒。

alt

图 8 显示了 Node2vec、Struc2vec 和 Sent2vec 下易受攻击和中性示例的特征分布。其中红色“+”表示易受攻击的示例,绿色“×”表示中性示例。此外,我们计算了三种方法的质心距离。质心距离越大,两种类型之间的分离越好(毛等人,2019)。Struc2vec、Node2vec 和 Sent2vec 的质心距离分别为 0.2768、0.3066 和 0.3371。Sent2vec的质心距离最大,说明其类分离度较大。这解释了 Sent2vec 表现良好的原因。实验结果 5.表2给出了VulGAI和VulCNN在真实数据集ffmqem上的漏洞检测结果。VulGAI 在 9776 个漏洞示例中检测到 3437 个漏洞,但是,VulCNN 只有 2324 个。VulGAI 的检测时间仅为 32 s,比 VulCNN 快约 3.9 倍。

TSNE可视化。Node2vec、Struc2vec 和 Sent2vec 下的易受攻击和中性样本特征分布
TSNE可视化。Node2vec、Struc2vec 和 Sent2vec 下的易受攻击和中性样本特征分布

实际效果验证

利用经过训练的漏洞检测模型来检测真实世界的ffmqem数据集。具体而言,ffmqem 数据集包含 9776 个易受攻击的函数和 20494 个中性函数。它们总共有 1875102 行代码。

时间分布

alt

VulGAI 检测到的部分漏洞示例 alt

可解释可视化

alt

总结

外部威胁。它与数据集的质量有关。SARD数据是一个合成函数,该合成函数并不代表整个程序。我们考虑加入真实世界的 NVD 数据集来缓解这种威胁。威胁。本文基于VulCNN中存在的问题进行了改进。因此,VulCNN是我们的第一个比较目标。在相同的软硬件环境下,我们尽可能地调整参数,以达到最佳性能,保证比较的公平性。

局限性。本文是针对C/C++语言的函数级漏洞检测方法。在代码处理过程中,我们主要考虑代码行。然而,在检测过程中仍然缺乏更细粒度的检测和解读,比如漏洞的触发路径。接近中心性、度中心性和second_order中心性这三个中心性可以区分节点的重要性并保留程序信息。然而,这三个中心性与图像通道(RGB)没有直接关系,它只是一种简单的对应方法。

未来的工作。从图像的角度考虑漏洞检测是很有趣的。未来,我们预计将考虑从漏洞声明(Hin et al., 2022)和触发路径(Cheng et al., 2022)中更细粒度的解释。也许,我们可以考虑结合定向模糊技术(Chen et al., 2018)。对于中心性和通道的转换,我们需要一个更合理的对应方法,我们需要从公式中设计出来。

总结

基于VulCNN的启发,我们提出了一种函数级漏洞检测方法。我们分析了卡茨中心性的缺乏,我们利用接近中心性、度中心性和second_order中心性来生成图像,从而区分节点重要性。我们可以从代码行的角度保留程序细节和可视化说明。此外,我们设计了一种更高效的CNN模型,减少了计算开销,提高了检测性能。我们实现了 VulGAI,并在 40657 个函数上评估了六种方法(VulDePecker、SySeVR、Devign、VulCNN、mVulPreter 和 VulGAI)。

实验结果表明,与其他先进的漏洞检测技术相比,VulGAI的准确率、TPR和F1-Score均更高。此外,我们还对 VulGAI 和 VulCNN 在 30,270 个真实世界的函数上进行了全面比较。VulGAI 在 TP 上的表现比 VulCNN 好 1.48 倍,VulGAI 的计算参数比 VulCNN 少 8.77 倍。VulGAI 的检测速度比 VulCNN 快约 3.9 倍。VulGAI可以实现代码漏洞扫描的可扩展性和准确性。


- END -


一个只记录最真实学习网络安全历程的小木屋,最新文章会在公众号更新,欢迎各位师傅关注!
公众号名称:网安小木屋

图片名称
博客园主页: 博客园-我记得https://www.cnblogs.com/Zyecho/

本文由 mdnice 多平台发布

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值