GraphFVD - Property graph-based fine-grained vulnerability detection

GraphFVD - Property graph-based fine-grained vulnerability detection
foresta.yang0 Abstract
深度学习技术可以自动从软件源代码中提取功能,从而广泛用于检测软件漏洞。大多数现有的深度学习方法都依赖整个功能或序列级程序切片来识别漏洞。但是,这些方法通常很难捕获全面的脆弱性语义,从而导致高误报率和假阴性率。在本文中,我们提出了GraphFVD,这是一种基于图形的新型属性细粒漏洞检测方法。
我们的方法从代码属性图中提取基于图形的属性切片,并引入了一个分层注意图卷积网络以学习图形嵌入。 GraphFVD提供了一个细粒的代码表示,该表示,捕获语法,控制流,数据流以及与漏洞相关的源代码的自然顺序顺序。我们评估了方法对两个现实世界漏洞数据集的有效性。实验结果表明,我们的方法在两个数据集上都优于现有的最新漏洞检测方法。
1 Intro
我们提出了一种新颖的细粒代码表示,从代码属性图中提取图形级程序切片(即基于属性图的漏洞候选或PRVC)。 PRVC结合了抽象语法,控制流,数据流和代码的顺序顺序,从而捕获了全面而精确的程序语义。
•我们设计一个分层注意力图卷积网络(HIERGCN),以学习PRVC的嵌入并预测漏洞。 HIERGCN在关系图卷积网络(RGCN)中引入了分层的关注,并纳入了当地注意力和全球关注。这种注意机制使我们能够根据其重要性融合不同令牌和节点的特征。
•我们使用两个现实世界漏洞数据集评估了方法GraphFVD的有效性。实验结果表明,GraphFVD优于最先进的漏洞检测技术。
2 Architecture & Method
PrVC
将库/API函数调用用作提取程序切片的主要入口点。
与敏感变量关联的节点作为切片的入口点。
包含算术运算符的代码语句作为切片的入口点。
选择切片入口点时考虑了if-条件语句。
我们可以根据两个特征来区分不同的节点:类型和代码。通过匹配定义的代码特性,我们可以提取四种类型的SEP。具体而言,每个SEP满足以下条件之一:(1)类型为函数,代码对应于1506个函数调用之一; (2)类型是识别类或参数,并且代码包含“ =”和(’*‘或’[’); (3)类型是表达式阶段,代码包含“ =”并与表达式匹配; (4)类型是ifStatement或参数,并且代码包含“ if”。
为了说明SEP识别过程,我们以敏感变量为例。
为了增强RGCN处理大漏洞数据集的能力,一种自然的方法是增加RGCN层的数量。
但是,直接堆叠多个RGCN层可能会导致成倍增长的扩展邻域导致噪声传播,从而阻碍性能优化。受He等人(2016年)的启发,我们结合了剩余联系以应对这一挑战。残留连接使梯度可以直接通过该层,从而有效缓解消失或爆炸梯度问题。因此,我们重新定义节点功能矩阵更新过程,如下所示:
3 Experiment and Evaluation
DataSet and Process
Evaluation
Conclusion
💡 Others
正如先前研究中强调的那样(Cheng等,2021; Li等,2018,2021b; Cao等,2022),滥用库/API函数是程序漏洞的主要原因。例如,MEMSET是C/C ++标准库中典型的与内存相关的函数,通常参与界外写入和其他类似的与内存有关的漏洞。因此,我们将库/API函数调用用作提取程序切片的主要入口点。具体而言,我们选择了1506个功能调用,这些调用使用了几个静态检测器(Flawfinder,2024; CheckMarx,2024)识别。传统的基于静态分析的方法也广泛采用了敏感变量(指针和阵列变量)(Li等,2020; Sui等,2012)。敏感变量的使用不当通常会导致漏洞,例如NULL指针取消,双免费和缓冲区溢出(FlawFinder,2024)。例如,如图2(a)所示,如果未注册平台特定的PMU驱动程序,则指针变量PPMU设置为无效,并访问其成员触发了无效的指针解除漏洞。
可以通过检查ppmu是否在访问前为null来减轻此漏洞。因此,我们还选择与敏感变量关联的节点作为切片的入口点。算术运算符(例如加法或减法)在程序中很常见,并且在数据处理和计算中起着至关重要的作用。这些操作的缺陷,例如整数溢出或零分割可以导致程序异常或漏洞。因此,对于与算术运算符有关的漏洞,我们选择包含算术运算符的代码语句作为切片的入口点。
除了上述三个常见的代码特征外,**我们还在选择切片入口点时考虑了if-条件语句。**该决定基于我们对众多脆弱的代码实例的观察,其中某些漏洞与if条件语句相关联。如果条件语句中的逻辑错误或不正确的条件评估可能会导致程序执行路径不当,从而可能导致漏洞。例如,在图2(b)中,当没有DM设备时,所需的变量设置为零,而变量LEN则在get_result_buffer函数中更新。 DM_ICTOL结构需要八个字节才能存储。在这种情况下,第9行的ifcondition语句评估为false,导致程序跳到第13行。这可能导致界外写作,因为LEN可能小于8。我们可以通过在第9行中修改IFCONDITION语句来解决此漏洞。因此,通过选择与条件语句相关的节点作为切片入口点,我们可以在程序的执行路径中追踪决策点,从而有助于发现与条件判断相关的漏洞。
为了解释从CPG中提取SEP的详细过程,我们在图3中介绍了弱点函数的CpG。
橙色盒子对应于AST节点,这些节点通过绿色虚线连接,代表抽象语法边缘。此外,每个黄色虚线说明了从一个节点到另一节点的数据流。