1.一种针对EOSIO智能合约的漏洞检测方法,该方法包括:
步骤1:对EOSIO区块链平台的链API与WebAssembly虚拟机进行插桩,插桩代码在智能合约运行期间记录其链API调用信息、代码覆盖率信息;
步骤2:对有源代码的智能合约,将智能合约源代码进行编译,生成智能合约ABI文件和WebAssembly字节码文件,对于无源代码的智能合约,直接读取其ABI文件和WebAssembly字节码文件;
步骤3:对智能合约WebAssembly字节码文件进行插桩,插桩代码在智能合约运行期间记录其执行路径;
步骤4:将智能合约字节码文件部署到本地区块链节点,解析智能合约ABI文件,获取智能合约的函数列表;
步骤5:根据步骤4获得的智能合约函数列表生成测试用例,并在区块链上执行;所述测试用例包括智能合约中函数列表的方法或函数,以及调用该方法或函数所需的参数;
步骤6:记录智能合约执行路径和代码覆盖率,判断执行路径是否符合测试预言,从而判断报告智能合约中的安全漏洞;所述代码覆盖率即代码执行率,所述测试预言指存在漏洞的智能合约可能的执行路径;
步骤7:根据代码覆盖率对测试用例进行变异,返回步骤5进行重复操作;
所述步骤1中的具体插桩方法为:
步骤A1:对EOSIO区块链平台的每个链API,在其实现函数入口处,插入代码记录链API调用信息,并将调用信息写入到日志文件;调用信息具体包括,链API的调用者、链API的调用时间以及调用链API使用的参数;
步骤A2:对WebAssembly虚拟机寻址和跳转逻辑进行插桩,其插桩方式为:搜索WebAssembly虚拟机源代码中处理跳转和函数调用的代码位置,即修改程序计数器PC的代码位置,并在这些位置处插入计算程序计数器PC的当前地址和跳转后的地址的代码,记录程序计数器PC的当前地址和跳转后的地址;
步骤A3:在步骤A2搜索到的插桩位置,插入代码对WebAssembly虚拟机的程序计数器PC的当前位置P1和跳转位置P2先进行一次异或运算,再对P1和P2进行一次移位运算,生成一个整数用于标识被测试智能合约的一条执行路径;
步骤A4:在步骤A2搜索到的插桩位置,插入统计被测试智能合约执行路径的代码,插入的代码将步骤A3生成的被测试合约的执行路径记录到智能合约代码覆盖率信息文件;
所述步骤3中的插桩方法为:
步骤B1:对智能合约WebAssembly字节码文件进行反汇编获得WAST文件,然后提取智能合约导入的函数签名;
步骤B2. 在WAST文件中搜索插桩位置,搜索插桩位置的具体确定方式为:搜索每个WAST文件中的函数定义区,对每个函数,定位该函数栈分配的指令序列;其中,栈分配指令序列的特征:首先是一条将栈指针变量读取到栈上的全局变量读取指令,再是一条将栈长度读取到栈上的32位整数入栈指令,最后是一条将栈指针变量减去栈长度变量生成新的栈指针变量的32位整数减法指令,这条32位整数减法指令结束的位置即为插桩位置;
步骤B3:在WAST文件函数导入段插入智能合约导入的函数签名;
步骤B4:在WAST文件中的步骤B2搜索到的每个插入位置,插入智能合约导入的函数调用的堆栈分配代码、函数调用代码和堆栈清理代码;
步骤B5:将WAST文件重新编译为WebAssembly文件,完成插桩。
2.如权利要求1所述的一种针对EOSIO智能合约的漏洞检测方法,其特征在于,所述步骤6中获取智能合约的执行路径的方法为:读取步骤1所述的对EOSIO区块链平台的链API的插桩代码产生的链API调用信息日志文件,并读取步骤3所述的对智能合约WebAssembly字节码的插桩代码产生的智能合约执行路径日志文件,两者共同组成智能合约的执行路径。
3.如权利要求1所述的一种针对EOSIO智能合约的漏洞检测方法,其特征在于,所述步骤6中计算代码覆盖率的方法为:读取步骤1中所述的WebAssembly虚拟机插桩代码产生的智能合约代码覆盖率信息,统计文件中标识执行路径的整数的数量,并将路径数量作为智能合约的代码覆盖率。
4.如权利要求1所述的一种针对EOSIO智能合约的漏洞检测方法,其特征在于,所述步骤6中的测试预言由用户根据拟检测的漏洞类型自行定义。
5.一种采用如权利要求1所述的针对EOSIO智能合约的漏洞检测方法的漏洞检测系统,该系统包括:测试用例生成模块、模糊测试控制器模块、智能合约运行信息收集模块;
所述测试用例生成模块实现:以代码覆盖率为导向的测试用例生成;通过解析被测合约的ABI文件,获得其函数调用所需的参数列表信息;首次模糊测试时,基于纯随机方式生成测试用例,并对其中的数据进行堆叠生成无结构化的种子文件以启动底层的灰盒模糊测试参数生成引擎;在后续的模糊测试过程中,底层参数生产引擎会根据模糊测试控制器模块反馈的代码覆盖率信息,不断产生新的输出字符串;根据存储的参数列表信息,通过按位截取、类型强转以及结构化组合可生成符合智能合约函数语义的测试用例;
所述模糊测试控制器模块实现:智能合约测试环境构建、智能合约模糊测试过程控制、漏洞检测在内的逻辑控制;
所述智能合约运行信息收集模块是一个对链API和WebAssembly虚拟机寻址和跳转逻辑进行了插桩的EOSIO本地节点;
其中,智能合约运行信息收集模块对链API的插桩方式为:对EOSIO区块链平台的每个链API,在其实现函数入口处,插入代码记录链API调用信息,并将调用信息写入到日志文件;调用信息具体包括,链API的调用者、链API的调用时间以及调用链API使用的参数。
6.如权利要求5所述的一种针对EOSIO智能合约的漏洞检测系统,其特征在于,所述模糊测试控制器模块中实现智能合约测试环境构建、智能合约模糊测试过程控制、漏洞检测在内的逻辑控制的方法为:所述智能合约测试环境构建:在对智能合约进行模糊测试之前,对有源代码的智能合约进行智能合约源代码编译,生成智能合约ABI文件和WebAssembly字节码文件,对于无源代码的智能合约,直接读取其ABI文件和WebAssembly字节码文件;随后解析智能合约的ABI文件,读取智能合约的函数列表;随后,模糊测试控制器模块对智能合约WebAssembly字节码文件进行反汇编获得WAST文件,然后提取智能合约导入的函数签名,随后在WAST文件中搜索插桩位置,插入代码以在智能合约执行时记录其执行路径信息,插桩位置的具体确定方式为:搜索每个WAST文件中的函数定义区,对每个函数,定位该函数栈分配的指令序列;
其中,栈分配指令序列的特征首先是一条将栈指针变量读取到栈上的全局变量读取指令,然后是一条将栈长度读取到栈上的32位整数入栈指令,最后是一条将栈指针变量减去栈长度变量生成新的栈指针变量的32位整数减法指令,这条32位整数减法指令结束的位置即为插桩位置,随后在WAST文件函数导入段插入智能合约导入的函数签名,并在WAST文件中的每个插入位置,插入智能合约导入的函数调用的堆栈分配代码、函数调用代码和堆栈清理代码;最后将智能合约字节码文件部署到智能合约运行信息收集模块,为智能合约构建测试环境;
所述智能合约模糊测试过程控制:加载欲检测的智能合约安全漏洞的检测配置,读取检测配置中的智能合约名和模糊测试轮数N,从测试用例生成引擎模块读取为智能合约生成的测试用例交易,并提交给智能合约运行信息收集模块执行该交易以执行对智能合约的攻击行为,在进行N轮测试后,退出该合约的模糊测试过程控制逻辑,在每一轮测试结束后,模糊测试控制器模块会获得智能合约信息收集模块产生的代码覆盖率信息,并将该代码覆盖率信息反馈给测试用例生成模块;
所述漏洞检测:每次模糊测试控制器模块进行1轮模糊测试后,从智能合约运行信息收集器中获取当前1轮测试智能合约的执行路径信息,并于检测配置定义的测试预言进行对比,若智能合约的执行路径包含测试预言定义的模式,则报告当前智能合约存在安全漏洞。