基于图神经网络的智能合约用户权限异常漏洞检测方法与流程



1.本发明涉及智能合约技术领域,具体为基于图神经网络的智能合约用户权限异常漏洞检测方法。


背景技术:



2.智能合约作为区块链2.0的核心技术,本质上是用户发布到区块链上的可运行的代码,拓展了区块链的应用场景,使得区块链可以应用在诸如供应链、智慧医疗、法律存证、智慧教育等领域。在这些领域的应用依赖于用户与智能合约的交互,作为涉及大量用户角的场景,智能合约用户的权限控制非常重要。以物流供应链为例,供应商、物流公司、收货商分别为三个在物流供应链场景中的关键角,供应商应当有记录供货内容的权限,而物流公司应当有记录收到货物内容和物流轨迹的权限,收货商应当有记录收到货物内容的权限;一旦智能合约权限控制出现漏洞,使得收货商可以更改供应商记录内容的权限,就会导致各种问题。因此,在智能合约发布前,开发者需要对智能合约的用户权限管理功能进行检测,判断智能合约中是否存在用户权限异常情况。
3.针对智能合约用户权限异常检测方法,目前有两类方案:基于漏洞模式的和基于特定库的方法。
4.基于漏洞模式的方法如mythril,securify将用户权限异常现象定义为合约的权限控制问题,通过定义一系列的漏洞模式,如”不受限的写入”模式,该模式假定对于智能合约的任意一个存储变量,应当至少存在一个用户无法对该变量进行读写。基于上述假设,该模式通过检测合约中的变量是否可以被任意用户执行写操作,如果存在这样的变量,则认为该合约存在权限控制问题。
5.基于特定库的方法如spcon,该方法基于开源的权限控制库“openzeppelin权限控制库”,针对使用该库来做用户权限控制的合约,基于交易记录挖掘合约定义的用户类型和权限,基于测试的方法来检测异常用户。
6.但是上述两种方法存在一定的缺陷:
7.1、对于基于漏洞模式的检测方法,若漏洞模式设计的过于宽泛,则可能导致误报,若漏洞模式设计的过于严格,则可能导致漏报;
8.2、对于基于特定库的方法,该方法只面向使用“openzeppelin权限控制库”这个库的智能合约。而对于一般的不适用该库函数的合约无法进行检测;
9.因此我们需要提出基于图神经网络的智能合约用户权限异常漏洞检测方法。


技术实现要素:



