一种智能合约漏洞检测方法及系统

文档序号:33562293发布日期:2023-03-22 16:00阅读:75来源:国知局
一种智能合约漏洞检测方法及系统

1.本发明涉及智能合约漏洞检测领域,特别是涉及一种智能合约漏洞检测方法及系统。


背景技术:

2.智能合约这一术语在1994年被正式提出。由于技术的限制,智能合约技术在当时并没有被实现。而随着区块链技术及其应用的迅速发展,在2014年智能合约技术在以太坊中首次得到了的实现。
3.智能合约的本质是一个程序、一段代码。智能合约具有去中心化、低成本、可溯源等优点。因此,智能合约在许多领域都有应用。如图1所示,是智能合约在线购物的应用场景的智能合约示例。基于智能合约的在线购物的应用场景的实现至少需要两个合约,分别是(1)卖家和买家的合约(2)卖家和运输公司的合约。
4.在第一个合约中,卖方提供商品清单,发布到区块链上。买方看到商品清单后,选择想要的商品并下单付款。此时买家所付的钱将被智能合约锁定。卖家收到订单后,开始准备订单上的货物。准备完成后,通过运输公司将货物运送给买家。如合约2所示,卖方与运货公司之间的交易同样在智能合约平台来达成。当运输公司将货物运送给到买方后,卖方与运输公司的合约完成,合约中的钱解锁并转入到运输公司的账户中。买方收到货并确认货物无误之后完成交易,此时买方与卖方的合约完成,买方的钱解锁并转入卖方的账户中。
5.智能合约的完整生命周期如图2所示。首先,企业产生了需要使用智能合约的需求。企业指派项目负责人制定计划,并寻找软件工程师团队进行合作。然后,双方共同制定需求文档。接着,软件工程师根据需求文档,开发出对应的智能合约。在对开发出的智能合约进行测试后,便可以将智能合约部署到区块链上(例如以太坊)。智能合约代码中会设定一些条件,这些条件往往是在编写合约前,书写需求文档时就已经确定。当这些条件被触发时,则会执行合约中所设定的规则。如果这个规则是“合约完成”时,则合约终止,生成的交易和更新的状态信息被放入分布式账本中,并在智能合约执行后使用共识过程进行确认。被锁定的数字资产解锁(资产解冻),合约完成。
6.智能合同使合同条款的自动执行成为可能,这促进了去中心化应用程序(dapp)的发展。事实上,许多dapp均由几个智能合约作为后端和一个用户界面作为前端组成。由于智能合约在各个领域包含了超过了100亿美元的价值,这会极大地刺激黑客们进行攻击。往往数月就会被发现或被利用一个或多个智能合约安全漏洞。这会导致智能合约应用程序的安全可信度降低,从而极大地影响其价值。
7.因此,智能合约的安全漏洞检测的研究一直非常热门。常见的智能合约漏洞检测模型往往是严格依赖于专家知识来进行漏洞检测的。这一类模型往往一味地简单查找专家定义的模式,导致误报率非常高。基于深度学习的代码漏洞检测工具较多,但应用于智能合约代码的基于深度学习的漏洞检测工具却较少。
8.近年来,智能合约的应用领域愈发广泛。同时,智能合约的安全漏洞检测问题也越
来越被重视。然而,现有的智能合约的漏洞检测工具大部分都是严格依赖于专家定义的规则。依赖于专家定义的规则的工具往往会有较高的误报率。


技术实现要素:

