1.本发明涉及深度学习和区块链技术领域,更具体地,涉及一种基于长短期记忆网络的智能合约模糊测试方法及系统。
背景技术:
2.随着区块链技术的发展,大量的智能合约被应用到不同领域,例如金融服务、公共服务和物联网等领域。智能合约是一种特殊协议,其本质上为部署在区块链上的一段代码,其为区块链与各个领域的结合提供了基础。智能合约容易出现许多代码的安全问题,且与传统的软件不同,智能合约一旦部署就无法修改,这也意味着智能合约中的安全漏洞也无法修改。因此,研发一种准确的智能合约漏洞检测工具是必须的。目前,通过漏洞检测的手段能够有效解决代码安全问题,在智能合约部署前,先用漏洞检测工具对其进行漏洞诊断,发掘其中的漏洞并告知开发者进行修复。其中,模糊测试是一种常用的方法,它能够产生测试数据输入程序进行测试,快速地发现程序漏洞。
3.现有一种基于专家规则和序列化建模的智能合约漏洞检测方法,具体包括:制作智能合约源码数据集;对智能合约数据集进行案例分析;智能合约的合约序列块转换方法;利用向量转换工具,将合约序列块映射为向量;利用专家规则自动提取工具,提取重入漏洞专家规则;构建前向神经网络和双向长短时记忆模型进行学习和训练,得到高表达性的向量集;构建分类器模型进行学习和训练,将前向神经网络和双向长短时记忆模型提取的专家规则以及合约序列块的特征向量集输入分类器模型,输出重入漏洞检测结果。
4.然而,上述方法需要定义特定的专家规则,其扩展性低,当出现同一漏洞的不同形式体现时,无法成功检测到漏洞,检测准确率和效率低。
技术实现要素:
5.本发明为克服现有智能合约模糊测试准确率和效率低的问题,提供一种基于长短期记忆网络的智能合约模糊测试方法及系统。
6.为解决上述技术问题,本发明的技术方案如下:
7.第一个方面,本发明提出一种基于长短期记忆网络的智能合约模糊测试方法,包括以下步骤:
8.s1:从以太坊中收集带有漏洞的智能合约,并收集智能合约的漏洞触发时间点前的交易序列和状态序列,作为数据集。
9.s2:使用自然语言处理的方法提取交易序列和状态序列的特征,得到交易特征序列和状态特征序列。
10.s3:构建长短期记忆网络,并利用交易特征序列和状态特征序列训练长短期记忆网络。
11.s4:提取待测试智能合约的交易序列和状态序列的特征,得到交易特征向量序列和合约状态特征序列,然后将交易特征序列和状态特征序列输入到完成训练的长短期记忆
网络中,长短期记忆网络输出一个交易;
12.s5:设定输出交易的数量,循环s4的过程,直到长短期记忆网络输出预设的交易数量;将长短期记忆网络输出的交易作用到待测试智能合约中,对智能合约进行测试,检测智能合约的漏洞。
13.本技术方案中,通过对智能合约的交易序列和状态序列进行特征化处理,将复杂的交易信息和状态信息转化为能够充分表达交易信息和状态信息的交易特征序列和状态特征序列,同时使用自然语言处理的方法对函数进行语义提取,使得功能相似的函数有相近的特征向量,能够有效地提高智能合约模糊测试的准确率和效率。
14.优选地,s2具体包括以下步骤:
15.s2.1:对交易序列中调用的函数进行语义提取,得到交易序列的函数特征向量。
16.s2.2:将交易序列中的参数、发送者和发送的以太坊代币数量转化为特征向量,并与所述函数特征向量结合,作为交易特征序列。
17.s2.3:将智能合约中的变量值、函数被调用次数、智能合约的余额和智能合约在上一次调用时所执行的字节码频率转化为特征向量,作为状态特征序列。
18.优选地,s5中,长短期记忆网络的输出的交易的组成要素包括调用的函数、参数、发送者和以太坊代币数量。
19.优选地,从智能合约中选取交易序列中调用的函数,长短期记忆网络根据选取的函数输出一个函数特征向量。
20.优选地,从智能合约中选取出现频率最高的前n个的交易序列的参数,作为长短期记忆网络的输出的参数。
21.优选地,长短期记忆网络的输出的发送者为合约创建者、合约信任者或合约攻击者的任一种。
22.优选地,从智能合约中选取出现频率最高的前n个的交易序列的以太坊代币数量,作为长短期记忆网络的输出的以太坊代币数量。
23.优选地,s3中,采用交叉验证的方式,利用随机梯度下降方法对长短期记忆网络进行训练。
24.优选地,s4中,智能合约的漏洞包括自杀合约、依赖区块状态、未控制的程序错误、未验证的返回值、代币锁、代币泄露、交易顺序依赖和整数溢出。
25.第二个方面,本发明还提出一种基于长短期记忆网络的智能合约模糊测试系统,应用于上述任一方案提出的基于长短期记忆网络的智能合约模糊测试方法中,包括:
26.数据收集模块,用于从以太坊中收集带有漏洞的智能合约并收集智能合约的漏洞触发时间点前的交易序列和状态序列,作为数据集;
27.特征提取模块,用于对交易序列和状态序列进行特征提取,得到交易特征序列和状态特征序列;
28.网络构建模块,用于构建长短期记忆网络,并利用交易特征序列和状态特征序列训练长短期记忆网络;
29.测试模块,用于对智能合约进行测试,检测智能合约的漏洞。
30.与现有技术相比,本发明技术方案的有益效果是:本发明通过对智能合约的交易序列和状态序列进行特征化处理,将复杂的交易信息和状态信息转化为能够充分表达交易
信息和状态信息的交易特征序列和状态特征序列,同时使用自然语言处理的方法对函数进行语义提取,使得功能相似的函数有相近的特征向量,能够有效地提高智能合约模糊测试的准确率和效率。
附图说明
31.图1为基于长短期记忆网络的智能合约模糊测试方法的流程图。
32.图2为基于长短期记忆网络的智能合约模糊测试方法的流程图。
33.图3为基于长短期记忆网络的智能合约模糊测试系统的原理图。
具体实施方式
34.附图仅用于示例性说明,不能理解为对本专利的限制;
35.下面结合附图和实施例对本发明的技术方案做进一步的说明。
36.实施例1
37.请参阅图1,本实施例提出一种基于长短期记忆网络的智能合约模糊测试方法,包括以下步骤:
38.s1:从以太坊中收集带有漏洞的智能合约,并收集智能合约的漏洞触发时间点前的交易序列和状态序列,作为数据集。
39.s2:提取交易序列和状态序列的特征,得到交易特征序列和状态特征序列。
40.s3:构建长短期记忆网络,并利用交易特征序列和状态特征序列训练长短期记忆网络。
41.s4:提取待测试智能合约的交易序列和状态序列的特征,得到交易特征向量序列和合约状态特征序列,然后将交易特征序列和状态特征序列输入到完成训练的长短期记忆网络中,长短期记忆网络输出一个交易;
42.s5:设定输出交易的数量,循环s4的过程,直到长短期记忆网络输出预设的交易数量;将长短期记忆网络输出的交易作用到待测试智能合约中,对智能合约进行测试,检测智能合约的漏洞。
43.在具体实施过程中,通过对智能合约的交易序列和状态序列进行特征化处理,将复杂的交易信息和状态信息转化为能够充分表达交易信息和状态信息的交易特征序列和状态特征序列,同时使用自然语言处理的方法对函数进行语义提取,使得功能相似的函数有相近的特征向量,能够有效地提高智能合约模糊测试的准确率和效率。
44.实施例2
45.请参阅图1-图2,本实施例提出一种基于长短期记忆网络的智能合约模糊测试方法,包括以下步骤:
46.s1:从以太坊中收集带有漏洞的智能合约,并收集智能合约的漏洞触发时间点前的交易序列和状态序列,作为数据集;
47.本实施例从contract library上收集带有漏洞的智能合约,并从xblock.pro收集智能合约的漏洞触发时间点前的交易序列和状态序列。本实施例基于go ethereum开发智能合约的私有链作为虚拟运行环境,通过修改部分代码以便于进行模糊测试,通过在虚拟环境中发送交易快速执行智能合约。其中,为了测试的需要,虚拟运行环境会随机生成多个
账户作为交易的发送者,包括待测合约的创建者、信任者和攻击者。
48.s2:提取交易序列和状态序列的特征,得到交易特征序列和状态特征序列,具体包括以下步骤:
49.s2.1:对交易序列中调用的函数进行语义提取,得到交易序列的函数特征向量;
50.s2.2:将交易序列中的参数、发送者和发送的以太坊代币数量转化为特征向量,并与所述函数特征向量结合,作为交易特征序列;
51.s2.3:将智能合约中的变量值、函数被调用次数、智能合约的余额和智能合约在上一次调用时所执行的字节码频率转化为特征向量,作为状态特征序列。
52.在具体实施过程中,对交易序列中调用的函数利用语义提取中常用的无监督的embeding方式得到交易序列的函数特征向量,使得名字相似的函数有距离相近的特征向量;将交易序列的每一个交易里的整数型参数、发送的以太坊代币数量这些数字特征转化为特征向量,与函数特征向量结合作为交易特征向量,从而得到交易特征序列;将智能合约中的整数型变量值、函数被调用次数、合约的余额和合约在上一次调用时所执行的字节码频率这些数字特征转化为特征向量,作为状态特征序列。
53.s3:构建长短期记忆网络,并利用交易特征序列和状态特征序列训练长短期记忆网络。
54.本实施例采用交叉验证的方式,利用随机梯度下降方法对长短期记忆网络进行训练。
55.在具体实施过程中,对于数据集中一个触发漏洞的交易序列,使用类似于sequence to sequence的方法,先抹去后半部分交易序列(包含触发漏洞的交易),将前半部分交易序列输入长短期记忆网络,然后通过反向传播训练让长短期记忆网络能够输出与抹去的原后半部分交易序列相似的交易序列,最后采用交叉验证的方式和随机梯度下降的方法对长短期记忆网络训练。
56.长短期记忆网络的输入为智能合约的交易特征序列和状态特征序列,输出为交易,所述交易的组成要素包括调用的函数、参数、发送者和发送的以太坊代币数量,在训练长短期记忆网络的过程中,长短期记忆网络是对可选函数、可选参数、可选以太币数量、可选发送者类型分别输出一个概率分布,从中选出概率最高的函数、参数、以太币数量和发送者类型。对各个要素的选取方式如下所示:
57.调用的函数:从数据集中选取交易序列中调用的函数,长短期记忆网络根据选取的函数输出一个函数特征向量。
58.参数:智能合约中大部分的参数都是整数,本实施例从数据集中选取出现频率最高的前n个的交易序列的参数,作为长短期记忆网络的输出的参数。
59.发送者:长短期记忆网络的输出的发送者为合约创建者、合约信任者或合约攻击者的任一种。
60.发送的以太坊代币数量:从数据集中选取出现频率最高的前n个的交易序列的以太坊代币数量,作为长短期记忆网络的输出的以太坊代币数量。
61.s4:提取待测试智能合约的交易序列和状态序列的特征,得到交易特征向量序列和合约状态特征序列,然后将交易特征序列和状态特征序列输入到完成训练的长短期记忆网络中,长短期记忆网络输出一个交易。
62.s5:设定输出交易的数量,循环s4的过程,直到长短期记忆网络输出预设的交易数量;将长短期记忆网络输出的交易作用到待测试智能合约中,对智能合约进行测试,检测智能合约的漏洞。
63.本实施例中,长短期记忆网络的输入为智能合约的交易特征序列和状态特征序列,输出为交易,所述交易的组成要素包括调用的函数、参数、发送者和发送的以太坊代币数量,在测试智能合约过程中,对各个要素的选取方式如下所示:
64.调用的函数:从待测试的智能合约中选取交易序列中调用的函数,长短期记忆网络根据选取的函数输出一个函数特征向量。
65.参数:智能合约中大部分的参数都是整数,本实施例从待测试的智能合约中选取出现频率最多的交易序列的参数,作为长短期记忆网络的输出的参数。
66.发送者:长短期记忆网络的输出的发送者为合约创建者、合约信任者或合约攻击者的任一种。
67.发送的以太坊代币数量:从待测试的智能合约中选取出现频率最多的交易序列的以太坊代币数量,作为长短期记忆网络的输出的以太坊代币数量。
68.本实施例中,智能合约的漏洞包括自杀合约、依赖区块状态、未控制的程序错误、未验证的返回值、代币锁、代币泄露、交易顺序依赖和整数溢出,上述漏洞的特征如下所示:
69.自杀合约:智能合约能够被任意的用户销毁。
70.依赖区块状态:智能合约转出的代币数量以及转出条件与区块的状态有关,比如区块时间戳。
71.未控制的程序错误:智能合约未对外部合约的函数调用错误进行处理。
72.未验证的返回值:智能合约没有验证外部调用函数的返回值。
73.代币锁:智能合约的代币无法取出。
74.代币泄露:智能合约的代币能够被攻击者偷走。
75.交易顺序依赖:智能合约状态由于交易顺序不同导致不同的结果。
76.整数溢出:智能合约的整数变量溢出。
77.本实施例中根据智能合约的执行日志检测漏洞,通过设计相应的检测模式来匹配日志中的内容以达到检测漏洞的目的,对于智能合约的整数溢出,本实施例提供一个伪代码:
[0078][0079]
对于这个智能合约,假如原本的balanceof[attacker.address]=1,攻击者发送
一条(withdraw(uint256),2,attacker.address,0的交易a合约,其中,withdraw(uint256)为智能合约调用的函数,2为智能合约的参数,attacker.address为智能合约发送者的地址,0为以太坊的代币的数量,由于balanceof[msg.sender]-amount=-1《0,会导致整数下溢,使得balanceof[msg.sender]的值变成2^256-2(最大的整数为2^256-1),从而使攻击者在该智能合约中所拥有的以太币变得很多,之后便可以把合约中所有的以太币都转走。
[0080]
在具体实施过程中,充分利用智能合约的交易序列与状态序列信息,基于深度神经网络长短期记忆网络强大的处理序列变化信息的能力,利用长短期记忆网络提取序列化的交易信息和状态信息,从而生成高质量的输入样本,通过检验在测试的过程中的交易历史与状态历史是否出现相应的特征,用较少的测试次数即可检测到智能合约的漏洞。另外,通过对智能合约的交易序列和状态序列进行特征化处理,将复杂的交易信息和状态信息转化为能够充分表达交易信息和状态信息的交易特征序列和状态特征序列,同时使用自然语言处理的方法对函数进行语义提取,使得功能相似的函数有相近的特征向量,能够有效地提高智能合约模糊测试的准确率和效率。
[0081]
实施例3
[0082]
请参阅图3,本实施例提出一种基于长短期记忆网络的智能合约模糊测试系统,应用于上述实施例提出的基于长短期记忆网络的智能合约模糊测试方法中,包括:数据收集模块、特征提取模块、网络构建模块和测试模块。
[0083]
在具体实施过程中,数据收集模块从以太坊中收集带有漏洞的智能合约并收集智能合约的漏洞触发时间点前的交易序列和状态序列,作为数据集;特征提取模块对交易序列和状态序列进行特征提取,得到交易特征序列和状态特征序列;网络构建模块构建长短期记忆网络,并利用交易特征序列和状态特征序列训练长短期记忆网络;测试模块对智能合约进行测试,检测智能合约的漏洞。
[0084]
附图中描述位置关系的用语仅用于示例性说明,不能理解为对本专利的限制;
[0085]
显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明权利要求的保护范围之内。
技术特征:
1.一种基于长短期记忆网络的智能合约模糊测试方法,其特征在于,包括以下步骤:s1:从以太坊中收集带有漏洞的智能合约,并收集智能合约的漏洞触发时间点前的交易序列和状态序列,作为数据集;s2:使用自然语言处理的方法提取交易序列和状态序列的特征,得到交易特征序列和状态特征序列;s3:构建长短期记忆网络,并利用交易特征序列和状态特征序列训练长短期记忆网络;s4:提取待测试智能合约的交易序列和状态序列的特征,得到交易特征向量序列和合约状态特征序列,然后将交易特征序列和状态特征序列输入到完成训练的长短期记忆网络中,长短期记忆网络输出一个交易;s5:设定输出交易的数量,循环s4的过程,直到长短期记忆网络输出预设的交易数量;将长短期记忆网络输出的交易作用到待测试智能合约中,对智能合约进行测试,检测智能合约的漏洞。2.根据权利要求1所述的基于长短期记忆网络的智能合约模糊测试方法,其特征在于,s2具体包括以下步骤:s2.1:对交易序列中调用的函数进行语义提取,得到交易序列的函数特征向量;s2.2:将交易序列中的参数、发送者和发送的以太坊代币数量转化为特征向量,并与所述函数特征向量结合,作为交易特征序列;s2.3:将智能合约中的变量值、函数被调用次数、智能合约的余额和智能合约在上一次调用时所执行的字节码频率转化为特征向量,作为状态特征序列。3.根据权利要求1所述的基于长短期记忆网络的智能合约模糊测试方法,其特征在于,长短期记忆网络的输出的交易的组成要素包括调用的函数、参数、发送者和以太坊代币数量。4.根据权利要求3所述的基于长短期记忆网络的智能合约模糊测试方法,其特征在于,从智能合约中选取交易序列中调用的函数,长短期记忆网络根据选取的函数输出一个函数特征向量。5.根据权利要求3所述的基于长短期记忆网络的智能合约模糊测试方法,其特征在于,从智能合约中选取出现频率最高的前n个的交易序列的参数,作为长短期记忆网络的输出的参数。6.根据权利要求3所述的基于长短期记忆网络的智能合约模糊测试方法,其特征在于,长短期记忆网络的输出的发送者为合约创建者、合约信任者或合约攻击者的任一种。7.根据权利要求3所述的基于长短期记忆网络的智能合约模糊测试方法,其特征在于,从智能合约中选取出现频率最高的前n个的交易序列的以太坊代币数量,作为长短期记忆网络的输出的以太坊代币数量。8.根据权利要求1所述的基于长短期记忆网络的智能合约模糊测试方法,其特征在于,s3中,采用交叉验证的方式,利用随机梯度下降方法对长短期记忆网络进行训练。9.根据权利要求1所述的基于长短期记忆网络的智能合约模糊测试方法,其特征在于,s4中,智能合约的漏洞包括自杀合约、依赖区块状态、未控制的程序错误、未验证的返回值、代币锁、代币泄露、交易顺序依赖和整数溢出。10.一种基于长短期记忆网络的智能合约模糊测试系统,其特征在于,包括:
数据收集模块,用于从以太坊中收集带有漏洞的智能合约并收集智能合约的漏洞触发时间点前的交易序列和状态序列,作为数据集;特征提取模块,用于对交易序列和状态序列进行特征提取,得到交易特征序列和状态特征序列;网络构建模块,用于构建长短期记忆网络,并利用交易特征序列和状态特征序列训练长短期记忆网络;测试模块,用于对智能合约进行测试,检测智能合约的漏洞。
技术总结
本发明提出一种基于长短期记忆网络的智能合约模糊测试方法及系统,包括:收集智能合约的漏洞触发时间点前的交易序列和状态序列并使用自然语言处理的方法将其进行特征化,得到交易特征序列和状态特征序列;构建并训练长短期记忆网络;将待测试智能合约的交易特征序列和状态特征序列输入到完成训练长短期记忆网络中,长短期记忆网络输出一个交易并作用到待测试智能合约中,对智能合约进行测试,检测智能合约的漏洞。通过对智能合约的交易序列和状态序列进行特征化处理,将复杂的交易信息和状态信息转化为能够充分表达交易信息和状态信息的交易特征序列和状态特征序列,能够有效地提高智能合约模糊测试的准确率。地提高智能合约模糊测试的准确率。地提高智能合约模糊测试的准确率。
技术研发人员:陈泓瑜 刘雅楠
受保护的技术使用者:广东共链科技有限公司
技术研发日:2021.12.03
技术公布日:2022/3/8