基于SAT的函数级源代码漏洞检测方法

文档序号:36267886发布日期:2023-12-06 15:30阅读:112来源:国知局
基于的制作方法

本发明属于软件脆弱性检测,涉及图神经网络、pdg图、transformer和智能化漏洞挖掘技术,特别涉及基于sat的函数级源代码漏洞检测方法。


背景技术:

1、近年来,随着计算机软件系统的复杂性增强,潜在的安全漏洞数量呈现递增趋势。尽管部分披露的软件安全漏洞已经被修复,这并不意味着计算机用户在使用软件系统时所面临的危害有所降低。

2、传统的源代码漏洞检测方法可以分为基于相似度和基于模式学习的检测,基于相似度的方法对于代码复制重用的场景十分有效,但是却无法检测出新出现的漏洞,导致比较高的假阴性率。而基于模式学习的方法则需要专家预先定义好漏洞特征,基于此特征进行匹配,对于专家知识依赖度过高,准确率不高。而目前的基于深度学习的漏洞检测方法由于没有充分利用结构与顺序信息,存在较高的漏报率和误报率。因此亟需一套更加优秀的源代码漏洞检测方法。


技术实现思路

1、为解决现有技术中存在的不足,本发明提供一种通用的基于sat(结构感知transformer)的c/c++源代码漏洞检测方法,通过训练正常代码与漏洞代码的pdg图,建立模型判断源代码中是否含有漏洞。该方法基于图神经网络与transformer神经网络,能够同时充分利用pdg图中的结构信息与代码行序列中的顺序信息,相较于传统的漏洞检测方式与深度学习检测方式,其误报率与漏报率更低。

2、为了达到上述目的,本发明提供如下技术方案:

3、一种基于sat的函数级源代码漏洞检测方法,包括如下步骤:

4、步骤1,源代码预处理

5、收集漏洞源代码数据,并对源代码进行规范化处理;

6、步骤2,pdg图生成

7、生成基于代码数据依赖和控制依赖的图结构表示pdg图;

8、步骤3,包含中心性信息的pdg向量图构建与数据集划分

9、使用句子嵌入的方式对pdg图中所有节点进行向量化处理,并为每个节点添加katz中心性信息;

10、步骤4,使用gnn结构提取节点k跳范围结构信息

11、使用图神经网络提取pdg图每个节点附近k跳范围内的结构信息,并聚合到该节点中;

12、步骤5,基于transformer的源代码漏洞检测模型构建与训练

13、使用rwpe对节点进行位置编码,使用transformer神经网络训练,得到漏洞检测模型,并进行漏洞检测。

14、进一步的,所述步骤1包括如下子步骤:

15、步骤1-1,搜集sard源代码漏洞数据集,搜集的代码数据集中包含若干漏洞函数和若干没有漏洞的函数;

16、步骤1-2,从数据集中提取漏洞代码标签;

17、步骤1-3,删除代码中的所有注释信息;

18、步骤1-4,将人为定义的变量名一对一映射到规范化定义的变量名;

19、步骤1-5,将人为定义的函数名一对一映射到规范化定义的函数名。

20、进一步的,所述步骤2包括如下子步骤:

21、步骤2-1,使用joern工具针对预处理后的源代码生成程序控制流图cfg;

22、步骤2-2,结合cfg图,使用python的networkx库与joern分析并提取源代码中的数据依赖与控制依赖关系;

23、步骤2-3,基于数据依赖与控制依赖关系生成pdg图,以.dot格式保存。

24、进一步的,所述步骤3包括如下子步骤:

25、步骤3-1,计算pdg图中每个节点的katz中心性;

26、步骤3-2,从pdg图中提取每个节点的代码内容,使用sent2vec算法将节点中的代码转换为向量表示;

27、步骤3-3,将向量表示结果与其katz中心性相乘,得到的结果作为pdg向量图的节点;一个pdg图中所有节点的katz中心性可以用矩阵形式表示为:

28、ck=αack+β

29、(i-α·a)ck=β

30、α是一个常数,ck∈rn表示包含所有节点的katz中心性的向量,a表示pdg图的邻接矩阵,β表示一个常数向量,i表示单位矩阵。

31、进一步的,所述步骤4包括如下子步骤:

32、步骤4-1,将代码数据集划分为训练集,验证集与测试集;

33、步骤4-2,对pdg向量图中每个节点,将其作为根节点提取其k跳范围内子图;

34、步骤4-3,针对子图,使用gnn提取子图结构信息。

35、进一步的,所述步骤4-3具体包括如下过程:

36、使用gnn提取子图结构信息的方式包括:采用k_subtree提取器和k_subgraph提取器;所述k_subtree提取器针对pdg图g中的某一节点u,以u为根节点,提取其k跳子树,并将gnn模型应用于该子树中,将u节点对应的输出作为u处的向量表示,g表示pdg图:

37、

38、所述k-subgraph提取器在k-subtree的基础上,调整gnn利用整个k子图,使用池化函数聚合k跳邻域内所有节点的更新节点表示;形式上,如果用nk(u)表示节点u包括自身的k-hop邻域,则节点u的表示为:

39、

40、本质上,k-subgraph gnn extractor相当于对u节点k跳范围每个节点使用k-subtree gnn extractor,将池化函数聚合结果作为该节点的新的向量表示。

41、进一步的,所述步骤5包括如下子步骤:

42、步骤5-1,使用rwpe算法对代码行位置进行编码;

43、步骤5-2,transformer结构构建与训练;

44、步骤5-3,使用训练好的模型对待检测源代码进行检测,预测待测程序是否含有漏洞。

45、进一步的,所述步骤5-2中transformer结构如下:

46、transformer结构包含自注意力结构和前馈神经网络结构;前馈神经网络是一个简单的mlp;在自注意力结构中,输入的节点特征集合x首先被映射为query(q),key(k),value(v);其中q=xwq,k=xwk,v=xwv;自注意力计算可以表示为:

47、

48、其中dout表示q的维度,wq,wk,wv是三个需要训练的权重;transformer使用多头注意力机制,根据上述公式使用不同权重将输入节点特征映射至低维,最后将多个上述公式的实例串联;

49、针对pdg图中每个节点xv,其自注意力计算过程用以下三个公式表示,其中,<·,·>表示二者之间的点积,v表示pdg图中的节点集合,exp(x)表示e^x,e为自然常数,x和x'代表pdg图中两个节点。

50、

51、

52、f(x)=wvx

53、将结构提取得到的节点向量表示作为transformer结构的q和w的输入,将每个节点的词嵌入的向量作为v的输入;可以得到每个节点的自注意力计算公式如下:

54、

55、其中φ(v,g)表示经过位置编码后的结构提取阶段节点v提取到的节点向量表示。

56、与现有技术相比,本发明具有如下优点和有益效果:

57、1.本发明通过训练正常代码与漏洞代码的pdg图,能够建立模型判断源代码中是否含有漏洞。能够提高漏洞检测的准确率和误报率。

58、2.本发明在代码的图结构表示中加入了节点的中心性信息,在神经网络中使用k_subtree提取代码的结构信息,使用rwpe保留代码行的顺序信息,使用结构感知transformer预测源代码中是否包含漏洞,能够在函数级漏洞检测中获得相比传统漏洞检测方法和现有的基于神经网络的漏洞检测方法更好的误报率和漏报率。

59、3.本发明对源代码做规范化处理,降低了程序员编程习惯对漏洞检测效果的影响。

60、4.本发明基于图神经网络与transformer神经网络,能够同时充分利用pdg图中的结构信息与代码行序列中的顺序信息。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1