一种针对EOSIO智能合约的漏洞检测方法及系统技术方案

技术编号:34801006 阅读:10 留言:0更新日期:2022-09-03 20:07
本发明专利技术公开了一种针对EOSIO智能合约的漏洞检测方法及系统,属于区块链智能合约技术领域。对EOSIO智能合约进行灰盒测试,发现并报告EOSIO智能合约中存在的安全漏洞,用以提升区块链中智能合约的安全性,减少因智能合约安全漏洞造成的经济损失。本发明专利技术能够对EOSIO智能合约进行充分测试,与现有EOSIO智能合约漏洞检测方法相比,具有代码覆盖率高、检测准确性高的优点,因此能够提高EOSIO智能合约漏洞挖掘的准确性、效率和自动化程度,充分分析智能合约潜在的安全漏洞,提高智能合约的安全性,避免不必要的损失。避免不必要的损失。避免不必要的损失。

【技术实现步骤摘要】
一种针对EOSIO智能合约的漏洞检测方法及系统


[0001]本专利技术属于区块链智能合约
,具体为一种针对EOSIO智能合约灰盒模糊测试方法及系统,处理对象为EOSIO智能合约字节码及ABI文件,可检测EOSIO智能合约字节码中存在的安全漏洞。

技术介绍

[0002]针对智能合约漏洞检测的研究根据其检测方法,可分为以下三类:
[0003]形式化验证方法通过语法分析、控制流分析与数据流分析对智能合约源码或字节码进行扫描,并建立抽象语法树、控制流图、数据流图,进而采用形式化工具对智能合约的执行过程进行建模、分析和验证。此类工具的代表性工具有EVulHunter和Slither等,EVulHunter将EOSIO智能合约的WebAssembly字节码文件进行解析以生成控制流图,并使用预定义模式匹配控制流图中匹配与智能合约漏洞相关的代码块。EVulHunter仅支持两种EOSIO智能合约安全漏洞,其使用的预定义模式依赖于已知的攻击手段,一旦攻击手段发生变化,EVulHunter必须重新生成预定义模式,且预定义模式的生成必须手工从智能合约中提取和总结,限制了漏洞支持类型的扩展。Slither是面向以太坊智能合约的漏洞检测工具,Slither将以太坊智能合约编译后的Solidity抽象语法树作为输入,经过数据整合获得智能合约的类型继承图、控制流图,分析以太坊智能合约中变量、函数的依赖关系,变量的读写以及函数权限控制等信息,并从这些信息中搜索与安全漏洞匹配的模式。Tikhomirov等人提出了SmartCheck,一个基于分类的以太坊智能合约安全漏洞检测工具,SmartCheck能够处理Solidity编写的以太坊智能合约字节码,并将字节码转化为XML形式,随后分析转化得到的XML文件中的XPath路径检测以太坊智能合约中的安全漏洞。Wang等人提出了ContractWard,与其他同类工具不同,ContractWard结合了形式化验证方法和机器学习技术的优点,通过训练一个针对漏洞模式的机器学习模型,降低了静态检测的时间开销。但这三者使用的漏洞模式是以太坊智能合约独有的,无法应用于EOSIO智能合约。第二,以太坊智能合约使用被编译为Solidity字节码,并在以太坊的EVM虚拟机中执行,而EOSIO智能合约使用C/C++语言编写,被编译为WebAssembly字节码并在WebAssembly虚拟机中执行,二者的体系结构,类型系统以及执行环境都存在着根本性的不同,因此,一种专门用于以太坊或基于EVM虚拟机的漏洞检测工具,无法被移植用于EOSIO智能合约安全漏洞的检测。此外,形式化验证方法用于智能合约漏洞挖掘本身就存在较大的限制,由于区块链本身可以被看作是一个巨大的状态机,智能合约的执行路径不仅与合约接收的输入与合约本身的程序上下文有关,还依赖于合约执行时的区块链状态,因此缺乏区块链状态信息的形式化验证方法可能将在真实环境中不可能被执行的代码被错误判断存在安全漏洞,导致误报率提高。类似地,静态分析方法也无法解决与身份验证,机密数据的存储与传输相关的智能合约安全漏洞检测问题。
[0004]模糊测试方法通过向智能合约发送测试交易,并对智能合约的执行行为进行记录和分析,判断其是否符合安全漏洞的测试预言。此类工具的代表性工作有Con

tractFuzzer,EOSFuzzer以及Echidna等。Con

tractFuzzer是一个针对以太坊智能合约的黑盒模糊测试工具,定义了7种以太坊智能合约安全漏洞的测试预言,ContractFuzzer首先从以太坊智能合约的应用二进制接口中获取智能合约的函数签名,生成符合应用二进制接口规范的模糊测试输入,随后在本地EVM虚拟机中使用智能合约执行该测试输入并记录智能合约的执行日志,最后检测执行日志是否与测试预言相符。但是,EOSIO智能合约的交互方式与以太坊智能合约差异极大,例如,EOSIO合约转账必须通过调用系统合约eosio.token进行,且EOSIO使用了基于角色的权限管理,其交易的签名和鉴权方式与以太坊具有显著的差异,使得基于EVM虚拟机的漏洞检测工具,无法用于EOSIO智能合约的检测。EOSFuzzer作为针对EOSIO智能合约的黑盒模糊测试工具,与ContractFuzzer的漏洞检测原理类似,但EOSFuzzer定义了3种EOSIO智能合约安全漏洞的测试预言,并使用一个本地EOSIO节点作为智能合约的模糊测试执行环境。智能合约的模糊测试测试方法,从本质上来说,就是将被测合约部署在本地的私链上,并使用基于智能合约接口规则的模糊测试用例与被测合约交互。由于被测合约在测试进行时,已被部署到区块链上,因此模糊测试方法能够利用区块链状态以及合约间交互的方式触发漏洞,解决了形式化验证方法误报率高和不能解决与身份验证,加密数据存储和传输相关的安全漏洞的问题。但是,现有工具都是基于纯黑盒的模糊测试,模糊测试输入的生成和变异仅能利用与现有漏洞攻击手法的先验经验,存在一定的盲目性,没有考虑程序内部执行情况,从而导致当前针对WebAssembly智能合约的模糊测试工具代码覆盖率低,从而造成大量漏报。
[0005]符号执行方法符号执行技术在1970年被提出,并在近年成为研究热点。其采用抽象的符号代替确定的变量值作为程序输入,得出每个路径抽象的输出结果。与黑盒模糊测试方法相比,符号执行方法能够高效地探索智能合约的执行路径,达到接近100%的代码覆盖。由于符号执行方法大多基于x86/x64结构,而智能合约的字节码文件在体系结构,程序组织和存储形式上存在差异,因此符号执行方法在智能合约领域的应用需要首先解决函数接口识别,变量类型推断等问题。J.Caballero等人提出了从x86/x64架构二进制程序提取关键代码,识别其中的程序接口及函数签名,并将这些信息用于对x86/x64程序的符号执行,以提升安全工具性能的方法。Albert等人提出了一种能够将以太坊虚拟机字节码转化为基于规则的表示形式的方法,降低了对以太坊智能合约字节码进行符号执行的难度。智能合约安全漏洞检测领域,也存在一类基于符号执行方法的安全工具,此类工具的代表性工作有WANA,Mythril以及Mythx等。WANA是一个针对以太坊和EOSIO智能合约的安全漏洞检测框架,其使用符号执行引擎探索智能合约执行路径,当发现从缺陷代码到代币转账函数之间存在可达的执行路径时,即报告漏洞存在。与形式化验证方法类似,这种检测方法同样未能考虑到智能合约实际执行时的区块链状态,只能判定缺陷代码与转账函数之间存在执行路径,但当执行路径上存在账户鉴权行为时,该路径在实际链上执行时可能并不可达,从而造成误报,在实验中,我们观察到这种现象并不罕见。此外,WANA定义的缺陷代码模式同样是使用硬编码方式定义,仅定义了EOSIO智能合约的两种缺陷代码模式,与常见的8种安全漏洞相比,检测能力不足,且硬编码的缺陷代码定义方式限制了WANA的进一步扩展。Mythril是一个EVM字节码安全分析工具,它能够使用符号执行,约束求解以及污点分析方法检测基于EVM虚拟本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种针对EOSIO智能合约的漏洞检测方法,该方法包括:步骤1:对EOSIO区块链平台的链API与WebAssembly虚拟机进行插桩,插桩代码在智能合约运行期间记录其链API调用信息、代码覆盖率信息;步骤2:对有源代码的智能合约,将智能合约源代码进行编译,生成智能合约ABI文件和WebAssembly字节码文件,对于无源代码的智能合约,直接读取其ABI文件和WebAssembly字节码文件;步骤3:对智能合约WebAssembly字节码文件进行插桩,插桩代码在智能合约运行期间记录其执行路径;步骤4:将智能合约字节码文件部署到本地区块链节点,解析智能合约ABI文件,获取智能合约的函数列表;步骤5:根据步骤4获得的智能合约函数列表生成测试用例,并在区块链上执行;所述测试用例包括智能合约中函数列表的方法或函数,以及调用该方法或函数所需的参数;步骤6:记录智能合约执行路径和代码覆盖率,判断执行路径是否符合测试预言,从而判断报告智能合约中的安全漏洞;所述代码覆盖率即代码执行率,所述测试预言指存在漏洞的智能合约可能的执行路径;步骤7:根据代码覆盖率对测试用例进行变异,返回步骤5进行重复操作。2.如权利要求1所述的一种针对EOSIO智能合约的漏洞检测方法,其特征在于,所述步骤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.如权利要求1所述的一种针对EOSIO智能合约的漏洞检测方法,其特征在于,所述步骤3中的插桩方法为:步骤B1:对智能合约WebAssembly字节码文件进行反汇编获得WAST文件,然后提取智能合约导入的函数签名;步骤B2.在WAST文件中搜索插桩位置,搜索插桩位置的具体确定方式为:搜索每个WAST文件中的函数定义区,对每个函数,定位该函数栈分配的指令序列;其中,栈分配指令序列的特征:首先是一条将栈指针变量读取到栈上的全局变量读取指令,再是一条将栈长度读取到栈上的32位整数入栈指令,最后是一条将栈指针变量减去栈长度变量生成新的栈指针变量的32位整数减法指令,这条32位整数减法指令结束的位置即为插桩位置;
步骤B3:在WAST文件函数导入段插入智能合约导入的函数签名;步骤B4:在WAST文件中的步骤B2搜索到的每个插入位置,插入智能合约导入的函数调用的堆栈分配代码、函数调用代码和堆栈清理代码;步骤B5:将WAST文件重新编译为WebAssembly文件,完成插桩。4.如权利要求1所述的一种针对EOSIO智能合约的漏洞检测方法,其特征在于,所述步骤6中获取智能合约的执行路径的方法为:读取步骤1所述的对EOSIO区块链平台的链API的插桩代码产生的链API调用信息日志文件,并读取步骤3所述的对对智能合约WebAssembly字节码的插桩代码产生的智能合约执行路径日志文件,两者共同组成智能合约的执行路径。5.如权利要求1所述的一种针对EOSIO智能合约的漏洞检测方法,其特征在于,所述步骤6中计算代码覆盖率...

【专利技术属性】
技术研发人员:刘洋洋周健飞陈厅蒋天星宋书玮程曦吴昊
申请(专利权)人:电子科技大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1