一种基于多级目标关键路径的智能合约漏洞检测方法

未命名 08-02 阅读:106 评论:0


1.本发明属于区块链智能合约安全监测技术领域,具体涉及一种基于多级目标关键路径的智能合约漏洞检测方法。


背景技术:

2.近年来,以智能合约为代表的第二代区块链平台及应用出现了爆发性的增长,以其不可伪造、不可篡改、可溯源、去中心化等特性,对医疗保健、边缘计算、电力等领域已经产生深远影响。同时区块链本身也面临着严重的安全问题,与传统程序不同,智能合约部署之后就没有办法修改了,这会导致包括安全漏洞在内的所有漏洞都可见,并且无法迅速修复这些漏洞是网络攻击的完美目标。
3.面对智能合约中各种类型的漏洞,传统的漏洞检测方法应用静态和动态分析来查找智能合约中的漏洞,目前主要的智能合约漏洞检测方法有:人工审计、模式匹配、符号执行、形式化验证等。能完全覆盖代码执行期间的行为,从而消除了在传统测试手段中存在的无法穷举所有可能输入的缺点,同时保证在一定范围内的绝对正确性;缺点在于需要人工参与建模和推理过程,效率十分低下;模糊测试生成用例的随机性,其所能涵盖的执行路径有限,路径覆盖率低,很难发现潜在的漏洞;基于符号执行的静态漏洞检测工具多数依赖于已有的专家规则,无法识别复杂逻辑漏洞且误报率较高。
4.最近研究人员提出了基于机器学习与神经网络的智能合约漏洞检测方法,与传统的方法相比,机器学习与深度学习模型可以自动提取代码的特征,以摆脱对人工提取特征的依赖,更高效的捕捉漏洞特征,使检测准确率和效率更高。然而对于基于机器学习与神经网络的智能合约漏洞检测方法,如果检测一个较长智能合约时,会导致漏洞检测能力下降,存在较大的误差。比如当检测长代码时图神经网络需要依次遍历途中的每一个节点以获取他们的特征,导致时间复杂度较高,检测效率低。


技术实现要素:

