检测ERC20合约鉴权漏洞的方法、系统及存储介质与流程


检测erc20合约鉴权漏洞的方法、系统及存储介质
技术领域
1.本发明涉及区块链安全技术领域,具体地说,涉及检测erc20合约鉴权漏洞的方法、系统及存储介质。


背景技术:



2.目前,erc20在去中心化应用dapp中被广泛的使用,去中心化应用dapp是一个基于区块链和智能合约的金融交易平台。成千上万的erc20以不同的方式在去中心化平台上被押注、出借和交易。如果用户想要参与到这些去中心化金融defi项目中,用户必须使用erc20中的鉴权方法来授予defi项目代表其花费的权限。去中心化金融defi是加密货币,区块链和智能合约结合的产物。这种用户的的鉴权是defi协议不可分割的一部分。但是,如果的鉴权机制的存在缺陷,将会导致毁灭性的后果。例如,由于鉴权机制存在缺陷,名为primitive finance的defi项目将其资金置于风险之中。如果该项目组没有及时发现其项目存在的漏洞,将造成100万美元的损失。
3.陈厅等人提出了基于轨迹方法检测实现中对余额数量的不一致行为,在“tokenscope: automatically detecting inconsistent behaviors of cryptocurrency tokens in ethereum”一文中,他们通过总结金额数据结构的访问模式,在evm虚拟机中基于这种访问模式,来定位和分析这些金额操作的不一致行为。然而,本方式尚不具备跨合约的分析能力,部分合约的实现逻辑和存储逻辑分为多个合约部署,分析这类合约业界并未有较好的方案。
4.专利公开号为cn 114510723 a的专利,尝试在合约中定位owner变量,但从低级字节码中定位owner变量这一高级语言的变量会产生很高的假阳性,例如uint160类型的数据在低级语言中拥有和owner变量的一样的序列特征。
5.当前,大部分基于符号执行的技术,都会对面临着路径爆炸,占用资源过多,检测误报率高等问题。


技术实现要素:



