HyVulDect A hybrid semantic vulnerability mining system based on graph neural network

HyVulDect A hybrid semantic vulnerability mining system based on graph neural network
foresta.yang0 Abstract
提出了一个基于混合语义的图神经网络漏洞挖掘系统HyVulDect,该系统基于漏洞的原因构建了一个复合语义代码属性图用于代码表示。使用门控图神经网络来提取深层语义信息。由于大多数漏洞都与数据流相关,我们使用污点分析来提取污点传播链,使用BiLSTM模型来提取上下文的令牌级特征,最后使用分类器对融合特征进行分类。我们引入了一种双重关注机制,使模型能够专注于与漏洞相关的代码,使其更适合于漏洞挖掘任务。实验结果表明,HyVulDect优于现有的最先进的方法,在基准数据集上可以实现92%的准确率。与基于规则的静态挖掘工具Flawfinder、RATS和Cppcheck相比,它具有更好的性能,可以有效地检测实际的CVE源代码漏洞。
1 Intro or Overview
1.1 Problem and Challenge
现有的软件往往是大规模和复杂的,项目的代码量急剧增加。简单使用手动审计代码的成本非常高,而且很难发现触发条件复杂的漏洞。机器学习和深度学习的发展也被广泛用于软件漏洞挖掘。基于传统机器学习的方法需要手动提取漏洞的特征,并依赖于大量的专家知识。基于深度学习方法,将源代码视为一个自然语言序列,并使用现有的自然语言处理方法进行特征表示,总结漏洞的特征进行检测和分类。这些方法可以有效地捕获源代码中由漏洞触发的上下文信息。然而,**没有考虑源代码的结构特征,**此外,在代码表示中丢失了许多语义信息。尽管图神经网络可以处理代码图表示等非欧几里得数据,但现有的方法将源代码表示为AST和CFG,缺乏源代码的数据依赖性信息,不利于漏洞的检测。同时,直接使用程序源代码作为图神经网络的输入,引入了大量冗余代码,不利于模型的学习。
1.2 Motivation
1.3 Contribution
我们提出了一种基于混合语义的图神经网络漏洞挖掘系统,该系统利用门控图神经网络和具有双重注意力机制的BiLSTM网络来提取源代码图级和令牌级特征。融合两个维度的深层功能可以有效地用于检测漏洞。
我们改进了基于API调用的程序切片算法(Li et al.,2021),补充了程序切片的结构,在提取漏洞上下文信息的同时保留了代码的结构信息。
基于该设计方案的实验表明,HyVulDect的检测性能优于传统的静态扫描工具。与最先进的探测器相比,Devign、VUDDY和BGNN4VD的精度分别提高了27.6%、14.2%和4.9%。同时,它可以有效地检测现有的CVE漏洞。
2 Architecture & Method
2.1 System Overview
图7(a)是该程序的源代码,它调用wcscpy函数将宽字符串从源复制到目标。首先,我们定位API函数wcscpy函数,它有两个参数数据和SOURCE_STRING。对于属于用户定义函数F ree_Pointer()的参数数据,该函数的内部切片由五条语句组成,即程序的第17、18、20、21、23行。第23行的badSink()函数是一个用户定义的函数,用于接收外部参数数据,该函数的内部切片由四行语句组成,即程序的第0、4、6和12行。对于参数SOURCE_STRING,相关联的语句是第15行、第21行。通过参数数据得到的最终切片序列为:17->18->20->21->23->0->4->6->12。通过参数SOURCE_STRING得到的最终切片序列为:15->21。将两个切片序列按照原来的代码顺序组合起来,去掉重复的代码行,基于API函数wcscpy()的最终切片代码序列为:0->4->6->12->15>17->18->20->21->21->23->23。图7(c)显示了基于API函数生成的代码切片,可以看出它有效地减少了代码行数。为了减少语料库的规模,我们一对一地替换用户定义的函数和变量(例如badSink()->f unc_0(),data->var_0)。图7(d)显示了变量命名标准化后的程序切片,有效地减少了令牌的数量。尽管之前的操作有效地提取了与漏洞相关的代码行,并删除了不相关的代码,但源代码的结构不再完整。为了补充源代码的结构信息,我们补充了程序片的结构。我们根据程序源代码的结构来补充代码片的结构。算法1详细描述了程序片结构的补充过程。在解析源代码时,提取代码中用户定义的函数和控制块,以补充切片代码。完成切片后,首先从上到下扫描代码切片。如果这行代码是自定义函数,在这行代码下面加上结构代码“{”,继续向下扫描,直到遇到一行不属于自定义函数的代码,在它前面加上“}”,就完成了对函数结构的补充。对于控制结构,有四种主要结构:if条件语句、switch条件语句、For循环语句和while循环语句。补充逻辑与功能相同。在切片结构的补充过程中,我们遵循这样的原则:首先,完成结构的函数;然后,控制结构,因为控制结构通常包含在功能体中。如图7(e)所示,是最终生成的程序切片。