《HyVulDect: A hybrid semantic vulnerability mining system based ongraph neural network》阅读笔记

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

1.相关知识

1.1 污点分析技术

1.1.1 基本原理

定义:污点分析可以抽象为一个 三元组 的形式,其中

  • sources:污点源,代表直接引入不受信任的数据或机密数据到系统中
  • sink:污点汇聚点,代表直接产生安全敏感操作(违反数据完整性)或泄露隐私数据到外界(违反数据保密性)
  • sanitizer:无害处理,代表通过数据加密或者溢出危害操作等手段使数据传播不在对软件系统的信息产生危害

污点分析就是分析程序中由污点源引入的数据是否能够不经无害处理,而直接传播到污点汇聚点。如果不能,则说明信息流是安全的,否则就说明系统产生了隐私数据泄露或危险数据操作等安全问题

​ 在漏洞分析中,使用污点分析技术将所感兴趣的数据(通常来自程序的外部输入,嘉定所有的输入都是危险的)标记为污点数据,然后通过跟踪和污点数据相关的信息的流向,可以知道他们是否会影响某些关键的程序操作,进而挖掘程序漏洞。即将程序是否存在某种漏洞的问题转换为污点信息是否会被Sink点上的操作所使用的问题

​ 污点分析的常用操作:

  • 识别污点数据在程序中的污点源(Source点)并对污点信息进行标记(根据所分析的系统的不同使用定制的标记策略)

  • 污点传播分析(利用特定的规则跟踪分析污点信息在程序中的传播过程)

  • 漏洞检测、无害处理(在一些关键的程序点,即Sink点,检测关键的操作是否会受到污点信息的影响)

《HyVulDect: A hybrid semantic vulnerability mining system based ongraph neural network》阅读笔记_第1张图片

1.1.2 识别污点源(Source)和汇聚点(Sink)

​ 识别污点源和汇聚点是污点分析的前提,在不同应用程序中识别污点源和汇聚点的方法各不相同,缺乏通用方法的原因之一是来自系统模型、编程语言之间的差异,现有的识别污点源和汇聚点的方法大致可以分为三类:

  • 使用启发式的策略进行标记,例如把来自程序外部输入的数据统称为"污点"数据,保守地认为这些数据有可能包含恶意的攻击数据
  • 根据具体的应用程序调用的API或者重要的数据类型,手工标记源和汇聚点
  • 使用统计或者机器学习技术自动地识别和标记污点源和汇聚点

1.1.3 污点传播分析

​ 污点传播分析就是分析污点标记数据在程序中的传播途径,按照分析过程中关注的程序依赖关系的不同,可以将污点传播分析分为显示流分析和隐式流分析

  • 显示流分析:分析污点标记如何随程序中变量之间的数据依赖关系传播
  • 隐式流分析:分析污点标记如何随程序中变量之间的控制依赖关系传播,也就是分析污点标记如何从条件指令传播到其所控制的语句

1.1.4 无害处理

​ 无害处理模块是指污点数据经过该模块处理后,数据本身不再携带敏感信息或者针对该数据的操作不会再对系统产生危害,正确地使用无害处理可以降低系统中污点标记的数量,提高污点分析的效率,并且避免由于污点扩散导致的分析结果不精确的问题

1.2 启发式算法

​ 启发式算法(Heuristics Algorithm)是一种技术,该技术使得在可接受的计算成本内去搜寻最好的解,但不一定能够保证所得的可行解和最优解,甚至在多数情况下,无法阐述所得解同最优解的近似程度

​ 一个容易理解的解释:人在解决问题时所采取的一种根据经验规则进行发现的方法,其特点是在解决问题时,利用过去的经验,选择已经行之有效的方法,而不是系统地、以确定的步骤去寻求答案

​ 启发式解决问题的方法是与算法相对立的,算法是把各种可能性都一一尝试,最终能找到问题的答案,但是在很大问题的空间内,它会花费大量时间和经历才能寻求答案;但是启发式方法则是在有限的搜索空间内,大大减少尝试的数量,可以迅速地达到问题的解决,但是该方法具有尝试错误的特点,所以也有失败的可能性