6.本发明针对现有技术中符号执行技术中检测误报率高的问题,提出检测erc20合约鉴权漏洞的方法、系统及存储介质,首先将erc20合约的字节码进行符号执行,并在sstore指令上进行数据收集;然后通过寻址模式识别鉴权数据结构,并利用得到的鉴权数据结构的地址索引推断鉴权行为,最后按照设定的模式行为进行匹配,若匹配失败,输出检测出的erc20合约鉴权漏洞,采用结合符合表达式的方式去鉴权erc20合约中的鉴权行为,准确率和运行效率更高,确保了用户资金的安全性。
7.本发明提出检测erc20合约鉴权漏洞的方法,包括如下步骤:步骤1:将erc20合约的字节码进行符号执行,得到sstore指令的值符号表达式;步骤2:收集sstore指令的位置和值符号表达式,初步捕获检测鉴权漏洞的鉴权数
据结构;所述erc20合约的数据存放在持久化存储中,所述持久化存储中的数据由sstore指令修改;所述sstore指令的位置用location
se
表示,所述sstore指令的值符号表达式用value
se
表示;步骤3:通过寻址模式识别鉴权数据结构;所述寻址模式为一系列evm以太坊虚拟机指令操作,通过计算持久存储中的地址索引来定位鉴权数据结构;所述步骤3具体包括以下步骤:步骤31:将发起转账的用户的账户地址addr1和代表鉴权数据结构唯一性的标识符identity拼接在一起;所述代表鉴权数据结构唯一性的标识符identity是编译器分配的一个数字,用于标识与“=”对应的变量;步骤32:将拼接好的发起转账的用户的账户地址addr1和代表鉴权数据结构唯一性的标识符identity在sha3指令中进行散列操作,得到鉴权数据结构的中间值res;步骤33:在sha3指令中将接收转账用户的账户地址addr2和鉴权数据结构的中间值res拼接在一起,得到鉴权数据结构的地址索引;步骤34:在sstore指令中将把带有地址索引的鉴权数据结构写入持久存储中;步骤4:推断鉴权行为;通过判断函数judgment_type()判断出两种鉴权行为,所述两种鉴权行为分别为鉴权模式行为和使用鉴权模式行为;若判断函数judgment_type()判断鉴权行为为鉴权模式行为,调用approve函数按照设定的模式进行匹配,识别鉴权行为;若判断函数judgment_type()判断鉴权行为为使用鉴权模式,调用approve函数按照设定的模式进行匹配,识别鉴权行为;步骤5:利用缺陷检测函数flaw_detect()报告漏洞;若鉴权模型的形式化模型中发起转账的用户的账户地址addr1不是msg.sender,或接收转账用户的账户地址addr2不是receiver,则鉴权数据结构会被任意的访问,存在鉴权漏洞,缺陷检测函数报告存在鉴权漏洞;若使用鉴权模式的形式化模型中发起转账的用户的账户地址addr1不是sender,或接收转账用户的账户地址addr2不是msg.sender,则鉴权数据结构会被任意的访问,缺陷检测函数报告存在鉴权漏洞。
8.为了更好地实现本发明,进一步地,基于上述提出的检测erc20合约鉴权漏洞的方法,还提出检测erc20合约鉴权漏洞的系统,包括执行模块、收集模块、识别模块、推断模块、输出模块;所述执行模块用于将erc20合约的字节码进行符号执行;所述收集模块用于收集sstore指令的位置和值符号表达式;所述识别模块用于识别出鉴权数据结构的地址索引;所述推断模块用于推断出鉴权行为类型;
所述输出模块用于输出鉴权漏洞。
9.为了更好地实现本发明,进一步地,还提出计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行上述的检测erc20合约鉴权漏洞的方法。
10.本发明具有以下有益效果:(1)本发明结合符号执行表达式去鉴权erc20合约中的鉴权行为,让用户和开发者原理缺陷类型的鉴权操作,确保用户资金的安全性。
11.(2)本发明能够在闭源的智能合约这两个进行鉴权分析,并通过符号表达式推断出鉴权数据结构和捕获相关操作,准确率高,运行效率更加高效。
12.(3)本发明将范围限定在了合约中,且定位的是二维mapping结构,其字节码bytecode的特征和高级语言特征都是唯一的,不会产生误报。
附图说明
13.图1为本发明流程示意图;图2为利用寻址模对鉴权数据结构进行识别的示意图。
具体实施方式
14.为了更清楚地说明本发明实施例的技术方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,应当理解,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例,因此不应被看作是对保护范围的限定。基于本发明中的实施例,本领域普通技术工作人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
15.在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“设置”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;也可以是直接相连,也可以是通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
16.相关术语解释:符号执行技术:符号执行symbolic execution是一种计算机科学领域的程序分析技术,通过采用抽象的符号代替精确值作为程序输入变量,得出每个路径抽象的输出结果。这一技术在硬件、底层程序测试中有一定的应用,能够有效的发现程序中的漏洞。
17.智能合约smart contract :一种旨在以信息化方式传播、验证或执行合同的计算机协议。 智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。 智能合约概念于1995年由nick szabo首次提出。
18.erc20 通证标准erc20 token standard:通过以太坊创建通证时的一种规范,按照erc20 的规范可以编写一个智能合约,创建“可互换通证”。它并非强制要求,但遵循这个标准,所创建的通证可以与众多交易所、钱包等进行交互,它现在已被行业普遍接受。
19.鉴权:为了加入defi项目,用户必须授权defi项目代表用户花费,这一过程称为鉴权。
20.实施例1:本实施例提出一种检测erc20合约鉴权漏洞的方法,分为两个阶段,第一阶段是对erc20合约的字节码进行符号执行,在sstore指令上进行数据收集,并通过寻址模式识别鉴权数据结构;第二阶段是利用得到的鉴权数据结构的地址索引推断鉴权行为,将推断出的鉴权行为与鉴权模型进行匹配,若匹配失败,输出检测出的erc20合约鉴权漏洞。
21.工作原理:本实施例使用静态分析的符号执行技术,提供了一种erc20合约中的鉴权缺陷的检测方法。该方法的原理是:首先在合约中捕获鉴权数据结构,以推断鉴权行为和检测鉴权缺陷,然后分析鉴权行为。其次,大部分智能合约都是闭源的,本实施例能够在闭源的智能合约中进行鉴权分析,然后通过符号表达式推断鉴权数据结构和捕获相关操作;最后利用得到的鉴权数据结构的地址索引推断鉴权行为与鉴权模型进行匹配,若匹配失败,输出检测出的erc20合约鉴权漏洞。
22.实施例2:本实施例在上述实施例1的基础上,以步骤的形式将检测erc20合约鉴权漏洞的方法的完整流程进行说明。
23.工作原理:本实施例提出一种检测erc20合约鉴权漏洞的方法,具体包括以下步骤:步骤1:将erc20合约的字节码进行符号执行,得到sstore指令的值符号表达式;步骤2:收集sstore指令的位置和值符号表达式,初步捕获检测鉴权漏洞的鉴权数据结构;所述erc20合约的数据存放在持久化存储中,所述持久化存储中的数据由sstore指令修改;所述sstore指令的位置用locationse表示,所述sstore指令的值符号表达式用valuese表示;步骤3:通过寻址模式识别鉴权数据结构;所述寻址模式为一系列evm以太坊虚拟机指令操作,通过计算持久存储中的地址索引来定位鉴权数据结构;所述步骤3具体包括以下步骤:步骤31:将发起转账的用户的账户地址addr1和代表鉴权数据结构唯一性的标识符identity拼接在一起;所述代表鉴权数据结构唯一性的标识符identity是编译器分配的一个数字,用于标识与“=”对应的变量;步骤32:将拼接好的发起转账的用户的账户地址addr1和代表鉴权数据结构唯一性的标识符identity在sha3指令中进行散列操作,得到鉴权数据结构的中间值res;步骤33:在sha3指令中将接收转账用户的账户地址addr2和鉴权数据结构的中间值res拼接在一起,得到鉴权数据结构的地址索引;步骤34:在sstore指令中将把带有地址索引的鉴权数据结构写入持久存储中;步骤4:推断鉴权行为;
通过判断函数judgment_type()判断出两种鉴权行为,所述两种鉴权行为分别为鉴权模式行为和使用鉴权模式行为;若判断函数judgment_type()判断鉴权行为为鉴权模式行为,调用approve函数按照设定的模式进行匹配,识别鉴权行为;若判断函数judgment_type()判断鉴权行为为使用鉴权模式,调用approve函数按照设定的模式进行匹配,识别鉴权行为;步骤5:利用缺陷检测函数flaw_detect()报告漏洞;若鉴权模型的形式化模型中发起转账的用户的账户地址addr1不是msg.sender,或接收转账用户的账户地址addr2不是receiver,则鉴权数据结构会被任意的访问,存在鉴权漏洞,缺陷检测函数报告存在鉴权漏洞;若使用鉴权模式的形式化模型中发起转账的用户的账户地址addr1不是sender,或接收转账用户的账户地址addr2不是msg.sender,则鉴权数据结构会被任意的访问,缺陷检测函数报告存在鉴权漏洞。
24.进一步地,基于上述提出的一种检测erc20合约鉴权漏洞的方法,还提出一种检测erc20合约鉴权漏洞的系统,包括执行模块、收集模块、识别模块、推断模块、输出模块;所述执行模块用于将erc20合约的字节码进行符号执行;所述收集模块用于收集sstore指令的位置和值符号表达式;所述识别模块用于识别出鉴权数据结构的地址索引;所述推断模块用于推断出鉴权行为类型;所述输出模块用于输出鉴权漏洞。
25.进一步地,还提出一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行上述的一种检测erc20合约鉴权漏洞的方法。
26.本实施例的其他部分与上述实施例1相同,故不再赘述。
27.实施例3:本实施例在上述实施例1-2任一项的基础上,结合具体的鉴权案例对检测erc20合约鉴权漏洞的方法进行详细说明。
28.工作原理:目前,erc20在去中心化应用dapp中被广泛的使用。去中心化应用是一个基于区块链和智能合约的金融交易平台。成千上万的erc20以不同的方式在去中心化平台上被押注、出借和交易。如果用户想要参与到这些defi项目中,用户必须使用erc20中的鉴权方法来授予defi项目代表其花费的权限。这种用户的的鉴权是defi协议不可分割的一部分。但是,如果的鉴权机制的存在缺陷,将会导致毁灭性的后果。例如,由于鉴权机制存在缺陷,名为primitive finance的defi项目将其资金置于风险之中。如果该项目组没有及时发现其项目存在的漏洞,将造成100万美元的损失,但是,很少有人关注erc20鉴权过程中的缺陷。
29.现有的鉴权案例如下:mapping(addre检测erc20合约鉴权漏洞的方法、系统及存储介质=》uint256) balances;
mapping(addre检测erc20合约鉴权漏洞的方法、系统及存储介质 =》mapping(addre检测erc20合约鉴权漏洞的方法、系统及存储介质 =》uint256)) allowance;tunction approve(addre检测erc20合约鉴权漏洞的方法、系统及存储介质 _spender, uint256 _value) public{a1lowance[ msg. sender][_spender]=_value;emit approval(msg. sender,_spender,_value);}function transferfrom(addre检测erc20合约鉴权漏洞的方法、系统及存储介质 from, addre检测erc20合约鉴权漏洞的方法、系统及存储介质 _to, uint256 _value) public{require(_value《=balances[_from]);require(_value《=allowance[_from][ msg. sender]);balances[_from]=balances[_from]-_value;balances[_to]=balances[_to]+_value;allowance[_from][ msg. sender]=allowance[_from][ msg. sender]-value;emit transfer(_from, to,_value);}鉴权案例中的第2行,由allowance变量表示的鉴权信息记录。根据erc20 标准定义,在鉴权案例的第3行到第6行approve()方法允许发送者例如,用户、钱包、交换等从批准者的令牌池中提取最多允许数量的。在鉴权案例中的第7行到15行transferfrom()方法允许花费者将从批准者转移到他们选择的任何人。
[0030]
符号执行技术是一种计算机科学领域的程序分析技术,通过采用抽象的符号代替精确值作为程序输入变量,得出每个路径抽象的输出结果。这一技术在硬件、底层程序测试中有一定的应用,能够有效的发现程序中的漏洞。
[0031]
当前,大部分基于符号执行的技术,都会对面临着路径爆炸,占用资源过多,检测误报率高等问题。本实施例基于符号执行表达式,符号表达式是指,当一条指令在符号执行过程中至少依赖于一个外部运行时输入时,会构造一个符号表达式来描述指令的结果。基于符号执行的表达式的方法避免了直接使用符号执行的抽象模型,通过符号表达式能够更好的分析和解析语义。
[0032]
如图1所示,首先对合约的字节码bytecode进行符号执行,然后数据搜集,最后进行语法鉴定来检测漏洞。
[0033]
1.数据搜集阶段在第一阶段,本实施例需要收集sstore指令的位置和值的符号表达式,以初步捕获鉴权验证的数据结构。在以太坊中,所有的数据都存放在持久化存储中,而持久化存储中的数据是由sstore指令修改的,所以本实施例是在sstore指令上收集数据。本实施例使用location
se
和value
se
来表示sstore指令的位置和值符号表达式。
[0034]
2.识别鉴权数据结构在本阶段中,本实施例通过寻址模式识别鉴权数据结构。寻址模式是一系列以太坊虚拟机evm指令操作,计算持久存储中的地址索引来定位鉴权数据结构。如图2所示为利
用寻址模对鉴权数据结构进行识别的示意图,解释了寻址模式的具体过程。首先,将发起转账的用户的账户地址addr1和表示此数据结构的唯一性的标识符identity拼接在一起,然后使用sha3指令执行散列操作以获得该数据结构的中间值res,其中表示此数据结构的唯一性的标识符identity是编译器分配的一个数字,用于标识与=对应的变量。然后将表示接收转账用户的账户地址addr2和使用sha3指令执行散列操作获得的该数据结构的中间值res拼接在一起,执行第二条sha3指令,得到地址索引。最后,sstore指令将把带有地址索引的值写入持久存储中。从上面的过程中,我们可以得到寻址模式,它的evm操作组成的地址索引可表示为:location
pattern =sh a32(addr2,sh a31(addr1,identity));然后我们可以定位鉴权数据结构了。
[0035]
3.鉴权行为推断进行鉴权行为推断的具体鉴权案列可表示为:algorithm 2 analysis of authentication behaviorinput:the tree of location:tree
se
symbolic expre检测erc20合约鉴权漏洞的方法、系统及存储介质ion of value:value
se
output:authentication behavior detect resultstype=judgment_type(tree
se
)if type=approval authorization thenif approve _behavior_detect(value
se
)thenreturn //correct authenticationelseflaw_detect()end ifelse if type==use authorization thenif usingauthorization_behavior_detect(valuese)thenreturn//correct authenticationelseflaw_detect()end ifelseflaw_detect()本实施例推断和识别鉴权行为和使用鉴权的行为,具体步骤如下:第一步,通过函数judgment_type()首先区分两种鉴权行为,分别为鉴权模式和使用鉴权模式。
[0036]
第二步,如果判断为鉴权模式,则使用approve_behavior_detect()识别使用鉴权的行为,按照设定的模式进行模式匹配,如果不符合设定的模式,例如形式化模型中的addr1不是msg.sender,这意味着鉴权结构可能会被任意的访问,则转入第四步。
[0037]
第二步中进行匹配的具体案例可表示为:
approval authorizationsender invoke approve(receiver, amount,)msg sender—senderallowance[ msg. sender][ receiver]=amountaddr1—msg. sender addr2— receiveramount — amount《addr1,《addr2, amount》》第三步:如果判断结果为使用鉴权模式,使用函数using_authrozation_behavior_detect()按照相应的的模式进行匹配,如果不满足,例如形式化模型中的addr1不是msg.sender,这意味着鉴权结构可能会被任意的访问,则转入第四步。
[0038]
第三步中进行匹配的具体案例可表示为:using authorization transferreceiver invoke transferfrom(sender, receiver, amount,)msg. sender—receiverallowance[sender][ msg. sender]-=amountaddr1—senderaddr2— msg. sender amount — allowance(sender][ msg. sender]-amount《addr1,《addr2, amount》》第四步:利用flaw_detect()函数报告漏洞。
[0039]
本实施例的其他部分与上述实施例1-2任一项相同,故不再赘述。
[0040]
以上所述,仅是本发明的较佳实施例,并非对本发明做任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化,均落入本发明的保护范围之内。

