智能合约如何应对区块链地址验证欺骗?.doc

智能合约如何应对区块链地址验证欺骗?.doc

ID:28097827

大小:648.50 KB

页数:13页

时间:2018-12-08

智能合约如何应对区块链地址验证欺骗?.doc_第1页
智能合约如何应对区块链地址验证欺骗?.doc_第2页
智能合约如何应对区块链地址验证欺骗?.doc_第3页
智能合约如何应对区块链地址验证欺骗?.doc_第4页
智能合约如何应对区块链地址验证欺骗?.doc_第5页
资源描述:

《智能合约如何应对区块链地址验证欺骗?.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、智能合约如何应对区块链地址验证欺骗?  针对区块链安全问题,成都链安科技团队每一周都将出智能合约安全漏洞解析连载,希望能帮助程序员写出更加安全牢固的合约,防患于未然。  智能合约作为以太坊上各种加密数字货币的基础,承载着巨大的经济利益。放眼以太坊的繁忙景象,日交易频率在50-75万次之间,而五月和二月更有两日交易次数高达100万次。合约的调用在整个以太坊生态系统犹如战场上穿梭的子弹,不计其数。  可见其地位举足轻重,功能五花八门,但万变不离其宗的是,每个合约都有一个共性,会继承一个地址对象,也就是说合约的基础是地址。回顾

2、前四期漏洞分析,我们了解攻击者使出了浑身解数从合约的各个部分试图不劳而获,而从合约的地址漏洞入手,釜底抽薪自然也会成为攻击手段之一。    下面我们就来聊聊,与地址有关的tx.origin变量和ecrecover()函数的相关漏洞。  一言以蔽之  Solidity作为以太坊的官方语言,将地址定为20个字节,160位。所有合约都有一个地址对象,也可以对其他地址的代码进行调用。地址类型的成员有我们上一期讲到的call()和delegatecall(),这两个函数相关的漏洞请见右方链接:偷天换日合约易主,地址变脸移花接木

3、成

4、都链安漏洞分析连载第四期——底层函数误用漏洞。不同的合约地址代表了不同的合约,也代表了他们所拥有的权限。所以合约地址就相当于合约的“身份证”。  本期相关两个名词专业的解释是,tx.origin是Solidity的一个全局变量,它遍历整个调用栈并返回最初发送调用(或事务)的帐户的地址。ecrecover()是内嵌的函数,可以用来恢复签名公钥,传值正确的情况下,可以利用这个函数来验证地址。  通俗来说,tx.origin是整个交易过程最初的那个合约拥有者。当这个合约A直接调用合约B的时候,拥有者也是中间人没错,都是合约A。

5、  但是当中间多出了一个合约C之后,合约A调用合约C,合约C调用合约B,这时中间人是C,但是tx.origin是合约A。  利用tx.origin的漏洞可以比喻为:  小明未满十八岁,但对手中的游戏爱不释手,但是游戏方为了限制未成年人的游戏时间,只有身份证号验证已满十八周岁的玩家才能无限制畅玩。于是小明使用长辈的身份证号进行防沉迷验证。这样,本来是游戏方对小明身份的验证,变成了对其长辈身份的验证,验证结果予以通过,给予小明他不应有的权限和利益。    至于ecrecover函数的问题,上面说到传值正确的情况下,使用是没有

6、问题的,但普遍存在的问题是,传值如果异常,没有进行相应的判定和排除。  我们来具体分析案例进行代码层面的剖析。  深度分析1.tx.origin使用错误  漏洞分析  tx.origin是Solidity的一个全局变量,它遍历整个调用栈并返回最初发送调用(或事务)的帐户的地址。在智能合约中使用此变量进行身份验证会使合约容易受到类似网络钓鱼的攻击。有关进一步阅读,请参阅StackExchangeQuestion,PeterVenesses博客和Solidity-tx.origin攻击。  对如下案例合约进行分析:    该

7、合约有三个函数:constructor构造函数,指定合约owner;fallback函数,通过添加payable关键字以便接收用户转账;withdrawAll函数,对tx.origin进行判断,如果tx.origin是owner,则将合约地址所拥有的ether发送到_recipient中。  现在,一个攻击者创建了下列合约:    攻击者诱使原合约(Phishable.sol)的owner发送ether到攻击合约(POC.sol)地址,然后调用攻击合约的fallback函数,执行attack()函数,此时phOwner=

8、=msg.sender,将会调用原合约的withdrawAll()函数,程序执行进入原合约,此时msg.sender是攻击合约的地址,tx.origin是最初发起交易的地址,即原合约的owner,require(tx.origin==owner);条件满足,_recipient.transfer(this.balance);可以执行,即将原合约地址里的ether转给攻击者。  漏洞修复  tx.origin不应该用于智能合约的授权。这并不是说永远不应该使用tx.origin变量。它在智能合约中确实有一些合法的用例。例如,

9、如果想要拒绝外部合约调用当前合约,他们可以通过require(tx.origin==msg.sender)实现。这可以防止使用中间合约来调用当前合约。2.ecrecover未作0地址判断  漏洞分析  keccak256()和ecrecover()都是内嵌的函数,keccak256()可以用于计算公钥的签名,ecre

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。