长亭百川云 - 文章详情

基于图的安全补丁检测

拨开云雾

44

2024-07-13

分享一篇来自S&P 2023的论文,题目为:"GraphSPD: Graph-Based Security Patch Detection with Enriched Code Semantics"。文章代码和数据已开源:https://sunlab-gmu.github.io/GraphSPD/。

随着开源软件的日益流行,其中嵌入的漏洞很大可能会被传播到下游软件。由于不同的维护策略,软件供应商可能会在没有提供足够建议的情况下悄悄发布安全补丁[1];这使得用户意识不到安全补丁,并为攻击者利用未打补丁的漏洞提供了很好的机会。 同时,及时修补软件是减少N-Day攻击的一种有效的常见做法。不幸的是,用户或管理员经常被各种新功能添加、解决性能缺陷或修复安全漏洞的补丁弄得不知所措(各种类型的补丁太多了,从业者很难从中判别哪些是与安全有关的)。

Listing 1和2分别是作者给出的安全补丁和非安全补丁示例。Listing 1中的代码添加了if条件语句(第8行和第9行),用于检查指针tcon是否有效;该补丁属于安全补丁,因为它解决了空指针取消引用漏洞。Listing 2中的代码删除了废弃的变量(第7行),所以它是非安全补丁。当修补前代码中存在漏洞并且修补后代码中存在相应的修复语句时,补丁程序被视为安全补丁。

现有方法局限性:缺乏程序语义和高误报率。

(1)由于只关注代码语法,检测准确性相对较低。例如,基于机器学习的方法专注于提取元数据和关键字特征,忽略了语句之间的依赖关系。

(2)基于RNN的方法将程序分割为一组代码token,并利用顺序模型来识别安全补丁。但是这忽略了编程语言在组件单元、依赖关系和token类型上的独特性。现有解决方案的高假阳性率问题项。例如,两个基于RNN的解决方案[2]、[3]同时利用了源代码和提交消息,其误报率分别为11.6%和33.2%;而所有补丁中只有6-10%是安全相关的[4]。

为此,作者提出了一个基于图的安全补丁检测系统GraphSPD,如图1所示,由两个核心组件组成:补丁图表示PatchCPG和补丁定制的图神经网络模型PatchGNN。PatchCPG通过扩展代码属性图来整合源代码的补丁前和补丁后版本,从而容纳补丁的丰富语义信息。在将PatchCPG的图拓扑转换成具有补丁定制特征的数字格式之后,PatchGNN使用新的多属性图卷积机制来适应PatchCPG中的各种关系。

如图1所示,GraphSPD的输入是OSS(Open Source Software)补丁,这些补丁首先映射到包含控制/数据依赖和程序语法的中间图形表示PatchCPG。接下来,PatchCPG的节点和边被转换为嵌入矩阵,该矩阵被输入到基于图的深度神经网络PatchGNN中,该网络可以预测输入补丁是安全补丁还是非安全补丁。

  • 映射补丁到PatchCPG

由于补丁文件本身的上下文信息有限,作者首先检索修补前和修补后的源代码以获得更多的上下文详细信息。对于安全补丁,修补前的源代码可以揭示漏洞模式,而修补后的源代码可以指出修复细节。因此,分别构建补丁前和补丁后源代码的两个CPG。PatchCPG是通过合并修补前后源代码的CPG而形成的数据结构。合并原则是保留两个CPG中的共享上下文组件,然后分别附加补丁前CPG和补丁后CPG中删除和添加的组件。因此,PatchCPG是一个包含来自两个不同版本的节点和边的统一图。

然而,从源代码引入更多上下文还会将大量噪声(即不相关的上下文信息)带入检测过程,从而损害系统性能。本文从两个方面移除不相关的上下文来缓解这个问题。首先,在从源代码中提取CPG之前,补丁中不涉及的所有函数都将从源代码文件中删除。第二,在合并CPG之后,在PatchCPG上应用程序切片技术,以根据朝向删除/添加语句的节点的跳数来限制上下文代码的范围。

具体来说,PatchCPG的构建流程如图2所示

(1)生成修补前和修复后的CPG

简单来说就是通过git的版本控制功能,根据commit检索commit前后的文件;然后通过正则表达式找到以---+++开头的行来识别补丁修改的文件;进一步通过joern对文件进行解析,找到所有与补丁相关的函数。最后,再次使用joern解析函数源代码以获得CPG。

(2)合并CPG

PachtCPG有三个组件:

  • Deleted组件:修补前图中的节点和边,不会出现在修补后的图中。对于安全补丁,Deleted组件与漏洞高度相关。

  • Added组件:只存在于修补后的图中,而不存在于修补前的图中的节点和边。对于安全补丁,添加的组件通常是修复漏洞的操作。

  • Context组件:对应于未更改语句的节点和边,在修补前和修补后函数中都出现。尽管这些组件未被修补程序修改,但它们包含与删除或添加的语句相关的上下文信息。

合并CPG的主要思想是保留Context组件,并将Deleted和Added组件附加到统一的图中。具体来说:

-- 首先,是识别节点版本:也就是判断节点属于哪个组件类型。

-- 接着,是识别边类型:判断边属于哪个组件类型。

-- 最后,重新分配节点ID,合并节点和边。

(3)在代码变更上进行程序切片

在PatchCPG中,没有必要在函数中包含所有语句,因为其中一些语句与漏洞无关。通过前向和后向切片(根据控制和数据依赖实现),对与Add/Delete语句有依赖关系的语句保留,作为上下文。其中,前向切片的目的是为了查找受漏洞影响的语句,而后向切片则是为了定位漏洞的来源。

图3是Listing 3的切片结果。

  • 通过PatchGNN检测安全补丁

为了识别安全补丁,PatchCPG首先被转换为数字格式,然后输入PatchGNN。为了将PatchCPG嵌入到数字图G中,本文将拓扑转换为邻接矩阵并嵌入边和节点的属性。使用相应的版本信息和边类型将PatchCPG中的边嵌入到5维向量(前两位分别用于指示修补前版本和修补后版本中是否存在边缘。如果边属于两个版本,前两位将是[1,1]。最后三位分别指示当前两个节点之间是否存在任何CDG、DDG或AST边)中。PatchCPG中的节点嵌入到20维漏洞相关特征中,这些特征是从节点属性和相关语句中提取的,专为补丁程序定制,因此它们对于减少安全补丁程序检测中的错误警报至关重要。节点嵌入包含2个与代码无关的特性(即代码片段元数据)和18个与代码相关的特性(即标识符、文字、控制流、运算符和API的特性)。为了提取代码相关的特征,每个节点中的语句首先被clang分割为一组具有不同token类型的代码token。特征提取基于token(或子token)匹配和token类型识别。token的具体类型为4种:关键字、标识符、文字和标点符号。

PatchGNN能够从语法级和语义级表示中学习漏洞模式。语义表示通过具有不同边关系的PatchCPG结构来表现,而语法级表示通过代码片段的节点嵌入来实现。最近的研究[5-6]表明源代码漏洞与一些特定的语法特征高度相关。例如,在C/C++语言中,指针和数组的使用更容易受到攻击,因为这些操作通常会导致越界(OOB)访问或空指针取消引用。此外,几个特定的算术表达式可以指示潜在的不正确操作(例如整数溢出)。根据观察到的漏洞语法特征,作者从每个节点的代码片段中提取了5组共20个特征:

-- 特征组别1,代码切片与数据:字符数、版本信息(即删除、添加或上下文)。

-- 特征组别2,标识符和文字特征:函数调用、变量、数字、字符串、指针、数组和空标识符的数量。

-- 特征组别3,控制流特征:指示节点是条件语句、循环语句还是跳转语句的布尔特征。

-- 特征组别4,操作符特征:算术、关系、逻辑和按位运算符的数量。

-- 特征组别5,API特征:指示代码段是否包含内存操作、字符串操作、锁定操作和系统操作的API的布尔特征。

其中,控制流和操作符特征如表1所示,通过token关键字精准匹配提取。

PatchGNN的设计如图4所示。对于PatchCPG中的每个节点,PatchGNN中的卷积层倾向于通过不同类型的边从其邻居收集信息。由于边类型的不同作用,无法使用一组统一的权重来学习检测模型。边嵌入的每个维度可以指示PatchCPG中的不同关系,即修补前/修补后连接、控制/数据依赖性和AST图。如图5所示,每条边可以有多个属性,而每种类型的属性都可以用来构建一个子图。由于每个维度中的信息对应于一个子图,因此可以将每个维度视为一个单独的卷积通道。在PatchGNN的卷积层中,单独处理每个通道的结构信息,并聚合所有子图的处理信息,如图6所示。

参考文献

[1] Wang X, Sun K, Batcheller A, et al. Detecting" 0-day" vulnerability: An empirical study of secret security patch in OSS[C]//2019 49th Annual IEEE/IFIP International Conference on Dependable Systems and Networks (DSN). IEEE, 2019: 485-492.

[2] Wang X, Wang S, Feng P, et al. Patchrnn: A deep learning-based system for security patch identification[C]//MILCOM 2021-2021 IEEE Military Communications Conference (MILCOM). IEEE, 2021: 595-600.

[3] Zhou Y, Siow J K, Wang C, et al. Spi: Automated identification of security patches via commits[J]. ACM Transactions on Software Engineering and Methodology (TOSEM), 2021, 31(1): 1-27.

[4] Wang X, Wang S, Feng P, et al. Patchdb: A large-scale security patch dataset[C]//2021 51st Annual IEEE/IFIP International Conference on Dependable Systems and Networks (DSN). IEEE, 2021: 149-160.

[5] Li Z, Zou D, Xu S, et al. Sysevr: A framework for using deep learning to detect software vulnerabilities[J]. IEEE Transactions on Dependable and Secure Computing, 2021, 19(4): 2244-2258.

[6] Wang X, Wang S, Sun K, et al. A machine learning approach to classify security patches into vulnerability types[C]//2020 IEEE Conference on Communications and Network Security (CNS). IEEE, 2020: 1-9.

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2