CN113051574B - 一种智能合约二进制代码的漏洞检测方法 - Google Patents
一种智能合约二进制代码的漏洞检测方法 Download PDFInfo
- Publication number
- CN113051574B CN113051574B CN202110265675.9A CN202110265675A CN113051574B CN 113051574 B CN113051574 B CN 113051574B CN 202110265675 A CN202110265675 A CN 202110265675A CN 113051574 B CN113051574 B CN 113051574B
- Authority
- CN
- China
- Prior art keywords
- instruction
- path
- vulnerability
- call
- jump
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明属于区块链智能合约安全检测技术领域,具体涉及一种智能合约二进制代码的漏洞检测方法。面向复杂漏洞类型,本发明采用动静态结合的检测方法,使用符号执行方法帮助减少模糊匹配方法的开销。针对一般漏洞,本发明提出基于关键指令的静态检测方法,首先反编译字节码生成控制流图CFG,同时为不同类别的漏洞定义了不同的关键指令及规则,使用Z3约束求解引擎进行符号表达式建模,解决了EVM中数据长度为符号表达式的指令的符号建模问题,并通过提取关键路径生成可能利用漏洞的执行路径。本发明解决了智能合约漏洞检测技术手段单一、漏洞检测大多针对合约源代码问题,实现了在仅给定一个合约二进制代码的情况下对其进行漏洞检测。
Description
技术领域
本发明属于区块链智能合约安全检测技术领域,具体涉及一种智能合约二进制代码的漏洞检测方法。
背景技术
以太坊智能合约安全漏洞问题日益重要,目前已被以太坊验证的合约多达百万级别,其中,有上传源码的合约只占了小部分,二进制代码成为以太坊的主流。不同于传统高级程序言语,solidity开发的智能合约有很多自己的特色,比如fallback函数和转账函数。鉴于智能合约的不可篡改,近几年也发生很多针对合约的安全攻击(比如DAO),导致了巨额经济损失。为了解决上述问题,本发明提出针对智能合约二进制代码的漏洞检测方法。不同于传统智能合约的静态漏洞检测方法,我们提出基于关键指令识别二进制代码漏洞的检查模式,同时形成静态规则匹配与动态模糊匹配结合的优化策略,实现对逻辑复杂漏洞(比如可重入漏洞)的精准安全检测。
目前主要的智能合约漏洞检测手段有:形式化验证、模糊测试、符号执行等方法,具体分析:形式化方法的优点在于整个验证过程具有数学逻辑上的完备性,能保证100%的检测精度,缺点在于需要人工参与建模和推理过程,效率十分低下;模糊测试生成用例的随机性,其所能涵盖的执行路径有限,路径覆盖率低,很难发现潜在的漏洞;基于符号执行的静态漏洞检测工具多数依赖于已有的专家规则,无法识别复杂逻辑漏洞且误报率较高。
上述合约漏洞检测方法主要针对合约的源代码进行分析,而在实际的以太坊网路中,绝大多数合约只有字节码而缺少源代码,同时在漏洞分析中需要收集的信息仅在字节码级别可见,例如gas消耗指令在EVM指令中才能提取,且如果使用源码进行漏洞分析,编译器执行的优化可能会影响分析结果。因此,针对智能合约字节码的漏洞检测问题亟待解决。
发明内容
本发明的目的在于。解决智能合约漏洞检测技术手段单一,漏洞检测大多针对合约源代码问题,提供在仅给定一个合约二进制代码的情况下实现对其进行漏洞检测的一种智能合约二进制代码的漏洞检测方法。
本发明的目的通过如下技术方案来实现:包括以下步骤:
步骤1:输入待检测的字节码文件,对字节码文件执行反编译,生成EVM指令及相应的参数;根据反编译后的EVM指令重建控制流图CFG;
步骤2:利用A*路径探索算法进行路径探索,生成初步路径集合;
步骤3:根据每种漏洞的相应规则对初步路径集合进行逻辑表达式匹配,提取关键路径,生成可能存在漏洞隐患的执行路径;
步骤3.1:使用Z3固定大小的位向量表达式对数据长度是固定值的CALL、REVERT、GAS、TIMESTAMP以及NUMBER指令进行建模;
以CALL指令为例,使用Z3固定大小的位向量表达式对CALL指令进行建模:
α′m[retOffset+i]←BitVector('instruction_name+i',8)
其中,αm表示内存存储;BitVector即Z3的位向量表达式;retOffset为CALL指令的第6个参数,表示CALL指令返回数据的内存地址;instruction_name是指令的名称,这里为‘CALL’;i为数据长度,从0一直循环到数据总长度,即CALL指令的第7个参数;
步骤3.2:使用Z3的If表达式对数据长度为符号表达式的DELEGATECALL、SELFDESTRUCT、CALLDATACOPY、CALLDATALOAD以及CALLVALUE指令进行建模;
以CALLDATACOPY为例,使用Z3的If表达式对CALLDATACOPY指令进行建模:
α′m[destOffset+i]←If(i<length,EI[offset+i],αm[destoffset+i])
其中,CALLDATACOPY指令表示将字节从给定的调用数据复制到内存中,它对可变长度数据进行操作,CALLDATALOAD指令会读取CALLDATACOPY指令所复制的数据;EI为当前指令执行的符号环境;destOffset、offset、length为CALLDATACOPY指令的前三个参数,分别代表目的数据地址、源数据地址、数据长度;If即Z3的If表达式,i为复制数据的长度,从0循环到length;
步骤3.3:可重入漏洞规则匹配;
检查路径中CALL指令调用链,并检查CALL指令的第一个堆栈参数Gas是否大于2300以及第三个堆栈参数value是否大于0,同时检查算数逻辑指令是否出现在CALL指令之后;若满足以上规则,则提取该路径作为关键路径;
步骤3.4:Gas耗尽终止漏洞规则匹配;
检查路径中是否存在send()函数,即检查是否存在CALL指令,且CALL指令的第三个参数value是否为0,同时GAS指令的参数≤2300;最后检查是否出现REVERT指令;若满足以上规则,则提取该路径作为关键路径;
步骤3.5:委托调用漏洞规则匹配;
检查路径中是否存在DELEGATECALL和SELFDESTRUCT指令,且DELEGATECALL指令的参数中是否存在CALLDATALOAD以及CALLVALUE;若满足以上规则,则提取该路径作为关键路径;
步骤3.6:时间戳依赖漏洞规则匹配;
检查路径中是否存在TIMESTAMP以及NUMBER指令,同时检查是否存在CALL指令,且GAS≤2300;最后检查是否存在CALL指令,且第三个参数value>0;若满足以上规则,则提取该路径作为关键路径。
本发明还可以包括:
所述的步骤1中对字节码文件执行反编译的方法具体为:首先加载字节码code,之后从code中解析一个指令op,并根据相应指令长度解析后面的参数;在解析PUSH指令过程中,单独解析PUSH4指令,因为PUSH4指令会将抽取4bytes的函数的计算函数标识符推送到堆栈,在有合约源码的情况下,可结合源码解析生成函数名称;最后根据解析的指令和参数,循环生成基础块,直到所有字节码code都完成解析。
所述的步骤1中根据反编译后的EVM指令重建控制流图CFG的方法具体为:所述的CFG由基础块组成,每个基础块以非跳转指令开头,以跳转或终止指令作为结束;由于构建CFG需梳理各个基础块的跳转关系,所以需要解析基础块中的跳转指令JUMP和JUMPI;构建CFG首先找到基础块间明显的跳转关系,同时,尚未计算的跳转指令被标记为未解析状态;其次,选择一个CFG子图中未解析的跳转指令,推断其跳转目标的逆向指令集,执行该指令以计算跳转目标,并将该指令标记为已解析状态,最后添加到CFG中;由于新引入的跳转关系可能导致构建的CFG子图出现新的跳转指令,所以该子图中跳转指令都需再次标记为未解析状态,重复此过程,直到所有跳转指令都被标记为已解析状态。
本发明的有益效果在于:
本发明解决了智能合约漏洞检测技术手段单一、漏洞检测大多针对合约源代码问题,针对代码重入、委托调用、时间戳依赖、Gas耗尽终止这四类漏洞,提出了一种面向智能合约字节码的漏洞安全检测方法。本发明实现了在仅给定一个合约二进制代码的情况下对其进行漏洞检测。面向复杂漏洞类型比如可重入漏洞,本发明采用动静态结合的检测方法,使用符号执行方法帮助减少模糊匹配方法的开销。针对一般漏洞,本发明提出基于关键指令的静态检测方法,首先反编译字节码生成控制流图CFG,同时为不同类别的漏洞定义了不同的关键指令及规则,使用Z3约束求解引擎进行符号表达式建模,解决了EVM中数据长度为符号表达式的指令的符号建模问题,并通过提取关键路径生成可能利用漏洞的执行路径。本发明可有效地发现大量智能合约存在的漏洞,且准确度较高。本发明有助于在智能合约漏洞造成损失之前发现和预防漏洞,避免不可估量的经济损失。
附图说明
图1为本发明的流程图。
图2为本发明中智能合约字节码反编译算法的伪代码图。
图3为本发明中智能合约CFG生成的示意图。
图4为本发明中路径生成的示意图。
具体实施方式
下面结合附图对本发明做进一步描述。
本发明属于区块链智能合约安全检测技术领域,涉及一种智能合约二进制代码的漏洞检测方法。本发明的目的是为解决智能合约漏洞检测技术手段单一,漏洞检测大多针对合约源代码问题,而提供一种面向智能合约字节码的漏洞安全检测方法,在仅给定一个合约二进制代码的情况下对其进行漏洞检测。本发明基于符号执行方式进行漏洞检测,其中,通过反编译字节码生成控制流图CFG,同时为不同类别的漏洞定义了不同的关键指令及规则,通过提取关键路径,生成可能存在漏洞隐患的执行路径。
本发明的目的是这样实现的:首先需要反编译字节码文件,经过反编译的字节码会生成EVM指令(即opCode)及相应的参数。之后根据反编译后的EVM指令重建控制流图CFG(Control Flow Graph),通过扫描CFG,可以更清楚的知道合约的执行流向。最后提取关键路径,关键路径由关键指令和规则共同决定。
如图1所示,本发明公开的基于关键指令的智能合约漏洞检测方法,包括如下步骤:
反编译及CFG构建,经过反编译的字节码会生成EVM指令(即opCode)及相应的参数。之后根据反编译后的EVM指令重建控制流图CFG。
关键指令及规则定义,本方案依据不同漏洞的特点,为漏洞定义相应的关键指令及漏洞检测规则。
利用A*路径探索算法生成执行路径,并通过对指令进行符号化建模,从而对生成的路径进行规则匹配,提取出关键路径。
下面对本发明公开的基于关键指令的智能合约漏洞检测方法作进一步的说明。
一、CFG构建
由于需要对合约执行流进行构建分析,所以需要对合约的CFG进行构建,通过扫描CFG,可以更清楚的知道合约的执行流向,且关键路径的提取也是基于CFG的。
1.字节码反编译
构建CFG首先必须对二进制字节码文件进行反编译,只有通过反编译字节码,才能解析EVM指令及其参数。基础块是一系列指令及其参数的集合,CFG是由基础块组成,其中每个基础块以非跳转指令开头,以跳转或终止指令(例如STOP、JUMP、JUMPI、RETURN、REVERT、SELFDESTRUCT等)作为结束。本方案中实现了一个字节码反编译算法,算法伪代码如图2所示。
算法的输入是字节码,算法的输出是多个基础块。算法首先加载字节码code,之后从code中解析一个指令op,并根据相应指令长度解析后面的参数。在解析PUSH指令过程中,单独解析PUSH4指令,因为PUSH4指令会将抽取4bytes(uint32)的函数的计算函数标识符推送到堆栈,在有合约源码的情况下,可结合源码解析生成函数名称。最后根据解析的指令和参数,循环生成基础块,直到所有字节码code都完成解析。
2.CFG生成
CFG是提取关键路径的基础,由于构建CFG需梳理各个基础块的跳转关系,所以需要解析基础块中的跳转指令(JUMP和JUMPI)。
如图3所示,构建CFG首先找到基础块间明显的跳转关系,例如,在基础块162和基础块694中找到两组跳转指令PUSH2 0x2f2和JUMP,表示跳转到地址0x2f2,即基础块754,它将基础块162、基础块694、基础块754构成一个CFG子图。同时,尚未计算的跳转指令(JUMP和JUMPI)被标记为未解析状态。其次,选择一个CFG子图中未解析的跳转指令,推断其跳转目标的逆向指令集,执行该指令以计算跳转目标,并将该指令标记为已解析状态,最后添加到CFG中。由于新引入的跳转关系可能导致构建的CFG子图出现新的跳转指令,所以该子图中跳转指令都需再次标记为未解析状态,重复此过程,直到所有跳转指令都被标记为已解析状态。
如图3(a)所示,基础块162、基础块694、基础块754构成一个CFG子图,当执行到基础块754中最后一行的JUMP指令,出现两个逆向指令,分别为基础块694和基础块162中的两个PUSH2指令,说明此时基础块754引入两个新的跳转关系:基础块754→基础块1435、基础块754→基础块1456,最终形成如图3(b)所示的新控制流程图。
二、关键指令及规则分析
1.可重入漏洞
1)漏洞特点分析
在Solidity中主要有三种转账方法,分别是transfer()、send()、call(),区别如下:
表1 transfer()、send()、call()的区别
经过编译之后,这三个函数都会被编译成CALL指令。通过表2可知,当使用call()调用时会发送全部的Gas,这为攻击者有足够的Gas利用fallback函数进行重入创造了条件。此外,资产记录的改变,在实际转账后这也会带来漏洞风险,通过call.value转账导致重入,若资产记录的修改在转币之后,则会导致重入绕过验证,形成恶意转账,掏空智能合约的所有代币。
2)关键指令及规则
依据可重入漏洞特点可得:当有一个函数调用通过一系列调用调用回自身时,可重入性漏洞就可能会发生。为此针对可重入漏洞定义了如下关键指令:
表2可重入漏洞关键指令
依据关键指令,定义可重入漏洞具体漏洞检测规则如下:
a)对于一个函数A,检查函数调用A是否在源自调用A的调用链中出现了不止一次。即检查EVM底层的CALL指令调用链;
b)检查函数中存在call()调用且满足value>0且Gas足够多。即检查CALL指令的第一个堆栈参数Gas以及第三个堆栈参数value;
c)资产记录的改变,在实际转账后。即检查算数逻辑指令与CALL指令出现的先后顺序。
2.Gas耗尽终止漏洞
1)漏洞特点分析
当以太坊执行send()函数时,Gas limit为2300wei,同时接收方的fallback函数会被调用,而当接收者的fallback函数中可能会花费很多的Gas时,会触发out-of-gas异常,且send()发送失败只会返回false,如果这种异常没有得到适当的检查和传播,会造成发送失败却不知情的情况。
2)关键指令及规则
依据Gas耗尽终止漏洞特点可得,检测该漏洞,主要检查方法中是否有send()函数,以及是否有out-of-gas异常,为此针对Gas耗尽终止漏洞定义如下关键指令:
表3 Gas耗尽终止漏洞关键指令
依据关键指令,定义Gas耗尽终止漏洞具体漏洞检测规则如下:
a)检查函数中是否存在send()调用,可以判断调用的输入是否是0且剩余的Gas是否小于2300。即检查是否存在CALL指令,且CALL指令的第三个参数value是否为0,同时GAS≤2300;
b)检查在send()调用中,是否发生out-of-gas异常。即检查程序执行过程中是否返回ErrOutOfGas异常码,且调用REVERT指令进行回滚。
3.委托调用漏洞
1)漏洞特点分析
除了call()方法之外,delegatecall()也可以用于合约之间的相互调用,然而,与call()不同的是,delegatecall()在调用过程中,使用的是调用者存储的上下文环境,因此不当使用delegatecall()会导致非预期代码的执行。
2)关键指令及规则
依据委托调用漏洞特点可知,检测该漏洞,主要检查在当前合约的执行过程中是否调用了deletegate()函数,以及委托调用所调用的函数是否从合约初始调用的输入(例如,msg.data)中获得的。为此针对委托调用漏洞,定义如下关键指令:
表4委托调用漏洞关键指令
依据关键指令,定义委托调用漏洞具体漏洞检测规则如下:
a)检查在当前合约的执行过程中是否存在危险的delegatecall()调用,即检查是否存在DELEGATECALL和SELFDESTRUCT指令;
b)检查delegatecall()的调用地址和调用的字符序列是否由调用者传入,即检查DELEGATECALL指令的参数中是否存在CALLDATALOAD以及CALLVALUE。
4.时间戳依赖漏洞
1)漏洞特点分析
当智能合约使用区块的时间戳来作为某些操作的触发条件时,这些时间戳引用可能被恶意矿工所利用,矿工可以通过设置区块链的时间戳来满足对其有利的条件。
2)关键指令及规则
依据时间戳依赖漏洞特点可得,检测该漏洞,主要检查合约中是否有时间戳引用,这些时间戳引用可能被恶意矿工所利用。针对时间戳依赖漏洞定义了如下关键指令:
表5时间戳依赖漏洞关键指令
依据关键指令,定义时间戳依赖漏洞具体漏洞检测规则如下:
a)检查合约或函数中是否有now、block.timestamp、block.number等时间戳操作码。即检查是否存在TIMESTAMP以及NUMBER指令;
b)检查函数中是否调用了send()或transfer()。即检查是否存在CALL指令,且GAS≤2300。
c)检查函数中存在call()调用且value>0。即检查是否存在CALL指令,且第三个参数value>0。
三、基于关键路径的漏洞检测
关键路径由关键指令和规则共同决定。为提取关键路径,需基于CFG进行路径生成,之后根据相应的漏洞检测规则,从生成的路径集合中匹配关键路径。
1.路径生成
由于对CFG的路径探索是典型的静态路网中求解路径的问题,所以本发明使用A*算法探索路径。其中路径的代价定义为该路径在CFG中遍历的分支数。例如图4中由基础块156、694、754、1435所构成的路径156→694→754→1435经历了两个分支,则从基础块156到基础块1435路径代价为2。从每类漏洞的关键指令集选择一个指令,利用A*算法进行路径探索,在每一步之后,检查是否仍然可以从当前路径访问关键指令集中至少一个其他剩余的指令,如果无法访问,则放弃对该路径的进一步探索,路径生成示意图如图4所示。
2.规则匹配
进行初步探索后会形成初步路径集合,在根据每个漏洞的相应规则进行逻辑表达式匹配,找出符合规则的路径,这需要解析路径中每个指令及其参数,完成EVM指令到符号表达式的转换。而规则匹配的难点是对EVM指令进行符号化建模。
1)可重入漏洞规则匹配
依据可重入漏洞检测规则,若要对初步生成的路径进行规则匹配,需要对CALL以及算数运算指令进行建模。而CALL以及算数运算指令都是典型的数据长度是固定值的指令。
本发明使用Z3约束求解器对指令进行建模。对CALL等数据长度是固定值的指令,使用Z3固定大小的位向量表达式建模,如公式1所示。
α′m[retOffset+i]←BitVector('instruction_name+i',8) 公式1
其中αm表示内存存储,BitVector即Z3的位向量表达式,retOffset为CALL指令的第6个参数,表示CALL指令返回数据的内存地址。instruction_name是指令的名称,这里为‘CALL’。i为数据长度,从0一直循环到数据总长度,即CALL指令的第7个参数。每一次循环,从内存中读取固定8bit的数据,直到循环结束。
对指令完成建模后,依据检测规则,检查路径中CALL指令调用链,并检查CALL指令的第一个堆栈参数Gas是否大于2300以及第三个堆栈参数value是否大于0。同时检查算数逻辑指令是否出现在CALL指令之后。若满足以上规则,则提取该路径作为关键路径。
2)Gas耗尽终止漏洞规则匹配
依据Gas耗尽终止漏洞检测规则,需要对CALL、REVERT、GAS指令进行符号化建模。而这些指令都是内存地址及数据长度是固定值的指令,所以可以利用Z3固定大小的位向量表达式建模。
依据检测规则,检查路径中是否存在send()函数,即检查是否存在CALL指令,且CALL指令的第三个参数value是否为0,同时GAS指令的参数≤2300。最后检查是否出现REVERT指令。若满足以上规则,则提取该路径作为关键路径。
3)委托调用漏洞规则匹配
依据委托调用漏洞检测规则,需要对DELEGATECALL等指令进行符号化建模。其中,在对CALLDATALOAD指令进行建模时,会遇到CALLDATACOPY指令。CALLDATACOPY指令表示将字节从给定的调用数据复制到内存中,它对可变长度数据进行操作。CALLDATALOAD会读取CALLDATACOPY所复制的数据。
然而,在符号执行过程中,CALLDATACOPY指令的数据长度不是一个具体的值,而是一个符号表达式,因此约束求解器无法直接对其建模。为解决这个问题,当处理CALLDATACOPY等数据长度为符号表达式的指令时,使用Z3的If表达式来建模,如公式2所示。
α′m[destOffset+i]←If(i<length,EI[offset+i],αm[destoffset+i]) 公式2
其中EI为当前指令执行的符号环境,destOffset,offset,length为CALLDATACOPY指令的前三个参数,分别代表目的数据地址,源数据地址,数据长度。If即Z3的If表达式,i为复制数据的长度,从0循环到length。
对指令完成建模后,依据检测规则,检查路径中是否存在DELEGATECALL和SELFDESTRUCT指令且DELEGATECALL指令的参数中是否存在CALLDATALOAD以及CALLVALUE。若满足以上规则,则提取该路径作为关键路径。
4)时间戳依赖漏洞规则匹配
依据时间戳依赖漏洞检测规则,需要对TIMESTAMP等指令进行符号化建模。而这些指令都是内存地址及数据长度是固定值的指令,所以可以利用Z3固定大小的位向量表达式建模。
对指令完成建模后,依据检测规则,检查路径中是否存在TIMESTAMP以及NUMBER指令;同时检查检查是否存在CALL指令,且GAS≤2300。最后检查是否存在CALL指令,且第三个参数value>0。若满足以上规则,则提取该路径作为关键路径。
与现有技术相比,本发明的有益效果是:针对代码重入、委托调用、时间戳依赖、Gas耗尽终止这四类漏洞,提出了支持智能合约二进制字节码的安全漏洞检测方法。其中,面向复杂漏洞类型比如可重入漏洞,采用动静态结合的检测方法,使用符号执行方法帮助减少模糊匹配方法的开销;针对一般漏洞,提出基于关键指令的静态检测方法,首先反编译字节码生成控制流图CFG,同时为不同类别的漏洞定义了不同的关键指令及规则,使用Z3约束求解引擎进行符号表达式建模,解决了EVM中数据长度为符号表达式的指令的符号建模问题。并通过提取关键路径,生成可能利用漏洞的执行路径。在对大量智能合约进行实验后发现,本发明的漏洞检测方法可有效地发现大量智能合约存在的漏洞,且准确度较高。本发明提出的漏洞检测方法有助于在智能合约漏洞造成损失之前发现和预防漏洞,避免不可估量的经济损失。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (3)
1.一种智能合约二进制代码的漏洞检测方法,其特征在于,包括以下步骤:
步骤1:输入待检测的字节码文件,对字节码文件执行反编译,生成EVM指令及相应的参数;根据反编译后的EVM指令重建控制流图CFG;
步骤2:利用A*路径探索算法进行路径探索,生成初步路径集合;
步骤3:根据每种漏洞的相应规则对初步路径集合进行逻辑表达式匹配,提取关键路径,生成可能存在漏洞隐患的执行路径;
步骤3.1:使用Z3固定大小的位向量表达式对CALL指令进行建模:
αm[retOffset+i]←BitVector('instruction_name+i',8)
其中,αm表示内存存储;BitVector即Z3的位向量表达式;retOffset为CALL指令的第6个参数,表示CALL指令返回数据的内存地址;instruction_name是指令的名称,这里为‘CALL’;i为数据长度,从0一直循环到数据总长度,即CALL指令的第7个参数;
步骤3.2:使用Z3的If表达式对CALLDATACOPY指令进行建模:
α′m[destOffset+i]←If(i<length,EI[offset+i],αm[destoffset+i])
其中,CALLDATACOPY指令表示将字节从给定的调用数据复制到内存中,它对可变长度数据进行操作,CALLDATALOAD指令会读取CALLDATACOPY指令所复制的数据;EI为当前指令执行的符号环境;destOffset、offset、length为CALLDATACOPY指令的前三个参数,分别代表目的数据地址、源数据地址、数据长度;If即Z3的If表达式,i为复制数据的长度,从0循环到length;
步骤3.3:可重入漏洞规则匹配;
检查路径中CALL指令调用链,并检查CALL指令的第一个堆栈参数Gas是否大于2300以及第三个堆栈参数value是否大于0,同时检查算数逻辑指令是否出现在CALL指令之后;若满足以上规则,则提取该路径作为关键路径;
步骤3.4:Gas耗尽终止漏洞规则匹配;
检查路径中是否存在send()函数,即检查是否存在CALL指令,且CALL指令的第三个参数value是否为0,同时GAS指令的参数≤2300;最后检查是否出现REVERT指令;若满足以上规则,则提取该路径作为关键路径;
步骤3.5:委托调用漏洞规则匹配;
检查路径中是否存在DELEGATECALL和SELFDESTRUCT指令,且DELEGATECALL指令的参数中是否存在CALLDATALOAD以及CALLVALUE;若满足以上规则,则提取该路径作为关键路径;
步骤3.6:时间戳依赖漏洞规则匹配;
检查路径中是否存在TIMESTAMP以及NUMBER指令,同时检查是否存在CALL指令,且GAS≤2300;最后检查是否存在CALL指令,且第三个参数value>0;若满足以上规则,则提取该路径作为关键路径。
2.根据权利要求1所述的一种智能合约二进制代码的漏洞检测方法,其特征在于:所述的步骤1中对字节码文件执行反编译的方法具体为:首先加载字节码code,之后从code中解析一个指令op,并根据相应指令长度解析后面的参数;在解析PUSH指令过程中,单独解析PUSH4指令,因为PUSH4指令会将抽取4bytes的函数的计算函数标识符推送到堆栈,在有合约源码的情况下,结合源码解析生成函数名称;最后根据解析的指令和参数,循环生成基础块,直到所有字节码code都完成解析。
3.根据权利要求1或2所述的一种智能合约二进制代码的漏洞检测方法,其特征在于:所述的步骤1中根据反编译后的EVM指令重建控制流图CFG的方法具体为:所述的CFG由基础块组成,每个基础块以非跳转指令开头,以跳转或终止指令作为结束;由于构建CFG需梳理各个基础块的跳转关系,所以需要解析基础块中的跳转指令JUMP和JUMPI;构建CFG首先找到基础块间明显的跳转关系,同时,尚未计算的跳转指令被标记为未解析状态;其次,选择一个CFG子图中未解析的跳转指令,推断其跳转目标的逆向指令集,执行该指令以计算跳转目标,并将该指令标记为已解析状态,最后添加到CFG中;由于新引入的跳转关系可能导致构建的CFG子图出现新的跳转指令,所以该子图中跳转指令都需再次标记为未解析状态,重复此过程,直到所有跳转指令都被标记为已解析状态。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110265675.9A CN113051574B (zh) | 2021-03-11 | 2021-03-11 | 一种智能合约二进制代码的漏洞检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110265675.9A CN113051574B (zh) | 2021-03-11 | 2021-03-11 | 一种智能合约二进制代码的漏洞检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113051574A CN113051574A (zh) | 2021-06-29 |
CN113051574B true CN113051574B (zh) | 2023-03-21 |
Family
ID=76511458
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110265675.9A Active CN113051574B (zh) | 2021-03-11 | 2021-03-11 | 一种智能合约二进制代码的漏洞检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113051574B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113672515B (zh) * | 2021-08-26 | 2023-08-04 | 北京航空航天大学 | 一种基于符号执行的wasm智能合约漏洞检测方法 |
CN113778880B (zh) * | 2021-09-13 | 2024-06-25 | 江苏通付盾区块链科技有限公司 | 一种基于形式化验证的智能合约功能验证方法及装置 |
CN114417332A (zh) * | 2022-01-07 | 2022-04-29 | 西南交通大学 | 一种面向c程序源码的程序可信性验证方法及装置 |
CN114510723B (zh) * | 2022-02-18 | 2024-04-16 | 北京大学 | 一种智能合约权限管理漏洞检测方法及装置 |
CN115879868B (zh) * | 2022-09-09 | 2023-07-21 | 南京审计大学 | 一种专家系统与深度学习相融合的智能合约安全审计方法 |
CN116361810A (zh) * | 2023-03-29 | 2023-06-30 | 中国石油大学(华东) | 一种基于符号执行的智能合约漏洞检测方法 |
CN117033164B (zh) * | 2023-05-17 | 2024-03-29 | 烟台大学 | 一种智能合约安全漏洞检测方法和系统 |
CN118337529B (zh) * | 2024-06-12 | 2024-09-13 | 烟台大学 | 基于执行路径和堆栈事件的智能合约漏洞检测方法和设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101714118A (zh) * | 2009-11-20 | 2010-05-26 | 北京邮电大学 | 一种二进制代码缓冲区溢出漏洞的检测器及其检测方法 |
CN111177730A (zh) * | 2019-12-19 | 2020-05-19 | 河海大学 | 一种以太坊智能合约问题检测和预防方法与装置 |
Family Cites Families (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160098563A1 (en) * | 2014-10-03 | 2016-04-07 | Sourceclear, Inc. | Signatures for software components |
CN105245495A (zh) * | 2015-08-27 | 2016-01-13 | 哈尔滨工程大学 | 一种基于相似性匹配恶意shellcode快速检测方法 |
CN109063477B (zh) * | 2018-07-18 | 2021-04-20 | 成都链安科技有限公司 | 一种自动化的智能合约代码缺陷检测系统和方法 |
CN109871669B (zh) * | 2019-03-14 | 2023-02-10 | 哈尔滨工程大学 | 一种基于区块链技术的数据共享解决方法 |
CN110175454B (zh) * | 2019-04-19 | 2021-03-26 | 佛山市微风科技有限公司 | 一种基于人工智能的智能合约安全漏洞挖掘方法及系统 |
CN110633567B (zh) * | 2019-05-31 | 2023-01-13 | 天津理工大学 | 一种基于rasp的智能合约虚拟机漏洞检测系统及方法 |
CN110263536B (zh) * | 2019-06-21 | 2024-05-24 | 深圳前海微众银行股份有限公司 | 一种区块链中智能合约的监控方法及装置 |
CN110399730B (zh) * | 2019-07-24 | 2021-05-04 | 上海交通大学 | 智能合约漏洞的检查方法、系统及介质 |
CN110659494A (zh) * | 2019-09-27 | 2020-01-07 | 重庆邮电大学 | 一种可扩展的智能合约漏洞检测方法 |
CN111125697B (zh) * | 2019-11-14 | 2022-03-04 | 北京理工大学 | 基于缺陷摘要的智能合约缺陷可触发性检测方法及系统 |
CN111125716B (zh) * | 2019-12-19 | 2022-05-31 | 中国人民大学 | 一种以太坊智能合约漏洞检测方法及装置 |
CN111488582B (zh) * | 2020-04-01 | 2023-09-29 | 杭州云象网络技术有限公司 | 一种基于图神经网络的智能合约重入性漏洞检测的方法 |
CN112115472A (zh) * | 2020-08-12 | 2020-12-22 | 北京智融云河科技有限公司 | 一种面向数据管控的智能合约代码检查方法和系统 |
-
2021
- 2021-03-11 CN CN202110265675.9A patent/CN113051574B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101714118A (zh) * | 2009-11-20 | 2010-05-26 | 北京邮电大学 | 一种二进制代码缓冲区溢出漏洞的检测器及其检测方法 |
CN111177730A (zh) * | 2019-12-19 | 2020-05-19 | 河海大学 | 一种以太坊智能合约问题检测和预防方法与装置 |
Also Published As
Publication number | Publication date |
---|---|
CN113051574A (zh) | 2021-06-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113051574B (zh) | 一种智能合约二进制代码的漏洞检测方法 | |
Chen et al. | Defectchecker: Automated smart contract defect detection by analyzing evm bytecode | |
CN112100054B (zh) | 一种面向数据管控的程序静态分析方法和系统 | |
Chen et al. | Under-optimized smart contracts devour your money | |
Xu et al. | A novel machine learning‐based analysis model for smart contract vulnerability | |
Dingman et al. | Defects and vulnerabilities in smart contracts, a classification using the NIST bugs framework | |
Bruschi et al. | Code normalization for self-mutating malware | |
Liao et al. | SmartDagger: a bytecode-based static analysis approach for detecting cross-contract vulnerability | |
He et al. | Detection of vulnerabilities of blockchain smart contracts | |
CN111311255A (zh) | 一种基于预言机的智能合约形式化验证和纠错方法 | |
JP2023545140A (ja) | ブロックチェーンネットワークにおいてスマートコントラクトをサポートするための方法およびシステム | |
CN114996126B (zh) | 一种针对eosio智能合约的漏洞检测方法及系统 | |
David et al. | Specification of concretization and symbolization policies in symbolic execution | |
CN115562987A (zh) | 针对智能合约调用序列优化与资源分配导向的模糊测试方法 | |
CN116361810A (zh) | 一种基于符号执行的智能合约漏洞检测方法 | |
CN117033164B (zh) | 一种智能合约安全漏洞检测方法和系统 | |
CN108875375B (zh) | 一种面向安卓系统隐私泄漏检测的动态特性信息提取方法 | |
CN113971135A (zh) | 一种覆盖引导的智能合约测试用例生成方法 | |
CN113836009A (zh) | 一种基于强化学习的智能合约模糊测试方法及系统 | |
Rodler et al. | EF↯ CF: High Performance Smart Contract Fuzzing for Exploit Generation | |
Yu et al. | Redetect: Reentrancy vulnerability detection in smart contracts with high accuracy | |
CN113609489B (zh) | 一种工业区块链中智能合约冲突的分布式检测方法 | |
CN113886832A (zh) | 智能合约漏洞检测方法、系统、计算机设备和存储介质 | |
Yao et al. | An improved vulnerability detection system of smart contracts based on symbolic execution | |
Liu | Binary code similarity detection |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |