HyVulDect: 基于图神经网络的混合语义漏洞挖掘系统

14 篇文章 0 订阅
11 篇文章 0 订阅

1 存在问题

软件程序趋于庞大和复杂,软件漏洞成为计算机安全的主要威胁之一。开源软件的发展使得源代码漏洞检测变得越来越关键。传统的漏洞检测方法由于假阳率和假阴率较高,无法满足复杂软件的分析需求。

2 提出方法

提出了一个基于混合语义的图神经网络漏洞挖掘系统HyVulDect。该系统构建了一个复合语义的代码属性图来表示代码,使用门控图神经网络提取深层语义信息。利用污点分析提取污点传播链,并使用BiLSTM模型获取上下文的token级别的特征,最后使用分类器对融合特征进行分类。同时,加入双重注意力机制,使得模型能够关注与漏洞相关的代码。

3 本文贡献

  • 提出了一种基于混合语义的图神经网络漏洞挖掘系统,该系统利用门控图神经网络和具有双注意机制的BiLSTM网络来提取源代码图级和token级别特征。融合两个维度的深度特征可有效用于检测漏洞。
  • 通过补充程序切片结构,改进了基于API调用的程序切片算法,提取漏洞上下文的同时保留了代码的结构信息。
  • 实验表明,HyVulDect检测性能优于传统的静态扫描工具。与最先进的探测器相比,Devign、VUDDY和BGNN4VD的精度分别提高了27.6%、14.2%和4.9%。同时,它可以有效检测存在的CVE漏洞。

4 方法介绍

4.1 源代码图级特征提取

首先确定危险函数,根据危险函数的参数传递路径回溯所有相关代码行,并按初始顺序排列这些关键代码得到程序切片。统一替换用户自定义的函数名和变量名,例如将函数名替换为func_N(N=0,1,...,n),变量名替换为var_N(N=0,1,...,n)用于消除不同命名引起的误差和降低编码后的向量维度。这种方式提取了语义相关的代码,但破环了原始的代码结构,因此需补充程序切片的结构。

图7展示了一个基于API函数调用的程序切片例子。首先,定位API函数wcscpy,它存在两个参数dataSOURCE_STRING,通过参数data回溯所有与其相关的代码行,即17->18->20->21->23->0->4->6->12;通过参数SOURCE_STRING回溯所有与其相关的代码行,即15->21。根据程序代码原始顺序组合上述二者,得到切片序列:0->4->6->12->15->17->18->20->21->23(图7(c))。

为了减少token的数量和编码后的向量长度,对代码切片中的自定义的函数名和变量名统一替换。由于代码切片破环了源程序的结构,利用算法1补充代码切片的结构。算法1主要思想如下:从上往下扫描代码切片,在用户自定义的函数行下方添加"{",直到遇到不属于用户自定义的代码行,在其前添加"}"。首先完成函数结构的补充,再按同样的方法完成其中的控制结构(if语句,switch语句,for循环和while循环),最终得到完整结构的代码切片(图7(e))。

使用Joern将源代码解析为图形数据,将代码属性图(CPG)中的控制流边和数据依赖边合并为新的边CAD。通过DGL构建图形数据,对于图中的节点和边缘特征,使用预训练的Word2vec模型对其向量化。为每一个单词分配一个向量,由于97.7%的节点特征长度小于20,因此设置特征最大长度为20,从末尾阶段大于20的特征向量,并使用0来补充小于20的向量。总共存在以下5种类型的节点边:CDG: 0; DDG: 1; AST: 2; CFG: 3; CAD: 4。

最后构建基于门控图神经网络的检测模型,用于学习漏洞代码的语义信息。同时引入注意力机制,使得模型更加关注与漏洞相关的节点。图8展示了图级特征提取模型。首先,使用门控图卷积层提取一些低级特征,然后引入归一化层,可以使较大的学习速率对于梯度传播更稳定,并提高网络的泛化能力。使用sigmod函数作为激活函数,然后利用图形注意层提取更高级别的特征,使用ReLu函数激活神经元,并使用参数为0.3的dropout层。这可以减少模型的大小,同时提高模型的收敛速度并防止过拟合。最后,覆盖另一层图卷积层以提取最高层的特征,多个卷积层能够从较低级别的特征中迭代提取更复杂的特征。

4.2 污点传播链的token级特征提取

尽管复合图结构可以合成各种语义信息,但无法检测触发条件更为复杂的漏洞。污点分析可以跟踪和分析程序中的污点信息流。使用污点分析的方法提取源代码中的源->汇聚点传播链。为了简化跟踪过程和减小代码大小,通过跟踪变量分析污染信息流,并使用队列记录被污染的变量,从而提取源代码的污点传播链。利用相同的方法进行预处理,使用Word2vec预训练模型进行向量化。由于91.4%的污点传播链token数不超过800,因此选择800作为所有向量的阈值。同时考虑到在源代码分析中,某些特殊token符号可能包含丰富的语义信息,使用词法分析技术对token进行分割,以最大限度地分离不同的标识符和其它符号。

为了捕获污点链的上下文语义信息,使用BiLSTM进行token级的特征提取。

4.3 漏洞分类

在提取完污点传播链的源代码图级特征和token级特征之后,将它们串联得到最终的漏洞代码特征。基于CPG的图级特征包含源代码数据依赖性、控制依赖性和其他语义信息。基于污点分析的token级特征包含漏洞代码上下文语义信息和代码序列语法信息。最终获得的特征包含了代码的结构、语法和语义信息,可以覆盖多种类型的漏洞。最后利用XGBoost算法进行漏洞分类。

5 实验评估

5.1 数据集

预处理:删除所有注释,根据diff文件的标记,提取并标记补丁文件和漏洞文件中的相关函数,并将补丁函数标记为"0",漏洞函数标记为"1"。

5.2 实验对比

与存在的方法和检测工具的对比:

模型性能比较:

HyVulDect在真实世界软件产品中检测到的漏洞(部分):

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿航的博客

我比你有钱,请不要打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值