10.本发明的目的在于提供基于图神经网络的智能合约用户权限异常漏洞检测方法,合约权限异常通常体现在用户可以通过调用合约的特定函数,对合约存储变量进行自由修改。因此,本发明基于智能合约的函数调用信息与合约存储变量的访问赋值信息对合约权限异常问题进行检测。
11.为实现上述目的,本发明提供如下技术方案:
12.基于图神经网络的智能合约用户权限异常漏洞检测方法,包括如下步骤:
13.s1、收集用于模型训练的数据,获得合约源码数据集;
14.s2、合约抽象语法树提取与预训练,包括如下步骤:
15.s21、首先对合约抽象语法树进行构建,构建抽象语法树数据集为{ast_i,l_i,i=1,2,3,

},其中ast即为合约的抽象语法树;
16.s22、然后对抽象语法树进行优化,由于抽象语法树包含的信息复杂,通常需要对抽象语法树进行预处理来筛选有效信息,在智能合约权限异常检测场景下,主要考虑智能合约的函数、修饰器、与全局变量之间的交互关系;
17.s23、最后对s22中获得的优化后的抽象语法树进行预训练;
18.s3、基于抽象语法树的合约图构造,包括如下步骤:
19.s31、对图节点构造,所述图节点三类节点:函数节点、修饰器节点和全局变量节点;
20.s32、对边的构造,所述边的构造中包括构造两种类型的边,分别为控制流信息边和数据流信息边;
21.s4、基于合约图的权限异常识别,包括如下步骤:
22.s41、将s3中获得的抽象语法树合约图进行训练,获得训练好的分类器;
23.s42、漏洞识别,设定新的合约源代码,根据s2和s3的过程将新的合约源代码转换成对应的抽象语法树合约图,然后将获得的抽象语法树合约图输入s41中获得的分类器,得到分类结果;
24.s5、获得预测结果。
25.在一种可能的设计中,所述s1中获得的合约源码数据集包括标记过的是否有权限控制问题的智能合约以及智能合约的源代码,所述合约源码数据集记为{sc_i,l_i,i=1,2,3,

},其中,sc指一个智能合约,l指该合约对应的标签,若i为1,则认为合约存在用户权限异常问题,若i为0,则认为合约用户权限无异常。
26.在一种可能的设计中,所述权限异常通常是由多个函数的调用产生,所以需要记录合约的函数定义和调用信息,所述权限异常体现在用户对合约存储变量的自由修改,所以需要记录合约的变量定义、调用和赋值信息。
27.在一种可能的设计中,所述修饰器视作智能合约中的一种特殊函数,所述s22中对抽象语法树进行优化,首先,仅保留抽象语法树中与上述三类对象相关的节点,即抽象语法树中函数对应的子树,抽象语法树中修饰器对应的子树,抽象语法树中全局变量声明对应的子树,并将除此以外的节点删除;其次,对于剩下的节点,仅保留节点类型信息(如函数调用节点)与节点名(如函数名)信息,删掉其他信息。
28.在一种可能的设计中,所述抽象语法树通过前序遍历转换为词序列,所述抽象语法树预训练采用word2vec技术对词序列进行预训练,可以得到每个词对应的特征向量映射{vec},对于一个抽象语法树的词节点token,可以通过vec计算该词对应的词向量v。
29.在一种可能的设计中,所述函数节点以智能合约的函数为粒度构造图节点,对于合约中的每个函数,构造对应的函数节点f,对于每个函数,可以从合约抽象语法树中到对应的函数子树,通过前序遍历将该函数子树转换为对应的词序列[c1,c2,c3,

],通过计
算v_f=(vec(c1)+vec(c2)+vec(c3)+

)/n得到该节点的特征向量;
[0030]
所述修饰器节点构造对应的修饰器节点m,对于每个修饰器,可以从合约抽象语法树中到对应的修饰器子树,通过前序遍历将该修饰器子树转换为对应的词序列,通过v对词序列进行向量映射并通过类似函数节点特征的计算可得到该修饰器节点的特征向量v_m;
[0031]
所述全局变量节点将合约中定义的每个全局变量var定义为一个图节点,并计算vec(var)得到该节点的特征向量。
[0032]
在一种可能的设计中,所述控制流信息边为若两个函数之间存在调用关系,如函数f1调用了函数f2,就增加一条从f1对应节点指向f2对应节点的边。若一个函数f调用了修饰器m,则增加一条从f对应节点指向m对应节点的边;
[0033]
所述数据流信息边为根据智能合约函数对全局变量的访问情况,若函数f访问了全局变量var,则添加一条从var到f的边,若函数f修改了全局变量var,则添加一条从f到var的边,若修饰器m访问了全局变量var,则添加一条从var到m的边,若修饰器m修改了全局变量var,则添加一条从m到var的边。
[0034]
在一种可能的设计中,所述智能合约源代码转换为,记作g(v,e),其中,v为图的节点,包含全局变量节点v(var)、函数节点v(f),修饰器节点v(m),e为图的边,包含描述函数与函数(修饰器)之间调用关系的控制流信息边,与描述函数(修饰器)与全局变量的访问赋值关系的数据流信息边。
[0035]
在一种可能的设计中,所述s41中对抽象语法树合约图进行训练采用图卷积神经网络对其进行训练,其输入为(智能合约对应的合约图g(v,e),合约是否含有权限异常漏洞的标签l),用于获得训练好的分类器。
[0036]
在一种可能的设计中,所述s42中得到的分类结果为1,则认为合约存在权限异常问题,若结果为0,则认为合约不存在权限异常问题。
[0037]
与现有技术相比,本发明的有益效果是:
[0038]
本发明在使用时,不依赖特定的漏洞模式,可以通过重复学习的方法不断更新识别模型,从而适应新型的权限控制漏洞,避免了漏洞模式设计的过于宽泛,则可能导致误报的情况以及避免了漏洞模式设计的过于严格,则可能导致漏报的情况,提高了检测方法的准确性;
[0039]
本发明在使用时,不依赖于合约的交易记录与特定的库方法,因此可以适用于一般的开源智能合约,提高了检测方法的可扩展性。
附图说明
[0040]
图1为本发明的方法流程图。
具体实施方式
[0041]
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0042]
请参阅图1,本发明提供一种技术方案:
[0043]
基于图神经网络的智能合约用户权限异常漏洞检测方法,包括如下步骤:
[0044]
s1、收集用于模型训练的数据,获得合约源码数据集;
[0045]
s2、合约抽象语法树提取与预训练,包括如下步骤:
[0046]
s21、首先对合约抽象语法树进行构建,构建抽象语法树数据集为{ast_i,l_i,i=1,2,3,

},其中ast即为合约的抽象语法树;
[0047]
s22、然后对抽象语法树进行优化,由于抽象语法树包含的信息复杂,通常需要对抽象语法树进行预处理来筛选有效信息,在智能合约权限异常检测场景下,主要考虑智能合约的函数、修饰器、与全局变量之间的交互关系;
[0048]
s23、最后对s22中获得的优化后的抽象语法树进行预训练;
[0049]
s3、基于抽象语法树的合约图构造,包括如下步骤:
[0050]
s31、对图节点构造,所述图节点三类节点:函数节点、修饰器节点和全局变量节点;
[0051]
s32、对边的构造,所述边的构造中包括构造两种类型的边,分别为控制流信息边和数据流信息边;
[0052]
s4、基于合约图的权限异常识别,包括如下步骤:
[0053]
s41、将s3中获得的抽象语法树合约图进行训练,获得训练好的分类器;
[0054]
s42、漏洞识别,设定新的合约源代码,根据s2和s3的过程将新的合约源代码转换成对应的抽象语法树合约图,然后将获得的抽象语法树合约图输入s41中获得的分类器,得到分类结果;
[0055]
s5、获得预测结果。
[0056]
进一步优选的,所述s1中获得的合约源码数据集包括标记过的是否有权限控制问题的智能合约以及智能合约的源代码,所述合约源码数据集记为{sc_i,l_i,i=1,2,3,

},其中,sc指一个智能合约,l指该合约对应的标签,若i为1,则认为合约存在用户权限异常问题,若i为0,则认为合约用户权限无异常。
[0057]
进一步优选的,所述权限异常通常是由多个函数的调用产生,所以需要记录合约的函数定义和调用信息,所述权限异常体现在用户对合约存储变量的自由修改,所以需要记录合约的变量定义、调用和赋值信息。
[0058]
进一步优选的,所述修饰器视作智能合约中的一种特殊函数,所述s22中对抽象语法树进行优化,首先,仅保留抽象语法树中与上述三类对象相关的节点,即抽象语法树中函数对应的子树,抽象语法树中修饰器对应的子树,抽象语法树中全局变量声明对应的子树,并将除此以外的节点删除;其次,对于剩下的节点,仅保留节点类型信息(如函数调用节点)与节点名(如函数名)信息,删掉其他信息。
[0059]
进一步优选的,所述抽象语法树通过前序遍历转换为词序列,所述抽象语法树预训练采用word2vec技术对词序列进行预训练,可以得到每个词对应的特征向量映射{vec},对于一个抽象语法树的词节点token,可以通过vec计算该词对应的词向量v。
[0060]
进一步优选的,所述函数节点以智能合约的函数为粒度构造图节点,对于合约中的每个函数,构造对应的函数节点f,对于每个函数,可以从合约抽象语法树中到对应的函数子树,通过前序遍历将该函数子树转换为对应的词序列[c1,c2,c3,

],通过计算v_f
=(vec(c1)+vec(c2)+vec(c3)+

)/n得到该节点的特征向量;
[0061]
所述修饰器节点构造对应的修饰器节点m,对于每个修饰器,可以从合约抽象语法树中到对应的修饰器子树,通过前序遍历将该修饰器子树转换为对应的词序列,通过v对词序列进行向量映射并通过类似函数节点特征的计算可得到该修饰器节点的特征向量v_m;
[0062]
所述全局变量节点将合约中定义的每个全局变量var定义为一个图节点,并计算vec(var)得到该节点的特征向量。
[0063]
进一步优选的,所述控制流信息边为若两个函数之间存在调用关系,如函数f1调用了函数f2,就增加一条从f1对应节点指向f2对应节点的边。若一个函数f调用了修饰器m,则增加一条从f对应节点指向m对应节点的边;
[0064]
所述数据流信息边为根据智能合约函数对全局变量的访问情况,若函数f访问了全局变量var,则添加一条从var到f的边,若函数f修改了全局变量var,则添加一条从f到var的边,若修饰器m访问了全局变量var,则添加一条从var到m的边,若修饰器m修改了全局变量var,则添加一条从m到var的边。
[0065]
进一步优选的,所述智能合约源代码转换为,记作g(v,e),其中,v为图的节点,包含全局变量节点v(var)、函数节点v(f),修饰器节点v(m),各个节点的特征向量由上述步骤计算出来,e为图的边,包含描述函数与函数(修饰器)之间调用关系的控制流信息边,与描述函数(修饰器)与全局变量的访问赋值关系的数据流信息边。
[0066]
进一步优选的,所述s41中对抽象语法树合约图进行训练采用图卷积神经网络对其进行训练,其输入为(智能合约对应的合约图g(v,e),合约是否含有权限异常漏洞的标签l),用于获得训练好的分类器。
[0067]
进一步优选的,所述s42中得到的分类结果为1,则认为合约存在权限异常问题,若结果为0,则认为合约不存在权限异常问题。
[0068]
本发明在具体使用时,不依赖特定的漏洞模式,可以通过重复学习的方法不断更新识别模型,从而适应新型的权限控制漏洞,避免了漏洞模式设计的过于宽泛,则可能导致误报的情况以及避免了漏洞模式设计的过于严格,则可能导致漏报的情况,提高了检测方法的准确性,不依赖于合约的交易记录与特定的库方法,因此可以适用于一般的开源智能合约,提高了检测方法的可扩展性。
[0069]
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。

