论文学习:漏洞检测SnapVuln

SnapVuln

SnapVuln是一种基于学习的漏洞检测方法,它应用多个针对特定漏洞的跨函数算法来识别源和汇点,以捕捉各种漏洞类型的精确程序语义。通过从源代码中提取跨函数的图形(IG),SnapVuln可以综合使用PDG、CFG和调用图(CG)。然后,针对不同漏洞类型,设计了多个专门的切片算法来捕获精确的漏洞语义,识别源和汇点,并在跨函数图形上进行操作。此方法还使用门控图神经网络(GGNN)结合注意力机制为每种漏洞类型构建子模型,并针对未被切片算法覆盖的漏洞类型使用图神经网络(GNN)模型。最终,将这些子模型和GNN模型的输出整合以预测漏洞。
然而,提供的上下文并未明确说明SnapVuln是否可以直接应用于源码级的漏洞识别。上下文中也提到了其他采用切片算法用于提取漏洞语义的工作[3],但这些切片算法不能区分源和汇点,可能会引入噪音,导致提取的漏洞语义不精确。因此,在没有其他信息的情况下,无法确定SnapVuln是否适用于源码级的漏洞识别。如有必要,建议查阅与源码级漏洞识别相关的其他文献或方法。

SnapVuln使用切片算法来提取漏洞的语义信息。以下是SnapVuln中切片的提取步骤的简述:

提取跨函数图(Inter-procedural Graph,简称IG)

:从源代码中提取IG,该图结合了程序依赖图(PDG)、控制流图(CFG)和调用图(CG)。IG可以保留精确的程序语义信息。
设计针对不同漏洞类型的专门切片算法:为了捕获不同漏洞类型的准确语义,SnapVuln为每种漏洞类型设计了专门的切片算法。这些切片算法通过在IG上进行操作,识别源和汇点,并提取相关的语义信息。
切片生成子图:根据切片算法,从IG中生成与漏洞相关的子图。子图可以捕获与漏洞相关的程序结构语义信息。
子模型构建与训练:对于每种漏洞类型,SnapVuln为其构建一个子模型。子模型利用门控图神经网络(GGNN)结合注意力机制,对子图进行建模和训练,以学习不同子图的权重和代码表示。
综合预测:将所有子模型的输出以及跨函数图(IG)输入到GNN模型中,以捕获全面的程序语义信息。最后,将子模型和GNN模型的输出进行综合,得出综合的漏洞预测结果。
通过上述步骤,SnapVuln能够提取精确和全面的漏洞语义信息,从而实现漏洞的有效识别。

切片生成子图是在SnapVuln中用于捕获与漏洞相关的程序结构语义信息的重要步骤。下面是切片生成子图的详细解释:

针对特定漏洞类型设计切片算法:对于每种特定的漏洞类型,SnapVuln设计了针对该漏洞类型的切片算法。这些算法根据该漏洞类型的特征,确定源和汇点的条件,并在程序中进行切片操作。
选择切片起点和切片条件:根据切片算法,需要选择一个合适的切片起点以及切片的条件。切片起点一般为与特定漏洞类型相关的危险操作(例如,危险的API调用或变量)。切片条件则是判断哪些语句是与漏洞相关的条件。
根据切片条件进行切片操作:从切片起点开始,根据切片条件进行切片操作,逐步向外扩展,直到不再满足切片条件为止。切片过程中保留与漏洞相关的程序语句和控制流信息,并排除与漏洞无关的代码。
提取切片子图:根据切片操作的结果,提取与漏洞相关的切片子图。切片子图以切片起点为根节点,包含了与漏洞相关的程序片段和它们的控制流关系。
子图表示与权重学习:切片子图需要进行图形表示,并为切片子图学习权重。SnapVuln使用图神经网络(GNN)或门控图神经网络(GGNN)来对子图进行表示和训练,以捕捉子图的结构语义和学习不同子图的权重。
通过以上步骤,切片生成子图能够提取与特定漏洞类型相关的精确的程序结构语义信息。这些子图将作为输入进一步进行训练和预测,以实现对漏洞的准确识别。

结合CWE具体的分析

