Distinguishing Look-Alike Innocent and Vulnerable Code by Subtle Semantic Representation Learning an

今天分享的论文是《Distinguishing Look-Alike Innocent and Vulnerable Code by Subtle Semantic Representation Learning and Explanation》

原文链接:[2308.11237] Distinguishing Look-Alike Innocent and Vulnerable Code by Subtle Semantic Representation Learning and Explanation

开源代码:https://github.com/jacknichao/SVulD

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

尽管许多基于深度学习(DL)的漏洞检测方法已被提出并确实取得了显著性能,但它们在泛化能力和实际应用中仍存在局限性。更准确地说,现有基于DL的方法(1)在词法相似但语义相反的函数之间的预测任务中表现不佳;(2)未为检测结果提供面向开发者的直观解释。

在本文中,本文提出了一种名为SVulD的新方法,即用于漏洞检测的函数级细微语义嵌入方法,并附带直观解释,以缓解上述限制。具体而言,SVulD首先训练一个模型来学习函数的区分性语义表示,而不考虑其词法相似性。然后,对于检测到的易受攻击函数,SVulD提供结果的自然语言解释(例如根本原因),以帮助开发者直观理解漏洞。为了评估SVulD的有效性,本文在一个广泛使用的实际漏洞数据集上进行了大规模实验,并通过考虑五个性能指标将其与四种最先进(SOTA)的方法进行了比较。实验结果表明,SVulD在所有SOTA方法上都有显著改进(即F1分数提高23.5%-68.0%,PR-AUC提高15.9%-134.8%,准确率提高7.4%-64.4%)。此外,本文进行了一个用户案例研究,以评估SVulD对开发者理解易受攻击代码的有用性,参与者的反馈表明SVulD对开发实践有帮助。

本文的主要贡献如下:

本文提出了SVulD,这是一种基于预训练语义嵌入模型的具有直观解释的新型函数级漏洞检测方法,它利用对比学习技术来获取词法相似函数之间的区分性语义表示。

本文全面研究了SVulD在漏洞检测和修复函数泛化方面的有效性。实验结果表明,SVulD在SOTA方法上有显著改进(例如,F1分数提高23.5%-68.0%,PR-AUC提高15.9%-134.8%)。特别是,SVulD在修复函数上具有更好的泛化性能(例如,准确率提高7.4%-64.4%)。

据本文所知,本文是第一个为漏洞检测方法给出的结果提供直观解释的,并且用户案例研究证实了利用众包知识直观解释结果的可行性。

Distinguishing Look-Alike Innocent and Vulnerable Code by Subtle Semantic Representation Learning an_第1张图片

上图显示了tcpdump项目[21]中特定函数的两个版本(左侧是易受攻击版本,右侧是非易受攻击版本)。此函数包含典型的越界读取漏洞CVE-2017-12894。第17行的if条件语句未检测地址的长度。

为了探究本文直观假设的可行性,本文提出了一个名为 SVulD 的新颖框架,该框架集成了软件漏洞检测和直观的自然语言解释。如下图所示,SVulD 包含两个主要阶段:❶ 训练阶段,在高质量数据集上训练漏洞检测器,并在众包知识上构建漏洞解释器;❷ 推理阶段,通过训练好的漏洞检测器将特定函数分类为易受攻击或非易受攻击,并为检测到的易受攻击函数提供若干面向开发者的解释。本文在以下子部分中详细介绍 SVulD。

Distinguishing Look-Alike Innocent and Vulnerable Code by Subtle Semantic Representation Learning an_第2张图片

下图展示了本文中使用的对比学习架构,其中 UniXcoder 是用于语义嵌入的基础模型。本文使用池化层连接 UniXcoder 模型和三元组网络。三元组网络有两层。第一层是三个相同的深度神经网络,用于输入函数的特征提取,很容易被其他语义学习模型替换。三元组网络的第二层是基于余弦距离算子的损失函数,带有投影器的变换操作,用于最小化相似函数之间的距离,最大化不相似函数之间的距离。训练目标是微调网络,使得函数  和正函数之间的距离比函数  和负函数之间的距离更近。

