揭秘以太坊蜜罐智能合约之神奇的逻辑漏洞

曲速未来安全区
曲速未来安全区 机构得得号

Jul 19, 2018 专注于为读者提供区块链安全领域最新讯息

摘要: 揭秘以太坊蜜罐智能合约欺骗手段中的一种:神奇的逻辑漏洞。

该类蜜罐合约用2012年春晚小品《天网恢恢》中这么一段表现是极其合适的:

送餐员: 外卖一共 30 元 。

骗子 B: 没零的,100! 

送餐员: 行,我找你 ......70!(送餐员掏出 70 给骗子 B)

骗子 A: 哎,等会儿等会儿,我这有零的,30 是吧,把那 100 给我吧!给,30!(骗子 A 拿走了 B 给送餐员的 100 元,又给了送餐员 30 元) 

送餐员: 30 元正好,再见 !

该类漏洞也是如此,在看起来正常的逻辑下,总藏着这样那样的陷阱。

天上掉下的馅饼:Gift_1_ETH

合约关键代码如下:

三个关键函数功能如下:

SetPass(): 在转账大于 1ether 并且 passHasBeenSet 为 false (默认值就是 false), 就可以设置密码 hashPass。

GetGift(): 在输入的密码加密后与 hashPass 相等的情况下,就可以取走合约里所有的以太币。

PassHasBeenSet():如果输入的 hash 与 hashPass 相等,则 passHasBeenSet 将会被设置成 true

如果我们想取走合约里所有的以太币,只需要按照如下流程进行操作:

推特用户 Alexey Pertsev 还为此写了一个获取礼物的 EXP。

但实际场景中,受害者转入一个以太币后并没有获取到整个智能合约的余额,这是为什么呢?

这是因为在合约创立之后,任何人都可以对合约进行操作,包括合约的创建者:

合约创建者在合约 被攻击 前,设置一个只有创建者知道的密码并将 passHasBeenSet 置为 True,将只有合约创建者可以取出智能合约中的以太币。与之类似的智能合约还有 NEW_YEARS_GIFT:

2.合约永远比你有钱
  合约关键代码如下:

对于 multiplicate() 而言,只要你转账的金额大于账户余额,就可以把账户余额和你本次转账的金额都转给一个可控的地址。在这里我们需要知道:在调用 multiplicate() 时,账户余额 = 之前的账户余额 + 本次转账的金额。所以 msg.value >= this.balance 只有在原余额为 0,转账数量为 0 的时候才会成立。也就意味着,账户余额永远不会比转账金额小。

3.谁是合约主人:TestBank
  关键代码如下:

根据关键代码的内容,如果我们可以通过 useEmergencyCode() 中的判断,那就可以将 owner 设置为我们的地址,然后通过 withdraw() 函数就可以取出合约中的以太币。

(本文仅代表作者观点,不代表链得得官方立场)

链得得仅提供相关信息展示,不构成任何投资建议
本文系作者 曲速未来安全区 授权链得得发表,并经链得得编辑,转载请注明出处、作者和本文链接

更多精彩内容,关注链得得微信号(ID:ChainDD),或者下载链得得App

分享到:

相关推荐

    评论(0

    Oh! no

    您是否确认要删除该条评论吗?

    分享到微信