发明内容
本发明的主要目的在于提供一种交易顺序依赖漏洞检测方法、系统、电子装置及存储介质,旨在解决现有技术中交易合约就可能存在交易顺序依赖漏洞,从而增加了区块链上的信息被盗取的风险的技术问题。
为实现上述目的,本发明第一方面提供一种交易顺序依赖漏洞检测方法,包括:获取交易池的当前堆栈信息中消息调用的目标地址及消息调用附带发送的以太信息,并将所述目标地址及所述以太信息分别作为第二参数及第三参数;若所述第二参数及所述第三参数与匹配字符串的正则表达式相匹配,则从所述第二参数及所述第三参数对应的区块链存储槽位中取出参数变量;若在预定的区块链节点的约束条件下,所述参数变量可以改变,则将所述参数变量保存在预设的参数列表中;将所述当前堆栈栈顶的前两个元素出栈作为第一参数,若所述第一参数写入区块链的存储槽位后,所述第一参数存在于所述参数列表中,则确定合约存在交易顺序依赖漏洞。
进一步地,所述获取交易池的当前堆栈信息中消息调用的目标地址及消息调用附带发送的以太信息包括:遍历交易池的状态空间,找出所有包含CALL函数或/及DELEGATECALL函数操作码的第一全局状态;在所述第一全局状态中,获取交易池的当前堆栈信息;提取所述当前堆栈信息,得到消息调用的目标地址及消息调用附带发送的以太信息。
进一步地,所述将所述当前堆栈栈顶的前两个元素出栈作为第一参数包括:遍历状态空间,找出所有包含SSTORE函数操作码的第二全局状态及相应的节点信息;在所述第二全局状态中,将所述当前堆栈栈顶的前两个元素出栈作为第一参数,所述第一参数作为SSTORE函数操作码的参数。
进一步地,所述正则表达式为“storage_[a-z0-9_&^]*[0-9]+”;其中,“a-z”表示匹配小写字母,“0-9”表示匹配数字,“^”表示在首位时开始匹配,“+”表示匹配1次或多次,“a-z0-9”表示匹配任意小写字母或数字,“storage”表示永久存储在区块链中的变量,“[a-z0-9_&^]*[0-9]”表示以任意小写字母或数字开头,随后紧跟任意一个数字的字符串。
本发明第二方面提供一种交易顺序依赖漏洞检测系统,包括:参数获取模块,用于获取交易池的当前堆栈信息中消息调用的目标地址及消息调用附带发送的以太信息,并将所述目标地址及所述以太信息分别作为第二参数及第三参数;参数变量提取模块,用于在所述第二参数及所述第三参数与匹配字符串的正则表达式相匹配的情况下,从所述参数获取模块获取的第二参数及所述第三参数对应的存储槽位中取出参数变量;参数变量保存模块,用于在给定节点约束条件的情况下,所述参数变量提取模块取出的参数变量可以改变,则将所述参数变量保存在列表中;参数对比模块,用于在将所述当前堆栈栈顶的前两个元素出栈作为第一参数后,若所述第一参数写入存储槽位后,存在于所述参数变量保存模块保存的列表中,则表明合约存在交易顺序依赖漏洞。
进一步地,所述参数获取模块包括:第一遍历单元,用于遍历交易池的状态空间,找出所有包含CALL函数或/及DELEGATECALL函数操作码的第一全局状态;堆栈信息获取单元,用于在所述第一遍历单元获取的第一全局状态中,获取交易池的当前堆栈信息;堆栈信息提取单元,用于提取所述堆栈信息获取单元获取的当前堆栈信息,得到消息调用的目标地址及消息调用附带发送的以太信息。
进一步地,所述参数对比模块包括:第二遍历单元,用于遍历状态空间,找出所有包含SSTORE函数操作码的第二全局状态及相应的节点信息;第一参数获取单元,用于在所述第二遍历单元获取的第二全局状态中,将所述堆栈信息获取单元获取的当前堆栈栈顶的前两个元素出栈作为第一参数,所述第一参数作为SSTORE函数操作码的参数;判断单元,用于判断所述第一参数获取单元获取的第一参数写入存储槽位后,是否存在于所述参数变量保存模块保存的列表中,若存在,则表明合约存在交易顺序依赖漏洞。
进一步地,所述系统还包括:正则表达式构建模块,用于构建正则表达式“storage_[a-z0-9_&^]*[0-9]+”,其中,“a-z”表示匹配小写字母,“0-9”表示匹配数字,“^”表示在首位时开始匹配,“+”表示匹配1次或多次,“a-z0-9”表示匹配任意小写字母或数字。
本发明第三方面提供一种电子装置,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时,实现前述中的交易顺序依赖漏洞检测方法。
本发明第四方面提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时,实现前述中的交易顺序依赖漏洞检测方法。
本发明提供一种交易顺序依赖漏洞检测方法、系统、电子装置及存储介质,有益效果在于:第二参数及第三参数来自于交易池的当前堆栈信息,因此第二参数及第三参数的值代表了交易池的交易合约内部的存储变量,而在交易合约实行后,堆栈内的数据会出栈,即生成了第一参数,因此第一参数的值代表了打包时出现的变量值,在将第一参数写入存储槽位后,若第一参数存在于列表中,则表明第一参数与第二参数、第三参数的值相对应,从而表明了栈顶出的前两个元素与第二参数、第三参数相对应,若每次交易合约中,第一参数均存在于列表中,则表明在每次交易合约中,第二参数、第三参数的值均与第一参数相对应,即表明了交易合约内部存储变量的值依赖于交易被打包的顺序,因此就确定存在交易顺序依赖漏洞,从而及时地检测出交易顺序依赖漏洞,在将交易顺序依赖漏洞传输至工作人员修复后,可以降低区块链上的信息被盗取的风险。
具体实施方式
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而非全部实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,本申请实施例提供一种交易顺序依赖漏洞检测方法,包括:S1、获取交易池的当前堆栈信息中消息调用的目标地址及消息调用附带发送的以太信息,并将目标地址及以太信息分别作为第二参数及第三参数;S2、若第二参数及第三参数与匹配字符串的正则表达式相匹配,则从第二参数及第三参数对应的区块链存储槽位中取出参数变量;S3、若在预定的区块链节点的约束条件下,参数变量可以改变,则将参数变量保存在预设的参数列表中;S4、将当前堆栈栈顶的前两个元素出栈作为第一参数,若第一参数写入区块链的存储槽位后,第一参数存在于参数列表中,则确定合约存在交易顺序依赖漏洞。
获取交易池的当前堆栈信息中消息调用的目标地址及消息调用附带发送的以太信息包括:遍历交易池的状态空间,找出所有包含CALL函数或/及DELEGATECALL函数操作码的第一全局状态;在第一全局状态中,获取交易池的当前堆栈信息;提取当前堆栈信息,得到消息调用的目标地址及消息调用附带发送的以太信息。
将当前堆栈栈顶的前两个元素出栈作为第一参数包括:遍历状态空间,找出所有包含SSTORE函数操作码的第二全局状态及相应的节点信息;在第二全局状态中,将当前堆栈栈顶的前两个元素出栈作为第一参数,第一参数作为SSTORE函数操作码的参数。
正则表达式为“storage_[a-z0-9_&^]*[0-9]+”;其中,“a-z”表示匹配小写字母,“0-9”表示匹配数字,“^”表示在首位时开始匹配,“+”表示匹配1次或多次,“a-z0-9”表示匹配任意小写字母或数字,“storage”表示永久存储在区块链中的变量,“[a-z0-9_&^]*[0-9]”表示以任意小写字母或数字开头,随后紧跟任意一个数字的字符串。
在本实施例中,还对交易顺序依赖漏洞检测方法的有效性进行的衡量,交易顺序依赖漏洞检测方法是否可以准确的定位合约中的漏洞是衡量交易顺序依赖漏洞检测方法有效性非常重要的一个指标,本实施例选取了三个包含交易顺序依赖漏洞的合约作为测试样本,并将使用交易顺序依赖漏洞检测方法的测试结果与人工审计合约结果进行比对,判断交易顺序依赖漏洞检测方法是否可以准确命中存在漏洞的函数,同时将测试结果与Oyente中的交易顺序漏洞检测算法进行对比,以此证明本实施例提供的交易顺序依赖漏洞检测方法的优势。
交易顺序依赖漏洞检测方法的有效性衡量依赖于以下两个参数,分别为:
TP:如果算法准确的判断出合约存在交易顺序依赖漏洞,则为1,反之为0;
FN:如果算法无法准确判断出合约存在交易顺序依赖漏洞,则为1,反之为0;
因此,交易顺序依赖漏洞检测方法的有效性可通过公式1计算可得,公式1表示如下:
在公式1中,n表示合约测试样本数量。
第一个测试样本:针对EthTxOrderDependenceMinimal进行测试,EthTxOrderDependenceMinimal是一个以太坊交易合约,通过对该合约进行审计,发现产生漏洞的函数为setReward以及claimReward,因为合约拥有者可以通过提高交易的手续费使得其对setReward函数的调用先于用户对claimReward函数的调用,从而导致合约拥有者发起的交易优先被打包进区块,这时如果合约拥有者将reward设置为0,那么用户将一无所获,即存在交易顺序依赖漏洞,使得信息被盗取。
第二个测试样本:针对call进行测试,call合约也是一个以太坊的交易合约,通过对该合约进行审计,发现产生漏洞的函数为calluseraddress以及setstoredaddress,由于stored_address是可以通过调用setstoredaddress函数进行修改的,如果用户在调用calluseraddress函数的同时,不法分子以更高的交易费用调用setstoredaddress函数,那么用户调用的地址不再是原来的stored_address,而是变成了修改后的stored_address,用户最终调用的很可能是一个恶意的合约地址,即存在交易顺序依赖漏洞,使得信息被盗取。
通过对上述两个测试样本的测试,证明本实施例提供的交易顺序依赖漏洞检测方法具有有效性。
请参阅图2,本申请实施例提供一种交易顺序依赖漏洞检测系统,包括:参数获取模块1、参数变量提取模块2、参数变量保存模块3及参数对比模块4;参数获取模块1用于获取交易池的当前堆栈信息中消息调用的目标地址及消息调用附带发送的以太信息,并将目标地址及以太信息分别作为第二参数及第三参数;参数变量提取模块2用于在第二参数及第三参数与匹配字符串的正则表达式相匹配的情况下,从参数获取模块1获取的第二参数及第三参数对应的区块链存储槽位中取出参数变量;参数变量保存模块3用于在预定的区块链节点的约束条件下,参数变量提取模块2取出的参数变量可以改变,则将参数变量保存在预设的参数列表中;参数对比模块4用于在将当前堆栈栈顶的前两个元素出栈作为第一参数后,若第一参数写入区块链的存储槽位后,第一参数存在于参数变量保存模块3的参数列表中,则确定合约存在交易顺序依赖漏洞。
参数获取模块1包括:第一遍历单元、堆栈信息获取单元及堆栈信息提取单元;第一遍历单元用于遍历交易池的状态空间,找出所有包含CALL函数或/及DELEGATECALL函数操作码的第一全局状态;堆栈信息获取单元用于在第一遍历单元获取的第一全局状态中,获取交易池的当前堆栈信息;堆栈信息提取单元用于提取堆栈信息获取单元获取的当前堆栈信息,得到消息调用的目标地址及消息调用附带发送的以太信息。
参数对比模块4包括:第二遍历单元、第一参数获取单元及判断单元;第二遍历单元,用于遍历状态空间,找出所有包含SSTORE函数操作码的第二全局状态及相应的节点信息;第一参数获取单元,用于在第二遍历单元获取的第二全局状态中,将堆栈信息获取单元获取的当前堆栈栈顶的前两个元素出栈作为第一参数,第一参数作为SSTORE函数操作码的参数;判断单元,用于判断第一参数获取单元获取的第一参数写入存储槽位后,是否存在于参数变量保存模块3保存的列表中,若存在,则表明合约存在交易顺序依赖漏洞。
交易顺序依赖漏洞检测系统还包括:正则表达式构建模块,正则表达式构建模块用于构建正则表达式“storage_[a-z0-9_&^]*[0-9]+”,其中,“a-z”表示匹配小写字母,“0-9”表示匹配数字,“^”表示在首位时开始匹配,“+”表示匹配1次或多次,“a-z0-9”表示匹配任意小写字母或数字,“storage”表示永久存储在区块链中的变量,“[a-z0-9_&^]*[0-9]”表示以任意小写字母或数字开头,随后紧跟任意一个数字的字符串。
请参阅3,本申请实施例提供一种电子装置,该电子装置包括:存储器601、处理器602及存储在存储器601上并可在处理器602上运行的计算机程序,处理器602执行该计算机程序时,实现前述中描述的交易顺序依赖漏洞检测方法。
进一步的,该电子装置还包括:至少一个输入设备603以及至少一个输出设备604。
上述存储器601、处理器602、输入设备603以及输出设备604,通过总线605连接。
其中,输入设备603具体可为摄像头、触控面板、物理按键或者鼠标等等。输出设备604具体可为显示屏。
存储器601可以是高速随机存取记忆体(RAM,Random Access Memory)存储器,也可为非不稳定的存储器(non-volatile memory),例如磁盘存储器。存储器601用于存储一组可执行程序代码,处理器602与存储器601耦合。
进一步的,本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质可以是设置于上述各实施例中的电子装置中,该计算机可读存储介质可以是前述中的存储器601。该计算机可读存储介质上存储有计算机程序,该程序被处理器602执行时实现前述中描述的交易顺序依赖漏洞检测方法。
进一步的,该计算机可存储介质还可以是U盘、移动硬盘、只读存储器601(ROM,Read-Only Memory)、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本发明所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
以上为对本发明所提供的一种交易顺序依赖漏洞检测方法、系统、电子装置及存储介质的描述,对于本领域的技术人员,依据本发明实施例的思想,在具体实施方式及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本发明的限制。