Distinguishing Look-Alike Innocent and Vulnerable Code by Subtle Semantic Representation Learning an_第3张图片

研究数据集的统计信息如下表所示:

Distinguishing Look-Alike Innocent and Vulnerable Code by Subtle Semantic Representation Learning an_第4张图片

为了探究 SVulD 在软件漏洞检测和检测结果解释方面的可行性,本文的实验聚焦于以下四个研究问题:

RQ-1. SVulD 在函数级漏洞检测性能上能达到何种程度?

RQ-2. 对比成对实例的构建策略如何影响 SVulD 的性能?

RQ-3. 成对实例的规模如何影响 SVulD 的性能?

RQ-4. SVulD 在解释检测结果方面表现如何?

RQ-1 答案:SVulD 在函数级软件漏洞检测方面优于 SOTA 基线。特别是,它在 F1 分数和 PR-AUC 上取得了压倒性的结果,这表明配备对比学习和预训练模型的 SVulD 具有更强的学习函数语义的能力,尤其是对于那些词法相似但语义不同的函数。

RQ-2 答案:所有成对实例构建策略在学习函数语义嵌入方面都有各自的优势,R-Drop 策略表现最佳。

RQ-3 答案:负实例的数量会影响 SVulD 的性能,较大的数量并不总是保证更好的性能。在本文的设置中,中等大小(即 32)更为合适。

RQ-4 答案:本文的用户研究表明,在一定程度上,SVulD 展示了协助开发者直观理解检测到的漏洞的潜在可行性。

讨论与分析

为什么 SVulD 优于现有基线?

基于 DL 的漏洞检测方法具有强大的学习特征表示的能力,以区分易受攻击函数和非易受攻击函数。因此,模型漏洞检测的有效性在很大程度上取决于两种类型函数(即易受攻击和非易受攻击)的特征表示的可分离性。两种函数的可分离性越大,模型就越容易区分它们。

本文采用主成分分析 (PCA)[6] 来检查所研究模型的可分离性。PCA 是一种流行的降维技术,适用于将原始特征嵌入投影到两个主维度嵌入中。此外,为了更清晰的可视化,本文在测试数据集中随机采样与易受攻击函数数量相同的非易受攻击函数。

下图展示了所研究方法的可分离性。从可视化结果(图 7(a)-(d))可以看出,大多数函数是混合的,每个函数的边界不清晰,这表明基线在绘制决策边界方面的困难。相比之下,UniXcoder(如图 7(e) 所示)比基线具有更好的可分离性,这表明大规模预训练语言模型(专门在 C/C++ 代码上训练)具有更强的理解代码语义的能力。最后,图 7(f) 显示了本文的 SVulD 的可分离性。本文可以观察到 SVulD 在区分易受攻击函数和非易受攻击函数方面表现最佳。配备对比学习,SVulD 可以学习更好的函数语义嵌入。

Distinguishing Look-Alike Innocent and Vulnerable Code by Subtle Semantic Representation Learning an_第5张图片

有效性威胁

内部有效性威胁:主要对应于本文的方法和其他基线实现中的潜在错误。为了最小化此类威胁,本文首先通过结对编程实现本文的模型,并直接利用预训练模型来构建漏洞检测器。本文还使用相应作者在 GitHub 存储库中共享的基线原始源代码,并使用原始论文中的相同超参数。作者还仔细审查了实验脚本以确保其正确性。

外部有效性威胁:主要对应于研究数据集。尽管本文已经在文献中广泛使用的漏洞数据集上评估了模型,以确保与基线的公平比较,但项目的多样性在以下方面也受到限制。首先,所有研究的项目(即函数)都是用 C/C++ 编程语言开发的。因此,未考虑用其他流行编程语言(如 Java 和 Python)开发的项目。其次,所有研究的数据集都是从开源项目收集的,SVulD 在商业项目上的性能未知。因此,未来的工作应该收集和探索更多样化的数据集。

构造有效性威胁:主要对应于本文评估中使用的性能指标。为了最小化此类威胁,本文采用了现有工作中广泛使用的一些性能指标。特别是,本文总共考虑了五个性能指标,包括准确率、精确率、召回率、F1 分数和 PR-AUC。