技术特征:


1.基于图神经网络的智能合约用户权限异常漏洞检测方法,其特征在于:包括如下步骤:s1、收集用于模型训练的数据,获得合约源码数据集;s2、合约抽象语法树提取与预训练,包括如下步骤:s21、首先对合约抽象语法树进行构建,构建抽象语法树数据集为{ast_i,l_i,i=1,2,3,

},其中ast即为合约的抽象语法树;s22、然后对抽象语法树进行优化,由于抽象语法树包含的信息复杂,通常需要对抽象语法树进行预处理来筛选有效信息,在智能合约权限异常检测场景下,主要考虑智能合约的函数、修饰器、与全局变量之间的交互关系;s23、最后对s22中获得的优化后的抽象语法树进行预训练;s3、基于抽象语法树的合约图构造,包括如下步骤:s31、对图节点构造,所述图节点三类节点:函数节点、修饰器节点和全局变量节点;s32、对边的构造,所述边的构造中包括构造两种类型的边,分别为控制流信息边和数据流信息边;s4、基于合约图的权限异常识别,包括如下步骤:s41、将s3中获得的抽象语法树合约图进行训练,获得训练好的分类器;s42、漏洞识别,设定新的合约源代码,根据s2和s3的过程将新的合约源代码转换成对应的抽象语法树合约图,然后将获得的抽象语法树合约图输入s41中获得的分类器,得到分类结果;s5、获得预测结果。2.根据权利要求1所述的基于图神经网络的智能合约用户权限异常漏洞检测方法,其特征在于:所述s1中获得的合约源码数据集包括标记过的是否有权限控制问题的智能合约以及智能合约的源代码,所述合约源码数据集记为{sc_i,l_i,i=1,2,3,

},其中,sc指一个智能合约,l指该合约对应的标签,若i为1,则认为合约存在用户权限异常问题,若i为0,则认为合约用户权限无异常。3.根据权利要求2所述的基于图神经网络的智能合约用户权限异常漏洞检测方法,其特征在于:所述权限异常通常是由多个函数的调用产生,所以需要记录合约的函数定义和调用信息,所述权限异常体现在用户对合约存储变量的自由修改,所以需要记录合约的变量定义、调用和赋值信息。4.根据权利要求1所述的基于图神经网络的智能合约用户权限异常漏洞检测方法,其特征在于:所述修饰器视作智能合约中的一种特殊函数,所述s22中对抽象语法树进行优化,首先,仅保留抽象语法树中与上述三类对象相关的节点,即抽象语法树中函数对应的子树,抽象语法树中修饰器对应的子树,抽象语法树中全局变量声明对应的子树,并将除此以外的节点删除;其次,对于剩下的节点,仅保留节点类型信息(如函数调用节点)与节点名(如函数名)信息,删掉其他信息。5.根据权利要求4所述的基于图神经网络的智能合约用户权限异常漏洞检测方法,其特征在于:所述抽象语法树通过前序遍历转换为词序列,所述抽象语法树预训练采用word2vec技术对词序列进行预训练,可以得到每个词对应的特征向量映射{vec},对于一个抽象语法树的词节点token,可以通过vec计算该词对应的词向量v。
6.根据权利要求1所述的基于图神经网络的智能合约用户权限异常漏洞检测方法,其特征在于:所述函数节点以智能合约的函数为粒度构造图节点,对于合约中的每个函数,构造对应的函数节点f,对于每个函数,可以从合约抽象语法树中到对应的函数子树,通过前序遍历将该函数子树转换为对应的词序列[c1,c2,c3,

],通过计算v_f=(vec(c1)+vec(c2)+vec(c3)+

)/n得到该节点的特征向量;所述修饰器节点构造对应的修饰器节点m,对于每个修饰器,可以从合约抽象语法树中到对应的修饰器子树,通过前序遍历将该修饰器子树转换为对应的词序列,通过v对词序列进行向量映射并通过类似函数节点特征的计算可得到该修饰器节点的特征向量v_m;所述全局变量节点将合约中定义的每个全局变量var定义为一个图节点,并计算vec(var)得到该节点的特征向量。7.根据权利要求6所述的基于图神经网络的智能合约用户权限异常漏洞检测方法,其特征在于:所述控制流信息边为若两个函数之间存在调用关系,如函数f1调用了函数f2,就增加一条从f1对应节点指向f2对应节点的边。若一个函数f调用了修饰器m,则增加一条从f对应节点指向m对应节点的边;所述数据流信息边为根据智能合约函数对全局变量的访问情况,若函数f访问了全局变量var,则添加一条从var到f的边,若函数f修改了全局变量var,则添加一条从f到var的边,若修饰器m访问了全局变量var,则添加一条从var到m的边,若修饰器m修改了全局变量var,则添加一条从m到var的边。8.根据权利要求7所述的基于图神经网络的智能合约用户权限异常漏洞检测方法,其特征在于:所述智能合约源代码转换为,记作g(v,e),其中,v为图的节点,包含全局变量节点v(var)、函数节点v(f),修饰器节点v(m),e为图的边,包含描述函数与函数(修饰器)之间调用关系的控制流信息边,与描述函数(修饰器)与全局变量的访问赋值关系的数据流信息边。9.根据权利要求8所述的基于图神经网络的智能合约用户权限异常漏洞检测方法,其特征在于:所述s41中对抽象语法树合约图进行训练采用图卷积神经网络对其进行训练,其输入为(智能合约对应的合约图g(v,e),合约是否含有权限异常漏洞的标签l),用于获得训练好的分类器。10.根据权利要求1所述的基于图神经网络的智能合约用户权限异常漏洞检测方法,其特征在于:所述s42中得到的分类结果为1,则认为合约存在权限异常问题,若结果为0,则认为合约不存在权限异常问题。

技术总结


本发明公开了基于图神经网络的智能合约用户权限异常漏洞检测方法,包括如下步骤:S1、收集用于模型训练的数据,获得合约源码数据集;S2、合约抽象语法树提取与预训练;S3、基于抽象语法树的合约图构造;S4、基于合约图的权限异常识别;S5、获得预测结果。本发明基于智能合约的函数调用信息与合约存储变量的访问赋值信息对合约权限异常问题进行检测,不依赖特定的漏洞模式,可以通过重复学习的方法不断更新识别模型,从而适应新型的权限控制漏洞,提高了检测方法的准确性;不依赖于合约的交易记录与特定的库方法,因此可以适用于一般的开源智能合约,提高了检测方法的可扩展性。提高了检测方法的可扩展性。


技术研发人员:

李志伟

受保护的技术使用者:

广东启链科技有限公司

技术研发日:

2022.11.08

技术公布日:

2022/12/26

本文发布于:2024-09-24 23:31:18,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/49508.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:合约   节点   函数   抽象
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议