1.智能合约交易顺序依赖漏洞变异模糊测试方法,其特征在于包括以下步骤:
(1)编译被测智能合约,生成智能合约字节码和智能合约应用程序二进制接口,其中编译后的智能合约字节码以十六进制形式表示,包含三个部分:部署代码、智能合约代码、智能合约加密指纹;
(2)根据被测智能合约应用程序二进制接口模糊生成测试数据,具体过程为:首先解析被测智能合约应用程序二进制接口,提取所有函数签名,函数签名包括函数描述以及每个函数参数的数据类型,智能合约函数参数数据类型如果是地址类型,地址数据类型的测试数据模糊生成过程为:首先对被测智能合约的每一个应用程序二进制接口生成私有的智能合约池,智能合约池中存放所有支持该应用程序二进制接口中的函数所调用的智能合约的地址,然后随机选择智能合约池中存放的智能合约地址作为测试数据;如果智能合约函数参数数据类型是定长类型参数,随机地从参数的合法测试数据域中选择一组数值作为测试数据;如果智能合约函数参数数据类型是不定长类型参数,首先随机地生成一个正数作为该参数的长度,随后再对参数中的各个元素随机地从合法测试数据域中选择一组数值作为测试数据;
(3)被测智能合约插桩,具体过程为:调换智能合约中最后两个函数产生的两个不同函数调用顺序的被测智能合约,对原被测智能合约和调换最后两个函数后的被测智能合约字节码都进行函数插桩和分支覆盖插桩:被测智能合约的每个函数插入函数桩,函数内每个分支点插入分支桩;
(4)部署被测智能合约,具体过程为:以太坊虚拟机创建智能合约账户,运行步骤(3)插桩后的两个被测智能合约的部署代码,并将智能合约代码和智能合约加密指纹存储到区块链上,再将二者的存储地址赋值给智能合约账户中的代码哈希字段;
(5)监测被测智能合约执行过程,具体过程为:在部署的被测智能合约上执行生成的测试数据,记录2个被测智能合约的分支覆盖信息和交易顺序依赖漏洞的指令信息,具体为:执行一个测试数据,记录测试数据执行的智能合约中每个分支的覆盖次数,同时获取每个分支指令中包含的当前函数对应的发送的以太币值;在执行完所有的测试数据后,所有测试数据的分支覆盖信息和函数中发送的以太币值都保存在执行日志中;
(6)被测智能合约交易顺序依赖漏洞检测,具体过程为:对每一个测试数据,在执行日志中获取每个函数中发送的以太币值,如果存在相同函数中发送的以太币值不相同,则返回该测试数据检测到交易顺序依赖漏洞,输出发现交易顺序依赖漏洞的检测结果;如果所有相同的函数中发送的以太币值均相同,则本测试数据没有检测出交易顺序依赖漏洞,进入步骤(7);
(7)判断交易顺序依赖漏洞检测时间是否超过用户自定义的检测时间,如果检测时间超过用户自定义的检测时间,用户自定义时间默认为120秒,则输出未发现交易顺序依赖漏洞的检测结果,测试结束;如果检测时间未超过用户自定义的检测时间则进入步骤(8)基于已有的测试数据分支覆盖信息变异生成覆盖新分支的新测试数据;
(8)变异生成覆盖新分支的测试数据,具体过程为:将该测试数据通过变异操作生成新的测试数据,其中包括4个变异操作,变异操作1:根据位或字节进行翻转,变异操作2:以单字节、双字节、四字节为单位进行加减操作,变异操作3:删除、复制、重写、插入新的字节块,变异操作4:两个测试数据随机选取位置进行交叉互换;根据执行日志可以判断出当前测试数据是否可以覆盖到新的分支,如果覆盖到则保留覆盖新分支的测试数据进入步骤(5),如果没有覆盖到新的覆盖分支则进入步骤(7)。