​ 启发式算法常用于解决NP-Hard问题,其中NP是指非确定性多项式

​ 目前常用的启发式算法一般有:模拟退火算法(SA)、遗传算法(GA)、蚁群算法(ACO)、人工神经网络(ANN)等

1.3 Word2Vec技术

1.3.1 基本概念

词嵌入:将词汇映射到数学空间的过程称为词嵌入,最简单的词嵌入是one-hot,但很难表达相似度,通过分布式表示来表示词嵌入,Word2vec就是其中一种

​ 在自然语言处理中,我们词嵌入后的表达形式,称为词向量,one-hot就是词向量的一种表达方式,但是one-hot会带来很多问题:1、维度太大 2、词向量的每个维度都是离散的 3、词向量的表示都是局部的,正是因为维度表示的离散化的局部化,造成了向量之间的相似度很难表达,所以我们使用了其他嵌入方式来表示词向量——分布式表示

Word2vec就是一个典型的分布式表示方法,作用就是将自然语言中的字词装换为计算机可以理解的稠密向量(Dense vector),在Word2vec出现之前,自然语言处理经常把字词转为离散的单独的符号,就是onr-hot Encoder

1.3.2 分类

Word2vec主要分为CBOW(Continuous Bag of Words)Skip-Gram两种模式,其中CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测原始语句

1.4 GNN(图神经网络)

1.4.1 基本概念

不动点理论