相关工作

基于 AI 的软件漏洞检测

软件漏洞检测已引起研究人员的广泛关注,许多基于 DL 的方法已被提出,以从历史数据中自动学习漏洞模式[8,16,28,30,31,44,45],因为深度神经网络的强大学习能力已在许多软件工程场景中得到验证[32,33,46](例如缺陷预测、缺陷修复)。

Dam 等人[13]提出了一种基于 LSTM 架构的漏洞检测器。Russell 等人[38]提出了另一种基于 RNN 的架构,用于从源代码中自动提取特征以进行漏洞检测。然而,这些方法假设源代码是标记的序列,忽略了源代码的图结构。因此,Li 等人[29,30]相继提出了两种基于切片的漏洞检测方法,VulDeePecker[30]和 SySeVR[29],以学习易受攻击代码的语法和语义信息。随后,许多基于图神经网络 (GNN) 的模型[44,45]被提出。Cheng 等人[11]提出了 DeepWukong,通过将代码的文本和结构信息嵌入到全面的代码表示中。Wang 等人[42]提出了 FUNDED,通过结合九种主流图。Cao 等人[7]提出了 MVD,用于检测细粒度的内存相关漏洞。

除了粗粒度模型(如函数级),研究人员还提出了许多细粒度模型。Li 等人[28]提出了 VulDeeLocator,通过采用程序切片技术来缩小易受攻击代码行的范围。Fu 等人[19]提出了 LineVul,通过利用 BERT 架构内的注意力机制进行行级漏洞检测。Hin 等人[23]提出了 LineVD,将语句级漏洞检测公式化为节点分类任务。

与之前的工作不同,本文专注于函数的有效语义嵌入,尤其是那些词法相似的函数。

基于 AI 的软件漏洞检测的解释

开发可解释模型是漏洞检测的方法之一,可以提供细粒度的漏洞预测结果。具体来说,许多工作试图通过利用可解释 AI 来检测行级信息,用于软件工程任务,如检测缺陷预测的源代码行[33,37]。这凸显了研究可解释基于 AI 模型的重要性。

然而,现有研究仅限于为解释生成提供部分信息。Zou 等人[47]引入了一种高保真标记级解释框架,旨在识别对检测器预测有重大贡献的少量标记。Li 等人[28]提出了 VulDeeLocator,以同时实现高检测能力和高定位精度,并在中间代码处解释检测结果。Ding 等人[15]提出了一种语句级模型,通过定位特定的易受攻击语句,假设在函数级接收易受攻击的源代码。Li 等人[27]采用可解释 GNN 提出了 IVDetect,并提供了细粒度的解释。Fu 等人[19]提出了一种基于 Transformer 的行级模型,名为 LineVul,并利用 BERT 架构的注意力机制来解释易受攻击的代码行。最近,Sun 等人[40]进行了可解释 AI 在静默依赖警报预测中的首次研究工作,为相关领域打开了大门。

与现有专注于解释 AI 模型为何给出预测结果的工作不同,本文旨在通过提供面向开发者的自然语言描述解释来为检测结果做出解释,以启发式地帮助开发者理解检测到的漏洞的根本原因。

做个总结

本文提出了一种新方法 SVulD,即用于漏洞检测的函数级细微语义嵌入方法,并附带启发式解释,技术上基于预训练语义嵌入和对比学习。SVulD 首先采用对比学习来训练 UniXcoder 语义嵌入模型,以学习函数的区分性语义表示,而不考虑其词法相似信息。SVulD 其次通过爬取 Stack Overflow 中的有问题代码来构建基于知识的众包数据集,为开发者提供检测到的有问题代码的启发式解释。实验结果通过与四种 SOTA 基于深度学习的方法进行比较,显示了 SVulD 的有效性。

未来的工作将研究对比学习对现有基于深度学习的漏洞检测方法的泛化能力。

你可能感兴趣的:(漏洞挖掘,论文阅读,网络安全,论文笔记,漏洞检测,数据集,深度学习,论文分享,AI)