9.本发明的目的是提供一种智能合约漏洞检测方法及系统,提高智能合约漏洞检测的精确度。
10.为实现上述目的,本发明提供了如下方案:
11.一种智能合约漏洞检测方法包括:
12.获取智能合约数据集,所述智能合约数据集包括智能合约的源代码、带有代码语义逻辑关系的数据流及智能合约的标签;
13.对所述智能合约数据集进行预处理,得到预处理后的智能合约数据集;
14.构建双向多层的transformer架构训练模型;
15.采用所述预处理后的智能合约数据集对所述双向多层的transformer架构训练模型进行训练,得到训练后的双向多层的transformer架构训练模型;
16.获取需要检测的智能合约的源代码;
17.将所述需要检测的智能合约源代码输入至所述训练后的双向多层的transformer架构训练模型,得到带有代码语义逻辑关系的数据流信息和智能合约的标签信息。
18.可选地,所述获取智能合约数据集,具体包括:
19.获取智能合约的源代码和智能合约的标签;
20.将所述源代码转化为抽象语法树后,得到代码语义逻辑;
21.从所述抽象语法树中,提取出带有代码语义逻辑关系的数据流。
22.可选地,所述对所述智能合约数据集进行预处理,得到预处理后的智能合约数据集,具体包括:
23.对所述智能合约数据集进行令牌处理和掩码处理,得到处理后的智能合约数据集。
24.可选地,所述构建双向多层的transformer架构训练模型,具体包括:
25.基于注意力机制,构建双向多层的transformer架构训练模型。
26.可选地,所述智能合约的源代码包括源代码的注释文本、声明语句以及功能语句。
27.可选地,所述智能合约的标签是包括0和1,0代表智能合约代码不存在安全漏洞,1代表智能合约代码存在安全漏洞。
28.一种智能合约漏洞检测系统包括:
29.智能合约数据集获取模块,用于获取智能合约数据集,所述智能合约数据集包括智能合约的源代码、带有代码语义逻辑关系的数据流及智能合约的标签;
30.预处理模块,用于对所述智能合约数据集进行预处理,得到预处理后的智能合约数据集;
31.训练模型构建模块,用于构建双向多层的transformer架构训练模型;
32.训练模块,用于采用所述预处理后的智能合约数据集对所述双向多层的transformer架构训练模型进行训练,得到训练后的双向多层的transformer架构训练模型;
33.源代码获取模块,用于获取需要检测的智能合约的源代码;
34.数据流信息和标签信息输出模块,用于将所述需要检测的智能合约源代码输入至所述训练后的双向多层的transformer架构训练模型,得到带有代码语义逻辑关系的数据流信息和智能合约的标签信息。
35.可选地,所述智能合约数据集获取模块具体包括:
36.源代码和标签获取单元,用于获取智能合约的源代码和智能合约的标签;
37.代码语义逻辑确定单元,用于将所述源代码转化为抽象语法树后,得到代码语义逻辑;
38.数据流提取单元,用于从所述抽象语法树中,提取出带有代码语义逻辑关系的数据流。
39.根据本发明提供的具体实施例,本发明公开了以下技术效果:
40.本发明提供一种智能合约漏洞检测方法,该方法通过获取智能合约数据集,智能合约数据集包括智能合约的源代码、带有代码语义逻辑关系的数据流及智能合约的标签;对智能合约数据集进行预处理,得到预处理后的智能合约数据集;构建双向多层的transformer架构训练模型;采用预处理后的智能合约数据集对双向多层的transformer架构训练模型进行训练,得到训练后的双向多层的transformer架构训练模型;获取需要检测的智能合约的源代码;将需要检测的智能合约源代码输入至训练后的双向多层的transformer架构训练模型,得到带有代码语义逻辑关系的数据流信息和智能合约的标签信息,本发明相对于依赖于专家定义的规则的工具对智能合约漏洞进行检测具有很大的正确率,提高了智能合约漏洞检测的精确度。
附图说明
41.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
42.图1为智能合约的应用场景;
43.图2为智能合约生命周期示意图;
44.图3为重入漏洞中受害者者合约示意图;
45.图4为重入漏洞中攻击者合约示意图;
46.图5为整型溢出受害者合约示意图;
47.图6为注意力分数、dot-product和多头注意力分数的完整计算过程;
48.图7为transformer架构示意图;
49.图8为本发明智能合约漏洞检测方法的架构模型图;
50.图9为本发明智能合约漏洞检测方法流程图;
51.图10为本发明智能合约漏洞检测系统结构图。
具体实施方式
52.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完
整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
53.本发明的目的是提供一种智能合约漏洞检测方法及系统,提高智能合约漏洞检测的精确度。
54.为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
55.智能合约漏洞检测工作一直是一个非常热门的话题。目前,大部分漏洞检测模型都是通过定义基于专家知识的错误模式来实现。随着机器学习在自然语言处理方面的广泛使用,逐渐出现了基于机器学习的智能合约漏洞检测工具。相比较依赖于专家知识的智能合约漏洞检测而言,基于机器学习的漏洞检测工具在准确度等方面有了较大的提升。
56.图9为本发明智能合约漏洞检测方法流程图。如图9所示,一种智能合约漏洞检测方法包括:
57.步骤101:获取智能合约数据集,所述智能合约数据集包括智能合约的源代码、带有代码语义逻辑关系的数据流及智能合约的标签。所述智能合约的源代码包括源代码的注释文本、声明语句以及功能语句。所述智能合约的标签是包括0和1,0代表智能合约代码不存在安全漏洞,1代表智能合约代码存在安全漏洞。
58.步骤101具体包括:
59.获取智能合约的源代码和智能合约的标签;
60.将所述源代码转化为抽象语法树后,得到代码语义逻辑;
61.从所述抽象语法树中,提取出带有代码语义逻辑关系的数据流。
62.本发明是第一个在智能合约代码漏洞检测中使用带有代码语义逻辑的数据流用来进行预训练操作的。首先,通过语法分析工具,将智能合约源代码转换为抽象语法树。抽象语法树包含了源代码的语义关系。然后,通过抽象语法树,从中提取出带有代码语义关系的数据流。由于同一个变量在不同的地方含义不同,甚至可能值都不同,所以将变量做标记。例如图中的amount变量,在初始传入的地方标记为amount1,然后根据语法结构,每次出现之后会分别标记为amount2,amount3,amount4。这样便可以表示出代码间的语义的依赖关系。最后,将带有了变量识别标记的智能合约进行关系提取,便可以得到代表了变量值依赖的数据流,可以用于预训练。
63.步骤102:对所述智能合约数据集进行预处理,得到预处理后的智能合约数据集。
64.步骤102具体包括:
65.对所述智能合约数据集进行令牌处理和掩码处理,得到处理后的智能合约数据集。
66.模型对输入的数据集进行了token处理。每一个输入的序列都由一段智能合约源代码、此源代码对应的数据流、此源代码对应的是否存在漏洞的标签这三部分组成。使用令牌[cls]来作为一整个序列的输入的开始。在源代码、数据流、标签这三部分输入的中间,使用令牌[sep]来隔开。接下来,对输入的数据使用了mlm(masked language model,掩码语言模型)来进行处理。将源代码部分和数据流随机选取了10%进行掩码代替。被选中的部分,其中80%使用[mask]令牌来替换,10%使用随机单词来替换,还有10%保持原样不变。
[0067]
步骤103:构建双向多层的transformer架构训练模型。
[0068]
步骤103具体包括:
[0069]
基于注意力机制,构建双向多层的transformer架构训练模型。
[0070]
注意力机制在自然语言处理(nlp)领域的应用十分广泛。许多深度学习的方法并不能很好地处理不定长输入的sequence to sequence(seq2seq)任务。例如,卷积神经网络(cnn)比较适合处理像素固定(例如,128
×
128)的图片,在seq2seq方面难以适配。循环神经网络(rnn)无法并行运算,在处理较大文本的时候,往往表现较差。而注意力机制能很容易的处理不定长输入问题,且可以并行运算。
[0071]
注意力机制由ashishv等人正式提出。通过注意力机制,可以使得每一个向量都会考虑到当前序列下其他向量的信息。实现方法是通过三个向量:query向量、key向量和value向量来计算出不同的vector之间的注意力分数。这个注意力分数代表了两个向量之间的相关度(权重)。图6为注意力分数、dot-product和多头注意力分数的完整计算过程。其中,(a)为注意力机制的计算方法示意图,(b)为dot-product计算方法示意图,(c)为多头注意力的结构示意图。
[0072]
计算注意力分数的方法有很多,应用最广泛的是dot-product方法,如图6(a)所示。其中,x1和x2是两个需要计算注意力分数的向量,先将这两个输入的向量分别乘上两个矩阵wq和wk,可以得到两个向量q和k。然后将这两个向量做一次dot-product,即可得到最终的注意力分数。具体公式如下:
[0073]
q=wqx1ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(1)
[0074]
k=wkx2ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(2)
[0075]
α=q
·kꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(3)
[0076]
计算出代表了相关度的注意力分数后,便可以再结合另一个向量v,得出输入的x1向量和x2向量经过了相关度计算后的最终的结果向量。将q,k,v三个向量拼接打包后可以得到q,k,v三个矩阵。数据矩阵可以计算为:
[0077][0078]
其中,dk为矩阵k的维度。在整个计算的过程中,需要通过训练学习得到的只有wq,wk,wv三个矩阵。完整的dot-product过程如图6(b)所示。
[0079]
然而,两个向量之间的相关性通常有多种。而一个注意力分数只能表示一种相关性。多头注意力可以用来解决这个问题,其结构如图6(c)所示。多头注意力的模型包含了多个self-attention层,不同的层之间相互独立,各自计算出其考虑了其他向量的输出向量,最后将这些向量融合后得到最终向量。其公式如下所示。其中,headi表示多头注意力中不同的头。
[0080]
multihead(q,k,v)=concat(head1,...,headh)woꢀꢀꢀꢀꢀꢀ
(5)
[0081][0082]
基于前述的注意力机制,便可以构建出如图7所示的transformer架构。这是一个经典的encoder-decoder架构。其中,encoder负责处理输入的信息,decoder负责决定如何输出。
[0083]
本发明构建了一个12层的基于attention的双向transformer模型来训练步骤101中的数据集。图8为本发明智能合约漏洞检测方法的架构模型图。其中,(a)为模型训练架构的完整示意图,(b)为存在安全漏洞的智能合约源代码,(c)为智能合约代码转换的抽象语法树,(d)为将抽象语法树转化为的带有数据流关系的源代码。
[0084]
将经过了mlm处理后的的输入序列记作序列x作为输入,然后将序列转换为输入向量h0。每个令牌的输入向量是通过对相应的令牌和位置嵌入求和来构造的。对所有变量使用一个特殊的位置嵌入来表示它们是数据流的节点。训练模型在输入向量上应用了12个transformer层。所生成的上下文表示hn=transformern(h
n-1
),n∈[1,12]。每一个transformer层都包含一个transformer的架构。其中,通过前文所述的多头注意力机制来计算不同种类的相关度,然后在第n层前使用一个前馈层。具体公式如下:
[0085]gn
=ln(multiattn(h
n-1
)+h
n-1
)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(7)
[0086]hn
=ln(ffn(gn)+gn)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(8)
[0087]
其中,multiattn是一种多头自注意力机制,ffn是两个前馈神经网络,ln代表一个层规范化操作。gn代表n个头的多头注意力机制,而其输出g
noutput
通过以下公式计算:
[0088][0089][0090][0091]
其中,qi,ki,vi代表了查询、键、值三组向量拼接成的矩阵,w
iq
,w
ik
,w
iv
这三个矩阵是用来求出查询、键、值向量的,通过训练而得到。公式(10)是上文中公式(4)在本模型中的应用。而w
io
则是将不同的头得出的相关度结果合并起来的关系矩阵,也是通过训练得到。
[0092]
步骤104:采用所述预处理后的智能合约数据集对所述双向多层的transformer架构训练模型进行训练,得到训练后的双向多层的transformer架构训练模型;
[0093]
步骤105:获取需要检测的智能合约的源代码;
[0094]
步骤106:将所述需要检测的智能合约源代码输入至所述训练后的双向多层的transformer架构训练模型,得到带有代码语义逻辑关系的数据流信息和智能合约的标签信息。
[0095]
所述智能合约安全漏洞类型包括重入漏洞、整数溢出漏洞和时间戳依赖漏洞。这三种漏洞是智能合约的已经被发现的安全漏洞中非常典型的三个。本发明能够检测的类型并不局限于这三种类型。并且,只需要进行简单地数据集调整,就可以用来检测出其他的智能合约安全漏洞。
[0096]
重入漏洞:重入漏洞是一类危险系数较高的安全漏洞。以太坊历史上非常著名的事件“the dao”便是利用的重入漏洞。此次事件带来了非常大的经济损失,甚至导致了以太坊分裂成了eth和etc。
[0097]
重入漏洞通常发生在向其他用户转账的过程中。智能合约中默认存在一个没有函数名和参数的函数:fallback函数。fallback函数在收到转账时会自动被触发。智能合约在转账操作中需要修改修改合约storge状态变量。而在这之前,就可能受到重入攻击。因为攻击者可以通过一个特定的fallback函数,便可以再次调用合约的同一个函数。具体实现如
下文所述。
[0098]
重入攻击的受害者合约代码如图3所示。合约中存在一个withdraw函数,此函数用于取钱者取回资金。第5行的代码的作用是检查取钱者在当前合约中是否有足够余额。若余额充足,则将金额转给接收者(通过第6行代码来实现)。若成功转账,则第7行代码会扣除取钱者在本合约中的账户余额中的对应取钱金额。
[0099]
重入漏洞中的攻击者合约的代码如图4所示。攻击者首先在第四行代码中调用受害者合约的witdraw函数取回资金。第六行的payable函数是一个fallback函数。在收到转账时,payable函数会被自动触发,再次调用withraw函数进行取钱操作。由于受害者合约中转账操作位与修改账户-余额之前,所以图4中的payable函数便-可重复调用withdraw函数进行取钱,直至受害者合约余额被取空或者gas完全消耗掉,才会停止转账操作。
[0100]
整型溢出:以太坊虚拟机(evm)存在整型溢出的问题。例如,将十进制数256存储到uint 8类型的变量中。由于uint8类型只能存储八位二进制数,其对应的最大存的数值是十进制的255。此时,将会发生整数溢出,使得最终结果变成0。
[0101]
图5为整型溢出受害者合约示意图,为存在整型溢出安全漏洞的代码示例。第五行即为易受攻击的代码。攻击者只需要构造出一个值为2
256
的数,在存入变量amount后会发生整型溢出,amount实际值存为0,在第8行中的扣除的金额值为0,从而实现了代币的增发。
[0102]
整数溢出漏洞是在bec事件中被黑客利用,造成了严重的后果后才被发现的。bec是一种部署在以太坊上的代币,黑客通过构造amount=2
×2256
造成整数溢出,成功地增发bec。最终导致了bec近9亿美元的市值几乎归零。
[0103]
时间戳依赖漏洞:时间戳通常是一个字符序列。它能够唯一地表示某一刻的时间。数据块时间戳历的应用非常广泛,例如通过时间戳来锁定一段时间的资金、通过时间戳来书写时间相关的各种状态变化的条件语句。通常来说,都是使用矿工的本地时间作为时间戳。由于此时间戳误差范围一般允许在900秒的范围内,所以,获得记账权的矿工可以在这900秒的范围内自由地修改时间戳,获得非法利益。而当智能合约使用区块时间戳作为触发条件来执行一些关键的操作的时候,这个智能合约就存在时间戳依赖漏洞。
[0104]
本发明还提供一种智能合约漏洞检测系统,如图10所示,该系统包括:
[0105]
智能合约数据集获取模块201,用于获取智能合约数据集,所述智能合约数据集包括智能合约的源代码、带有代码语义逻辑关系的数据流及智能合约的标签;
[0106]
预处理模块202,用于对所述智能合约数据集进行预处理,得到预处理后的智能合约数据集;
[0107]
训练模型构建模块203,用于构建双向多层的transformer架构训练模型;
[0108]
训练模块204,用于采用所述预处理后的智能合约数据集对所述双向多层的transformer架构训练模型进行训练,得到训练后的双向多层的transformer架构训练模型;
[0109]
源代码获取模块205,用于获取需要检测的智能合约的源代码;
[0110]
数据流信息和标签信息输出模块206,用于将所述需要检测的智能合约源代码输入至所述训练后的双向多层的transformer架构训练模型,得到带有代码语义逻辑关系的数据流信息和智能合约的标签信息。
[0111]
所述智能合约数据集获取模块201具体包括:
[0112]
源代码和标签获取单元,用于获取智能合约的源代码和智能合约的标签;
[0113]
代码语义逻辑确定单元,用于将所述源代码转化为抽象语法树后,得到代码语义逻辑;
[0114]
数据流提取单元,用于从所述抽象语法树中,提取出带有代码语义逻辑关系的数据流。
[0115]
本发明提出了一种高准确率的基于注意力机制和数据流的智能合约漏洞检测模型。不同于其他模型使用抽象语法树作为中间表示,本发明的模型使用了包含代码语义结构的数据流作为数据集中的一部分。数据集的另外两部分是智能合约源代码和智能合约是否存在安全漏洞的标签。然后,通过掩码机制对数据集进行掩码处理,并使用基于注意力机制构建的双向的多层transformer作为模型主干来进行训练,得出最终的智能合约是否存在安全漏洞的结果标签。
[0116]
本发明的智能合约漏洞检测方法可以高效地检测出智能合约中存在的重入漏洞,整数溢出漏洞和时间戳依赖漏洞。上述方法获得了最先进的结果,对智能合约的安全漏洞检测的准确度、召回率和f1-score分别达到了92.54%,81.79%,86.84%。
[0117]
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
[0118]
本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1