GNN的理论基础是不动点理论,这里的不动点理论专指巴拿赫不动点理论(Banach's Fixed Point Theorem)

​ 定义:巴拿赫不动点定理,又称为压缩映射定理或压缩映射原理,是度量空间理论的一个重要工具,它保证了度量空间的一定自映射的不动点的存在和唯一性,并提供了求出这些不动点的构造方法

​ 定理内容:设 (X,d) 为非空的完备度量空间,设 T: X → x为 X 上的一个压缩映射,也就是说,存在一个非负的实数 q < 1 ,使得对于所有 X 内的 x 和 y,都有 d(T(x), T(y)) ≤ q · d(x, y)

​ 那么映射T在X内有且只有一个不动点x(这就是说,Tx=x)。更进一步,这个不动点可以用以下的方法来求出:从X内的任意一个元素x0开始,并定义一个迭代序列xn=Txn-1,对于n= 1,2,3,……。这个序列收敛,且极限为x

压缩映射

​ 定义:设(X, ρ)为距离空间,T是X 到 X中的映射,如果存在数a (0

1.4.2 GNN的训练流程

《HyVulDect: A hybrid semantic vulnerability mining system based ongraph neural network》阅读笔记_第2张图片

​ 从将图输入到GNN中到得到输出结果 主要可以分为两步:第一步是传播(propagation)过程,即节点表示随时间的更新过程;第二步是输出(output)过程,即根据最终的节点表示得到目标输出(如每个节点的类别)的过程。在这两步中,传播过程要更为重要,其设计也要受到一定的约束(要保证整个图上的状态映射是一个压缩映射(contraction map))。在展开图中,传播过程对应于从t0 到 T 的更新过程(注意,T 并不是确定的,而是对应于整个图的状态到达不动点的时刻),不同时间步的连接则由图中的连接来决定(可以是有向的,也可以是无向的

1.4.3 门控图神经网络

​ 门控图神经网络是在图神经网络的基础上,引入了"门",如GRULSTM,旨在改善图结构信息的长期以来性,同时引入了边缘信息

1.5 各种源代码表示方法

​ 源代码不能直接输入到图神经网络中,所以需要先将源代码转换为可表达漏洞特征的向量,但在这过程中,我们保留源代码数据中的一些语义信息(例如数据依赖性和控制依赖性),通常还需要引入一个中间表示来作为源代码和向量表示之间的过渡,这些中间表示可以让我们更加直观的了解到代码中数据的走向以及逻辑关系等,常见的表示方法有以下几种:

令牌序列表示

​ 该方式将源代码视为纯文本,首先使用词法分析来扫描源文件,在这个过程中,字符流被分成 Token ,一般来说,编程语言中常见的 Token 是:常量(整数、小数、字符、字符串等。)、运算符(算术运算符、比较运算符、逻辑运算符)、分隔符(逗号、分号、括号等)。)、保留字、标识符(变量名、函数名、类名等。),等等

抽象语法树(AST)

​ 该方式是源代码的有序树表示,通常,代码分析器用它来理解程序的基本结构,并在表示的第一步检查语法错误,从根节点开始,代码被分成块、语句、声明、表达式等,最终形成叶结点的 Token

控制流图(CFG)

​ 该方式描述了执行过程中可能经过的路径,在CFG中,节点代表语句和条件,。它用图的形式表示一个过程内所有基本块执行的可能流向, 也能反映一个过程的实时执行过程

程序依赖图(PDG)

​ 程序依赖图(Program Dependence Graph)是程序的一种图形表示,它是带有标记的有向多重图。程序依赖图能够表示程序的控制依赖和数据依赖关系,因此,它由(数据依赖图)DDG和(控制依赖图)CDG组成

代码属性图(CPG)

​ 在联合数据结构中结合了抽象语法树、控制流图和程序依赖图的特征,可以结合多种表示法的优点。AST将源代码中的所有标记和谓词表示为一个节点,这个节点比CFGPDG还要细分。因此,以AST为主体,集成控制和数据依赖,形成代码属性图

2.论文思维导图

3.论文详解

3.1 摘要

​ 近年来,软件程序趋于庞大和复杂,软件已经成为现代社会的基础设施,但软件安全问题也不容忽视。软件漏洞已经成为威胁计算机安全的主要因素之一。利用源代码漏洞发动攻击的案例数不胜数。与此同时,开源软件的发展使得源代码漏洞检测变得越来越重要。传统的漏洞挖掘方法存在较高的误报率和漏报率,已经不能满足复杂软件的安全分析需求。针对存在的问题,提出了一种基于混合语义的图神经网络漏洞挖掘系统hyvulDect,该系统根据漏洞产生的原因构造了一种复合语义码属性图进行代码表示。采用门控图神经网络提取深度语义信息。由于大多数漏洞与数据流相关,我们使用污染分析提取污染传播链使用BiLSTM模型提取上下文的令牌级特征,最后使用分类器对融合特征进行分类。我们引入了一种双重关注机制,允许模型关注漏洞相关的代码,使其更适合于漏洞挖掘任务。实验结果表明,hyvuldect算法在基准数据集上的准确率达到92%,优于现有方法。与基于规则的静态挖掘工具FlawfinderRATSCppcheck相比,它具有更好的性能,能够有效地检测出实际的CVE源代码漏洞

3.2 贡献

背景:现有的软件趋于大型化和复杂化,项目的代码量急剧增加。单纯使用人工审计代码的成本非常高,发现触发条件复杂的漏洞是困难的;

​ 基于传统机器学习的方法需要人工提取漏洞特征,依赖大量的专家知识。基于深度学习方法(Lin et al., 2020),将源代码视为自然语言序列,利用现有的自然语言处理方法进行特征表示,总结出漏洞的特征,用于检测和分类。这些方法可以有效地在源代码中捕获源中漏洞触发的上下文信息。然而,没有考虑源代码的结构特征,此外,许多语义信息在代码表示中丢失

​ 图神经网络可以处理代码图表示等非欧几里得数据,但现有方法将源代码表示为ASTCFG,缺乏源代码的数据依赖信息,不利于漏洞检测。同时,直接使用程序源代码作为图形神经网络的输入会引入大量冗余代码,不利于模型的学习

​ 我们提出了一个基于混合语义的图神经网络漏洞挖掘系统HyVulDect。该系统结合了源代码图级特征和污点传播链令牌级特征用于漏洞检测。首先,对源代码进行预处理并表示为复合语义代码属性图,然后使用具有多头注意机制的门控图神经网络提取深层语义和结构信息。同时,通过污点分析方法提取源代码中的源->宿污点传播链并表示为标记,通过具有自关注机制的**BILSTM提取语法和上下文信息**。最后,融合图级和标记级特征,使用XG- boost分类器进行分类。该方法不仅能更全面地提取源代码中丰富的语义信息,还能关注代码上下文信息,具有更好的检测能力

贡献如下

  • 我们提出了一个基于混合语义的图神经网络漏洞挖掘系统,该系统利用具有双注意机制的门控图神经网络和BiLSTM网络来提取源代码图级和令牌级特征。融合两个维度的深层特征可以有效地用于检测漏洞

  • 我们改进了基于API调用的程序切片算法通过补充程序切片的结构,在提取漏洞上下文信息的同时保留代码的结构信息

  • 基于该设计方案的实验表明,HyVulDect检测性能优于传统静态扫描工具。与最先进的探测器相比,DevignVUDDYBGNN4VD的精度分别提高了27.6%、14.2%和4.9%。同时它能有效地检测存在的CVE漏洞

3.3 实现过程

​ 基于混合语义的图神经网络漏洞检测系统:HyVulDect,其整体架构如下图所示:

《HyVulDect: A hybrid semantic vulnerability mining system based ongraph neural network》阅读笔记_第3张图片

在该系统中,主要分为了三个部分:

1、源代码图级特征提取(Source code graph-level features extraction):首先源代码表示为包含多种语义信息的联合图CPG,然后使用门控图神经网络提取源代码的图级特征

2、污点传播链的令牌级特征提取(Tokens-level features extraction of taint propagation chain):通过污点分析提取源代码中的污点传播链,然后使用带有自关注机制的BiLSTM算法来提取令牌级特征

3、分类模块(Classifier):融合前两部分所提取的源代码特征,使用预先训练好的XG-boost分类模型进行漏洞分类

3.3.1 源代码图级特征提取

预处理

​ 为了简化代码,准确定位引起漏洞的代码行,我们首先要对代码进行预处理

1、确定危险函数:漏洞形成的根本原因是外部输入没有经过正确的处理,从而进入了危险函数,所以我们要对危险函数进行定位,然后根据危险函数中所传入的参数来回溯所有与之相关的代码行,然后将这些代码按照执行顺序重新组织。在处理函数的过程中,有一些用户自定义的函数和变量,为了统一化,在这里对这些自定义函数进行了函数名和变量名的修改——统一将自定义函数名改为func_N,将自定义的变量名改为var_N,其中N为正整数(0,1,2,3,·····)

2、程序片的补充

关于程序切片的相关知识可以参考文章:程序切片知识点整理(程序依赖图、静态切片、动态切片)

​ 在该步骤中,由于前面的操作提取了与漏洞相关的代码行,使得代码更加简介易于分析,但是源代码的结构也不再完整,所以该步骤主要是为了补充源代码的结构信息。

​ 在解析源代码时,提取代码中的用户自定义函数和控制块,以补充切片代码。完成切片后,首先,从上到下扫描代码切片。如果该行代码是自定义函数,则在该行下面加上结构代码“{”,继续向下扫描,直到遇到一行不属于自定义函数的代码,在它前面加上“}”,就完成了一个函数结构的补充。在这样的过程中,所遵循的原则为:先完成函数结构,再完成控制结构。切片补充的算法伪代码如下所示:

《HyVulDect: A hybrid semantic vulnerability mining system based ongraph neural network》阅读笔记_第4张图片

3、形成图形数据

​ 使用了Joern工具来将源代码解析为图形数据,该工具是一个C/C++代码分析工具。主要功能是从源代码、控制流图和程序依赖关系、代码属性图中生成抽象语法树,并将它们存储在图形数据库neo4j中。在这个过程中,我们对其进行了一点改进:我们发现Joern生成的CPG中的两个节点同时包含控制流边和它们之间的数据相关边,我们将其合并为一条新边作为CAD。生成CPG后,使用DGL算法来构造图形数据,其算法如下图所示:

《HyVulDect: A hybrid semantic vulnerability mining system based ongraph neural network》阅读笔记_第5张图片

​ 对于图中的节点和边特征,我们使用预先训练好的**Word2vec**模型进行矢量化

特征提取

下图展示了详细的特征提取过程:

《HyVulDect: A hybrid semantic vulnerability mining system based ongraph neural network》阅读笔记_第6张图片

1、Embeddings:该过程使用了门控图卷积层提取了一些底层特性,然后引入归一化层,使得较大的学习速率对于帝都传播更加稳定,增加了网络的泛化能力

2、Conv1:这个过程使用sigmod函数作为激活函数

3、Attention:该过程引入了注意力机制,用于对相邻结点进行加权求和,并计算每个节点的隐藏状态,而多头机制用于将模型分成多个头部,形成多个子空间,使得不同的头部可以关注不同方面的信息,这有助于模型捕捉更丰富的特征信息

4、Conv2:该过程使用了ReLu函数作为激活函数

5、经过一层Dropout,断开 30% 的神经网络,减小模型规模,同时提高模型的收敛速度

6、Mean Node:叠加一层图形卷积层,提取最高层的特征得到最终特征

3.3.2 污点传播链的令牌级特征提取

​ 污点分析可以跟踪和分析程序中的污点信息流,我们使用跟踪变量来分析污染信息流,并使用队列来记录污染变量。

预处理

​ 该步骤和源代码的图级特征提取的预处理一样,包括其中的命名统一化,使用Word2vec预训练模型进行矢量化,发现发现91.4%的源代码污点传播链令牌数不超过800。因此,选择了800作为所有向量的阈值

特征提取

​ 主要方法是使用BiLSTM模型进行令牌级特征提取,其中BiLSTM是向前LSTM和向后LSTM的结合,可以学习序列化和长期依赖的特征,并捕捉序列之间的隐式依赖

​ 1、在嵌入层将令牌序列表示为矩阵。

​ 2、BiLSTM层接收矩阵作为输入,学习记号之间的深层联系,并输出记号的中间表示。

​ 3、添加关注层可以使模型更加关注与漏洞相关的令牌。关注层接收代码的隐藏表示作为输入,然后初始化三个矩阵WqWkWv,将上层输出转换为Q,K,V,从而获得代码的深层表示。

​ 4、加入Dropout层来随机断开一些神经元以降低模型复杂度,增强模型的泛化能力并防止过拟合,并加入密集层来匹配前一层神经网络。添加归一化层以解决梯度消失和爆炸问题。接下来,

​ 5、使用ReLu函数激活神经元,并再次通过Dropout层和密集层。最后得到令牌级的深度特征

3.3.3 漏洞分类

​ 在该步骤我们将上述得到的源代码图级特征和污点传播链的令牌级特征串联起来得到最终的源代码特征。基于CPG的图级特征包含源代码数据依赖、控制依赖和其他语义信息。基于污点分析的标记级特征包含源代码漏洞上下文语义信息和代码序列语法信息。最终获得的特征结合了代码的结构、句法和语义信息,并且可以覆盖多种类型的漏洞

​ 漏洞分类的过程中主要使用的是XGBoost算法,该算法本质上是GBDT算法,在通过特征分裂来持续生长一棵树的过程中,每一轮学习一棵树的过程都将预测值与上一轮模型的实际值之间的残差进行匹配。当训练完成得到k棵树时,要预测一个样本的得分,根据这个样本的特征,在每棵树中都会落到一个对应的叶节点上,每个叶都对应一个分数,最后将每棵树对应的分数加起来就是这个样本的预测值。

你可能感兴趣的:(论文笔记,安全,算法)