技术特征:


1.检测erc20合约鉴权漏洞的方法,其特征在于,分为两个阶段,第一阶段是对erc20合约的字节码进行符号执行,在sstore指令上进行数据收集,并通过寻址模式识别鉴权数据结构;第二阶段是利用得到的鉴权数据结构的地址索引推断鉴权行为,将推断出的鉴权行为与鉴权模型进行匹配,若匹配失败,输出检测出的erc20合约鉴权漏洞。2.如权利要求1所述的检测erc20合约鉴权漏洞的方法,其特征在于,所述第一阶段的具体操作为:首先对erc20合约的字节码进行符号执行,得到sstore指令的值符号表达式;然后在sstore指令上收集sstore指令的位置和值符号表达式,通过寻址模式识别鉴权数据结构。3.如权利要求2所述的检测erc20合约鉴权漏洞的方法,其特征在于,所述第一阶段中通过寻址模式识别鉴权数据结构的具体步骤为:步骤1:将发起转账的用户的账户地址addr1和代表鉴权数据结构唯一性的标识符identity拼接在一起;步骤2:在sha3指令中执行散列操作,得到鉴权数据结构的中间值res;步骤3:在sha3指令中将接收转账用户的账户地址addr2和鉴权数据结构的中间值res拼接在一起,得到鉴权数据结构的地址索引,并在sstore指令中将带有地址索引的鉴权数据结构写入持久存储中。4.如权利要求1所述的检测erc20合约鉴权漏洞的方法,其特征在于,所述第二阶段中推断鉴权行为的具体操作为:首先推断出鉴权行为的类型,然后调用approve函数按照设定的模式将得到的鉴权数据结构的地址索引进行匹配,若匹配成功则输出无erc20合约鉴权漏洞;若匹配失败,则输出检测出的erc20合约鉴权漏洞。5.如权利要求4所述的检测erc20合约鉴权漏洞的方法,其特征在于,所述鉴权行为的类型包括鉴权模式行为、使用鉴权模式行为。6.如权利要求5所述的检测erc20合约鉴权漏洞的方法,其特征在于,所述将鉴权行为进行匹配的具体操作为:将鉴权数据结构的地址索引addr1与addr2进行匹配,判断鉴权模型的形式化模型中发起转账的用户的账户地址addr1是否为msg.sender,或接收转账用户的账户地址addr2是否为receiver,若是,则鉴权数据结构不会被任意访问,不存在鉴权漏洞;若否,则鉴权数据结构会被任意的访问,存在鉴权漏洞,缺陷检测函数报告存在鉴权漏洞。7.如权利要求5所述的检测erc20合约鉴权漏洞的方法,其特征在于,所述鉴权模式行为进行匹配的具体操作为:将鉴权数据结构的地址索引addr1与addr2与鉴权模型进行匹配,判断鉴权模型的形式化模型中发起转账的用户的账户地址addr1是否为sender,或接收转账用户的账户地址addr2是否为msg.sender,若是,则鉴权数据结构不会被任意访问,不存在鉴权漏洞;若否,则鉴权数据结构会被任意的访问,存在鉴权漏洞,缺陷检测函数报告存在鉴权漏洞。8.如权利要求1-7任一项所述的检测erc20合约鉴权漏洞的方法,其特征在于,所述erc20合约中的鉴权数据结构存放在持久化存储中,且所述持久化存储中的数据由sstore指令修改。9.检测erc20合约鉴权漏洞的系统,其特征在于,包括执行模块、收集模块、识别模块、推断模块、输出模块;
所述执行模块用于将erc20合约的字节码进行符号执行;所述收集模块用于收集sstore指令的位置和值符号表达式;所述识别模块用于识别出鉴权数据结构的地址索引;所述推断模块用于推断出鉴权行为类型;所述输出模块用于输出鉴权漏洞。10.计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机可执行指令,所述计算机可执行指令用于使计算机执行如权利要求1-8任一项所述的检测erc20合约鉴权漏洞的方法。

技术总结


本发明提出检测ERC20合约鉴权漏洞的方法、系统及存储介质,首先将ERC20合约的字节码进行符号执行,并在SSTORE指令上进行数据收集;然后通过寻址模式识别鉴权数据结构,并利用得到的鉴权数据结构的地址索引推断鉴权行为,最后按照设定的模式与鉴权模型进行匹配,若匹配成功,输出无鉴权漏洞,若匹配失败,输出检测出的ERC20合约鉴权漏洞,采用结合符合表达式的方式去鉴权ERC20合约中的鉴权行为,准确率和运行效率更高,确保了用户资金的安全性。资金的安全性。资金的安全性。


技术研发人员:

贺哲远 陈厅 姜毅 刘韬 宋书玮

受保护的技术使用者:

成都安恒信息技术有限公司

技术研发日:

2022.06.27

技术公布日:

2022/12/22

本文发布于:2024-09-20 20:40:17,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/45887.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:代币   权数   合约   漏洞
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议