5.为解决上述技术问题,本发明提出一种基于多级目标关键路径的智能合约漏洞检测方法,包括以下步骤:
6.s1:将开源数据集中的数据与爬取智能合约源代码组成的数据组成智能合约数据集,并对数据集中的数据进行预处理;
7.s2:使用智能合约在线编译器remix编译预处理后的数据集中的智能合约源代码生成操作码;
8.s3:为不同漏洞定义关键指令,并根据漏洞关键指令在操作码中快速找到可能存在漏洞的关键路径,根据关键路径生成关键路径合约图;
9.s4:将得到的关键路径合约图进行收缩;
10.s5:使用word2vec模型将收缩后的关键路径合约图的边与节点特征进行向量化表示,得到矩阵向量;
11.s6:建立基于分层图注意网络漏洞检测模型,将矩阵向量输入分层图注意力网络漏洞检测模型进行模型训练,当损失函数的损失最小时,完成模型的训练;
12.s7:将智能合约源码输入训练好的分层图注意力网络漏洞检测模型进行漏洞检测,得到检测结果。
13.本发明的有益效果:
14.(1)本发明针对处理上整数溢出漏洞、下整数溢出漏洞、交易顺序依赖漏洞、时间戳依赖漏洞和可重入漏洞这五种漏洞类型给出了关键操作码,基于这些关键操作码找到潜在漏洞的关键路径,仅对这些关键路径进行检测,提升检测效率。
15.(2)在寻找漏洞关键路径方面,本发明定义了一种多级目标关键路径搜索方法,分别查找每条可执行路径中的漏洞关键字和涉及地址的操作码关键字,标记处可能存在漏洞的关键路径。
16.(3)本发明引入了分层图注意力网络来检测智能合约漏洞,对比传统的智能合约漏洞检测方法,本发明不依赖固定的专家规则,实现了自动化审计;对比使用机器学习和神经网络的智能合约漏洞检测方法,本发明拥有更好的鲁棒性,提高了训练好的模型在其他类型的图上的泛化能力。
附图说明
17.图1为本发明的一种基于多级目标关键路径的智能合约漏洞检测方法的流程图;
18.图2为本发明的智能合约代码图。
具体实施方式
19.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
20.一种基于多级目标关键路径的智能合约漏洞检测方法,如图1所示,包括:
21.s1:将开源数据集中的数据与爬取智能合约源代码组成的数据组成智能合约数据集,并对数据集中的数据进行预处理;
22.s2:使用智能合约在线编译器remix编译预处理后的数据集中的智能合约源代码生成操作码;
23.s3:为不同漏洞定义关键指令,并根据漏洞关键指令在操作码中快速找到可能存在漏洞的关键路径,根据关键路径生成关键路径合约图;
24.所述关键路径合约图包括三种节点与三种边,三种节点包括主要节点、二级节点、回调节点,主要节点包括函数,二级节点包括变量,回调节点包括内部调用与外部调用,三种边包括数据流边、回调边、控制流边;
25.s4:将得到的关键路径合约图进行收缩;
26.s5:使用word2vec模型将收缩后的关键路径合约图的边与节点特征进行向量化表示,得到矩阵向量;
27.s6:建立基于分层图注意网络漏洞检测模型,并训练分层图注意力网络漏洞检测
模型;
28.s7:将智能合约源码输入训练好的分层图注意力网络漏洞检测模型进行漏洞检测,得到检测结果。
29.然后使用smartbugs wild数据集和爬取的智能合约共同作为数据集。因为smartbugs wild数据集中有漏洞的智能合约样本数据分布不均匀,如果使用这样的数据集会导致过拟合。因此利用python爬虫技术,爬取swc智能合约漏洞库和以太坊官网etherscan的智能合约共计25138份,与smartbugs wild数据集结合组成新的数据集,保证数据集中各种漏洞数量的分布是合理的。
30.对智能合约数据集中的数据进行针对性的处理,定义数据集清洗规则,编写数据集清洗脚本,删除智能合约数据集存在的冗余数据、重复数据以及空缺数据;
31.将针对性处理后的智能合约数据规定为一个长为n的字符串,若不包含漏洞,则返回一个长度为n的全部为0的字符串,若包含漏洞,则字符串对应漏洞索引的位置i为1,其余字符串对应索引位置为0,其中1≤i≤n;一个智能合约样本可能包含n种漏洞的任意一种或几种;例如:现存4种漏洞v1,v2,v3,v4,若不包含漏洞,则标记0000;若包含v2漏洞,则标记0100;若包含v2,v4漏洞,则标记为0101。
32.借助oyente合约漏洞检测工具对存在漏洞的智能合约数据进行分类打标,例如含有可重入漏洞的智能合约标签为1;含有时间戳依赖漏洞的智能合约标签为2;含有交易顺序依赖漏洞的智能合约标签为3;含有整数上溢出漏洞的智能合约标签为4;含有整数下溢出漏洞的智能合约标签为5;将数据分为可重入漏洞、时间戳依赖漏洞、交易顺序依赖漏洞、整数上溢出和整数下溢出漏洞五种类别。
33.带有标签的智能合约样本集进行编译,使用智能合约在线编译器remix编译智能合约源码,生成操作码。使用在线编译器remix编译智能合约源代码的目的有两个:一是确保智能合约没有任何语法错误,代码可以运行;二是智能合约源代码编译之后生成字节码文件,方便构建语义图。
34.所述关键路径搜索过程:
35.确定操作码依赖关系阶段:得到智能合约操作码后,需要将操作码分为一个个基本块,通过组合这些基本块,找到操作码之间的依赖关系;具体步骤为:(1)从智能合约函数入口点(如function关键字所在位置)开始遍历操作码,按照操作码的执行顺序构建基本块,每个基本块的第一个操作码为入口点,最后一个操作码为跳转语句或者函数返回语句;(2)在遍历操作码的过程中,记录每个基本块的入口地址和出口地址,入口地址为基本块第一个操作码的地址,出口地址为基本块最后一个操作码的下一个地址,如果基本块最后一个操作码是跳转语句,则该基本块跳转到栈顶push的地址继续执行;(3)在遍历操作码的过程中,记录跳转语句的地址和跳转目标地址之间的关系。如果跳转目标地址在当前基本块内部,则标记该跳转语句为内部跳转,否则标记为外部跳转。(4)对于所有的内部跳转,将跳转语句所在的基本块和跳转目标地址所在的基本块连接起来,对于所有的外部跳转,将跳转语句所在的基本块和一个新的基本块连接起来,新的基本块只包含跳转目标地址所在的操作码;(5)最后得到的每个基本块可以看作一个基本的控制流单元,是漏洞关键路径分析的基础。
36.生成控制流图阶段:在基本块和边添加控制流信息,基于基本块之间的依赖关系
生成控制流图;具体步骤为:(1)根据条件转移操作码创建分支,如果操作码之间存在条件分支,则将其转换为两个基本块,其中一个基本块代表条件分支为真的情况,另一个代表条件分支为假的情况,这样可以在后续处理中更容易地分析和操作分支逻辑;(2)将异常处理转换为基本块,对于每个可能引发异常的操作码,将其所在的基本块与一个异常处理块相连;(3)创建控制流图,根据基本块之间的依赖关系,创建控制流图,基本块之间的依赖关系可以通过条件转移操作码和异常处理操作码进行识别。
37.带有标签的智能合约样本集抽象为图表示,根据每个智能合约源代码的上下文的复杂逻辑、控制流与数据流,生成智能合约代码语义图。如图2所示的源代码为带有上整数溢出漏洞的智能合约,图中不同的节点表示关键的函数调用或变量,而边捕捉它们的时间执行轨迹。
38.关键路径搜索阶段:根据控制流图遍历搜索存在漏洞操作指令的基本块节点,以该节点为漏洞节点依次遍历并标记该节点的后续执行路径,包含漏洞节点的路径全部为可能存在漏洞的关键路径;
39.路径剪枝阶段:对控制流图中与关键路径无关节点进行裁剪,得到只存在漏洞操作指令的节点,将其存放到关键节点的队列中。在确定可能存在漏洞的关键路径后,图中还存在许多与漏洞不相关的节点,需要对这些无关节点进行剪枝,使模型只关注与漏洞相关的节点和边,提高特征提取的精度。因此,还需要对控制流图中无关节点裁剪,减少无关节点的输入。具体剪枝流程为:首先,从根节点开始遍历,找到存在漏洞操作指令的节点,将其作为剪枝后的节点加入到存放关键节点的队列中。最后,按照基本块之间的跳转关系将关键节点的子节点加入到队列中,直到遍历结束。例如,存在漏洞操作指令的节点包含if判断语句,则不论if语句是否成立,都要将该漏洞操作指令节点之后子节点加入到关键节点队列中。对于不包含漏洞操作指令的节点,依次遍历其孩子节点查找是否存在其它漏洞操作指令的节点,以此达到对不必要的节点进行剪枝的目的。
40.根据关键路径生成关键路径合约图,包括:
41.根据关键路径节点生成关键路径合约图scg=(v,e),其中,v表示节点集,图中包含三种节点与三种边,三种节点包括主要节点、二级节点、回调节点,主要节点为以函数为入口的基本块节点,回调节点为基本块跳转或调用其他基本块的节点,二级节点为没有发生跳转正常顺序执行的基本块节点;三种边包括数据流边、回调边、控制流边,节点包含变量调用、函数调用、数据流等特征;e表示边集,每条边为一个三元组ei=(vi,vj,islink),vi,vj表示节点i和节点j,islink表示节点i和节点j是否相连,边描述了合约中数据流和控制流的传输过程,同时体现出变量传递和函数调用。
42.对关键路径合约图进行收缩,包括:
43.将关键路径合约图中的二级节点s、回调节点c的特征传递给其相邻的主要节点f,最终只保留主要节点,记为节点xi,得到收缩后的关键路径合约图scgi=(xi,e)。
44.使用word2vec模型将收缩后的关键路径合约图的边与节点特征进行向量化表示,包括:
45.将收缩后的关键路径合约图的节点特征进行分词,利用word2vec对分词进行转换,得到每个单词的相应向量,将得到的多个向量使用求和的方式进行融合,得到图中每个节点的向量表达,并组成特征矩阵。
46.word2vec不能直接识别图节点,因此将图节点转换为向量的方法是先将图节点表示为分词,然后再使用word2vec进行转换。具体来说,首先要对图节点的特征以及它的临近节点的特征进行分词,然后利用word2vec对分词进行转换,得到每个单词的相应向量,最后可以将得到的多个向量使用求和或者其它组合操作进行融合,得到图中每个节点的向量表达,转化为矩阵向量。将节点特征表示为其中n表示节点的数量,t为模型的输入。
47.所述分层图注意力网络漏洞检测模型,包括:
48.分层图注意力网络漏洞检测模型包括:图嵌入层、语句层、函数层、全连接层、softmax层、漏洞分类层;通过图嵌入层嵌入源码,并保留源码的层次结构,通过语句层对嵌入的源码进行不同层级的语义特征捕获,函数层根据学习不同层级的语义特征对检测漏洞贡献不同的语句权重,通过全连接层加权融合学习到句子的表示,得到合约表示,通过softmax层进行对合约表示进行分类预测。
49.将特征矩阵作为输入,假设一张合约收缩图有n个节点,输入图注意力网络的特征向量矩阵表示为:
[0050][0051]
式中,t为输入到图注意力网络的特征向量矩阵;为第i个节点的特征向量;n为节点个数;t为节点特征的个数。
[0052]
在语句层中,只针对函数内部的语句逻辑进行特征提取与学习,主要包含函数内部的顺序流和控制流等特征,最后输出的所有节点特征表示为:
[0053][0054]
式中,t'为新的节点特征向量维度。
[0055]
对于合约收缩图中每个收缩节点xi都会学习邻居节点的重要性权重,为了获得充分的表达能力来学习注意力权重,在此过程中需要一个可学习的线性变换ω实现特征增强。设将输入特征转化为输出特征的权重矩阵ω,则计算节点j在节点i上注意力系数的计算公式如下:
[0056][0057]
式中,e
ij
为注意力系数,表示节点j对节点i的重要性;α为单层前馈神经网络。
[0058]
之后使用leakyrelu激活函数对其进行特征提取。计算公式如下:
[0059][0060]
式中,α
t
为α的转置;||为拼接操作。
[0061]
求出每个收缩节点xi所有邻接节点的注意力值后,使用softmax函数对注意力权重进行归一化处理。计算语句级别的注意力权重的公式如下:
[0062][0063]
式中,α
ij
为在e
ij
的基础上进行归一化后的注意力系数。
[0064]
智能合约漏洞大多都发生在回调函数中,但这些回调函数可能不是在其上下文被调用的。在函数层中,只关注函数之间的调用关系,函数层的输入为语句层的输出拼接上函数调用流的特征向量,计算函数级别的注意力权重的公式如下:
[0065][0066]
之后同样使用softmax函数进行归一化处理,计算公式如下:
[0067]
β
ij
=softmax(n
ij
)
[0068]
通过两层注意力网络,将每个节点的特征向量按照其权重系数进行加权求和,得到一个加权向量表示整个图的特征,计算公式如下:
[0069][0070]
式中,σ为非线性激活函数leakyrelu;β
ij
为节点i与相邻节点j的注意力相关系数;ω为特征相乘的权重矩阵。
[0071]
本模型中使用多头注意力网络,独立计算k组注意力系数后进行平均,防止过拟合,模型最终的输出计算公式如下:
[0072][0073]
式中,k为共进行k次注意力运算;k为第k次注意力运算;ωk为第k次注意力运算下输入特征的线性变换权重矩阵表示。
[0074]
所述分层图注意力网络漏洞检测模型进行训练的损失函数,包括:
[0075][0076]
其中,n为节点的数量;yi为第i个节点的真实标签;为第i个节点的预测标签。
[0077]
将智能合约源码输入训练好的分层图注意力网络漏洞检测模型进行漏洞检测,得到检测结果,包括:
[0078]
将智能合约源代码作为输入,先根据合约图的转换规则将智能合约源代码转换为合约图,并生成特征向量,根据word2vec进行分词,得到图中每个节点的向量表达,根据节点的向量表达通过加权融合学习到句子的表示,得到合约表示,对合约表示进行分类预测,得到分类结果,分层图注意力网络漏洞检测根据分类结果判断检测的智能合约是否存在漏洞以及存在哪种漏洞,并将分类结果输出。
[0079]
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。