切片生成子图是SnapVuln中的一个关键步骤,用于捕获与特定漏洞类型相关的程序结构语义信息。下面我们以CWE-415(Double Free)漏洞为例,详细解释切片生成子图的步骤:

针对CWE-415设计切片算法:为了捕获Double Free漏洞的语义信息,SnapVuln为CWE-415设计了相应的切片算法。该算法会考虑到Double Free的特征,如对同一指针进行多次释放。
选择切片起点和切片条件:在Double Free漏洞中,切片起点可以是free()函数的调用点,因为这是释放内存的关键操作。为了定义切片条件,算法可以检查内存释放之后是否存在对已释放的内存进行潜在的使用操作。
根据切片条件进行切片操作:从切片起点开始,切片算法根据切片条件对程序进行切片操作。它会追踪与free()函数相关联的任何语句,并跟踪可能对已释放的内存进行访问的语句。
提取切片子图:根据切片操作的结果,SnapVuln提取与Double Free漏洞相关的切片子图。该子图将包含与free()函数调用点和可能对已释放内存进行访问的语句相关联的代码片段和控制流。
子图表示与权重学习:为了将子图作为输入,SnapVuln使用图神经网络(GNN)或门控图神经网络(GGNN)对子图进行表示和权重学习。这样可以捕捉子图的结构特征和学习不同子图的权重,以进一步提高漏洞检测的准确性。
通过以上步骤,SnapVuln能够生成与Double Free漏洞相关的切片子图,从而捕获Double Free漏洞的精确程序结构语义信息。利用这些子图表示和之后的训练,SnapVuln可以更准确地检测和预测Double Free漏洞。类似地,对于其他漏洞类型,SnapVuln会根据其特征设计相应的切片算法,并按类似的步骤生成相关的切片子图。

SnapVuln在C/C++代码中针对以下六种常见漏洞类型实现了切片算法[1]。这些漏洞类型和对应的切片算法如下:

缓冲区溢出(Buffer Overflow):切片起点可以是与缓冲区溢出相关的语句,切片条件可以是检测写入缓冲区的语句。切片子图将包含与缓冲区溢出相关的语句和控制流。
空指针解引用(Null Pointer Dereference):切片起点可以是空指针解引用的语句,切片条件可以是对空指针的解引用操作。切片子图将包含与空指针解引用相关的语句和控制流。
使用未初始化的变量(Uninitialized Variable):切片起点可以是未初始化变量的使用语句,切片条件可以是检测变量是否已被初始化的条件语句。切片子图将包含与未初始化变量相关的语句和控制流。
释放后使用(Use After Free):切片起点可以是释放内存的语句,切片条件可以是使用已释放内存的语句。切片子图将包含与释放后使用相关的语句和控制流。
跨缓冲区写入(Out-of-Bounds Write):切片起点可以是与跨缓冲区写入相关的语句,切片条件可以是检测写入位置是否超出缓冲区边界的条件语句。切片子图将包含与跨缓冲区写入相关的语句和控制流。
整数溢出(Integer Overflow/Underflow):切片起点可以是与整数溢出相关的算术运算语句,切片条件可以是检测数字溢出的条件语句。切片子图将包含与整数溢出相关的语句和控制流。
以上是SnapVuln实现的针对C/C++中六种常见漏洞类型的切片算法的简述。具体的切片操作和算法细节可以进一步参考原始论文以获得更详细的信息。

空指针解引用是SnapVuln中针对空指针解引用漏洞实现的切片算法。下面是对空指针解引用的切片步骤的详细描述:

切片起点选取:切片算法将选择与空指针解引用相关的语句作为切片起点。空指针解引用指的是在代码中对空指针进行解引用操作的语句,如*ptr,其中ptr为空指针。
切片条件确定:切片算法需要确定哪些语句是与空指针解引用相关的条件。例如,判断指针是否为空指针的条件语句可以作为切片条件,如if (ptr == NULL)。
进行切片操作:从切片起点开始,切片算法会根据切片条件在程序中进行切片操作。它会追踪与空指针解引用相关的语句,并跟踪可能依赖于空指针解引用的语句。
提取切片子图:根据切片操作的结果,提取与空指针解引用相关的切片子图。切片子图将包含与切片起点(空指针解引用语句)以及可能依赖于空指针解引用的语句相关联的代码片段和控制流信息。
子图表示与权重学习:切片子图需要进行图形表示,并为切片子图学习权重。SnapVuln使用图神经网络(GNN)或门控图神经网络(GGNN)来对子图进行表示和训练,以捕获子图的结构语义特征和学习不同子图的权重。
通过以上步骤,SnapVuln能够生成与空指针解引用漏洞相关的切片子图,捕获该漏洞的精确程序结构语义信息。这些子图表示和训练将用于漏洞的检测和预测,以提高对空指针解引用漏洞的准确性。

详细的描述:对比NPDHunter—>空指针这块

空指针解引用的切片操作可以通过以下步骤来实现,并在每个步骤中提供相关示例以更好地说明:

切片起点选取:切片算法将选择与空指针解引用相关的语句作为切片起点。例如,在以下代码段中,*ptr表示对指针ptr进行解引用操作:

int *ptr = NULL;
int value = *ptr; // 空指针解引用

切片条件确定:切片算法需要确定哪些语句是与空指针解引用相关的条件。例如,在以下代码段中,if语句中的条件判断了指针ptr是否为空指针:

int *ptr = NULL;
if (ptr != NULL) {
int value = *ptr; // 空指针解引用
}

进行切片操作:从切片起点开始,切片算法会根据切片条件在程序中进行切片操作。它追踪与空指针解引用相关的语句,并跟踪可能依赖于空指针解引用的语句。在上述示例中,切片算法将追踪和探索与空指针解引用操作相关的语句,如下所示:

int *ptr = NULL;
if (ptr != NULL) {
int value = *ptr; // 空指针解引用
printf("%d\n", value);
}

在这个示例中,切片算法将追踪并包括了int value = *ptr;以及其依赖语句printf(“%d\n”, value);。
4. 提取切片子图:根据切片操作的结果,提取与空指针解引用相关的切片子图。切片子图将包含与切片起点(空指针解引用语句)以及可能依赖于空指针解引用的语句相关联的代码片段和控制流信息。在上述示例中,切片子图可以表示如下:

┌───────┐
│       ▼
int *ptr = NULL;
if (ptr != NULL) {
int value = *ptr;
printf("%d\n", value);
}

在这个切片子图中,包含了与空指针解引用操作相关的语句和控制流信息,包括了切片起点*ptr和其依赖语句printf(“%d\n”, value);。
通过以上步骤,切片算法可以识别与空指针解引用相关的代码,并提取出相应的切片子图,以便进一步进行漏洞的检测和预测。

可以改进的地方:

这篇文章可以在以下几个方面进行改进:

对多函数漏洞的处理:文章指出实际情况中漏洞通常跨越多个函数,因此需要引入跨函数的分析来捕获完整的漏洞语义信息[2]。对于多函数漏洞,目前的学习方法主要关注单个函数,因此有必要引入跨函数的分析以获得完整的漏洞语义信息。
对切片算法的改进:文章提到了切片算法在空指针解引用漏洞检测方面可能存在不足,并且引入切片算法可以提取准确的漏洞语义信息[1]。因此,可以通过改进切片算法来提高对不同漏洞类型的切片准确性,进而改善漏洞的检测和预测能力。
减少噪声信息:文章指出引入多函数的分析方法可能会引入大量与漏洞无关的语义信息,从而增加模型的噪声[1]。因此,可以尝试减少噪声信息的引入,特别是在处理真实世界的数据集时,通过优化数据集或改进模型来减少对漏洞无关信息的依赖。
进一步完善漏洞语义提取:文章提到,完整的漏洞语义对于获得良好的性能并不足够,还需要使用一些切片算法来提取准确的漏洞语义[1]。因此,可以进一步研究和改进漏洞语义的提取方法,以提高对不同漏洞类型的准确性和覆盖度。
总之,这篇文章可以改进的方面包括对多函数漏洞的处理、切片算法的改进、减少噪声信息以及进一步完善漏洞语义的提取。这些改进有助于提高漏洞检测的准确性和性能。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值