技术特征:
1.一种基于多级目标关键路径的智能合约漏洞检测方法,其特征在于,包括:s1:将开源数据集中的数据与爬取智能合约源代码组成的数据组成智能合约数据集,并对数据集中的数据进行预处理;s2:使用智能合约在线编译器remix编译预处理后的数据集中的智能合约源代码生成操作码;s3:为不同漏洞定义关键指令,并根据漏洞关键指令在操作码中快速找到可能存在漏洞的关键路径,根据关键路径生成关键路径合约图;s4:将得到的关键路径合约图进行收缩;s5:使用word2vec模型将收缩后的关键路径合约图的边与节点特征进行向量化表示,得到矩阵向量;s6:建立基于分层图注意网络漏洞检测模型,将矩阵向量输入分层图注意力网络漏洞检测模型进行模型训练,当损失函数的损失最小时,完成模型的训练;s7:将智能合约源码输入训练好的分层图注意力网络漏洞检测模型进行漏洞检测,得到检测结果。2.根据权利要求1所述的一种基于多级目标关键路径的智能合约漏洞检测方法,其特征在于,对数据集中的数据进行预处理,包括:对智能合约数据集中的数据进行针对性的处理,定义数据集清洗规则,编写数据集清洗脚本,删除智能合约数据集存在的冗余数据、重复数据以及空缺数据;将针对性处理后的智能合约数据规定为一个长为n的字符串,若不包含漏洞,则返回一个长度为n的全部为0的字符串,若包含漏洞,则字符串对应漏洞索引的位置i为1,其余字符串对应索引位置为0;借助oyente合约漏洞检测工具对存在漏洞的智能合约数据进行分类打标,将数据分为可重入漏洞、时间戳依赖漏洞、交易顺序依赖漏洞、整数上溢出和整数下溢出漏洞五种类别。3.根据权利要求1所述的一种基于多级目标关键路径的智能合约漏洞检测方法,其特征在于,所述关键路径搜索过程,包括:确定操作码依赖关系阶段:得到智能合约操作码后,将操作码分解为基本块,通过组合这些基本块,找到操作码之间的依赖关系;生成控制流图阶段:在基本块和边添加控制流信息,基于基本块之间的依赖关系生成控制流图;关键路径搜索阶段:根据控制流图遍历搜索存在漏洞操作指令的基本块节点,以该节点为漏洞节点依次遍历并标记该节点的后续执行路径,包含漏洞节点的路径全部为可能存在漏洞的关键路径;路径剪枝阶段:对控制流图中与关键路径无关节点进行裁剪,得到只存在漏洞操作指令的节点,将其存放到关键节点的队列中。4.根据权利要求1所述的一种基于多级目标关键路径的智能合约漏洞检测方法,其特征在于,根据关键路径生成关键路径合约图,包括:根据关键路径节点生成关键路径合约图scg=(v,e),其中,v表示节点集,图中包含三种节点与三种边,三种节点包括主要节点、二级节点、回调节点,主要节点为以函数为入口
的基本块节点,回调节点为基本块跳转或调用其他基本块的节点,二级节点为没有发生跳转正常顺序执行的基本块节点;三种边包括数据流边、回调边、控制流边,节点包含变量调用、函数调用、数据流等特征;e表示边集,每条边为一个三元组e
i
=(v
i
,v
j
,islink),v
i
,v
j
表示节点i和节点j,islink表示节点i和节点j是否相连,边描述了合约中数据流和控制流的传输过程,同时体现出变量传递和函数调用。5.根据权利要求1所述的一种基于多级目标关键路径的智能合约漏洞检测方法,其特征在于,对关键路径合约图进行收缩,包括:将关键路径合约图中的二级节点s、回调节点c的特征传递给其相邻的主要节点f,最终只保留主要节点,记为节点x
i
,得到收缩后的关键路径合约图scg
i
=(x
i
,e)。6.根据权利要求1所述的一种基于多级目标关键路径的智能合约漏洞检测方法,其特征在于,使用word2vec模型将收缩后的关键路径合约图的边与节点特征进行向量化表示,包括:将收缩后的关键路径合约图的节点特征进行分词,利用word2vec对分词进行转换,得到每个单词的相应向量,将得到的多个向量使用求和的方式进行融合,得到图中每个节点的向量表达,并组成特征矩阵。7.根据权利要求1所述的一种基于多级目标关键路径的智能合约漏洞检测方法,其特征在于,所述分层图注意力网络漏洞检测模型,包括:分层图注意力网络漏洞检测模型包括:图嵌入层、语句层、函数层、全连接层、softmax层、漏洞分类层;通过图嵌入层嵌入源码,并保留源码的层次结构,通过语句层对嵌入的源码进行不同层级的语义特征捕获,函数层根据学习不同层级的语义特征对检测漏洞贡献不同的语句权重,通过全连接层加权融合学习到句子的表示,得到合约表示,通过softmax层进行对合约表示进行分类预测。8.根据权利要求1所述的一种基于多级目标关键路径的智能合约漏洞检测方法,其特征在于,所述分层图注意力网络漏洞检测模型进行训练的损失函数,包括:其中,n为节点的数量;y
i
为第i个节点的真实标签;为第i个节点的预测标签。

技术总结
本发明属于区块链智能合约安全检测技术领域,具体涉及一种基于多级目标关键路径的智能合约漏洞检测方法,包括:爬取智能合约源码数据并对数据进行预处理,编译智能合约源码,根据漏洞操作码指令搜索包含漏洞特征的关键路径;生成合约图,提取图节点特征,创建图嵌入模型并训练漏洞检测模型,使用训练好的模型检测智能合约漏洞,得到检测结果。采用分层图注意网络的漏洞检测方法能够自动学习潜在的智能合约漏洞特征或表示,分析在复杂逻辑中的语义和语法信息,更好的实现对智能合约漏洞检测分析。分析。分析。


技术研发人员:马创 刘帅武 胡锦浩 冉鑫 颜莉 曾伟
受保护的技术使用者:重庆邮电大学
技术研发日:2023.04.23
技术公布日:2023/8/1
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