以太坊蜜罐智能合约之黑客的漏洞利用

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

2018年07月22日 专注于为读者提供区块链安全领域最新讯息

摘要: DASP TOP10 中的前三: 重入漏洞、访问控制、算数问题在这些蜜罐智能合约中均有体现。黑客在这场欺诈者的游戏中扮演着不可或缺的角色。

利用重入漏洞的 The DAO 事件直接导致了以太坊的硬分叉、利用整数溢出漏洞可能导致代币交易出现问题。

 私人银行 (重入漏洞):

合约关键代码如下:

了解过 DAO 事件以及重入漏洞可以很明显地看出,CashOut() 存在重入漏洞。在了解重入漏洞之前,让我们先了解三个知识点:Solidity 的代码执行限制。

为了防止以太坊网络被攻击或滥用,智能合约执行的每一步都需要消耗 gas,俗称燃料。如果燃料消耗完了但合约没有执行完成,合约状态会回滚。addr.call.value()(),通过 call() 的方式进行转账,会传递目前所有的 gas 进行调用。

回退函数 fallback(): 回退函数将会在智能合约的 call 中被调用。如果我们调用合约中的 CashOut(),关键代码的调用过程如下图:

由于回退函数可控,如果我们在回退函数中再次调用 CashOut(), 

由于满足 _am<=balances[msg.sender] ,将会再次转账,因此不断循环,直至 合约中以太币被转完或 gas 消耗完。

根据上述分析写出攻击的代码如下:

模拟的攻击步骤如下:

正常用户 A (地址:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c)向该合约存入 50 ether。

恶意攻击者 B (地址:0x583031d1113ad414f02576bd6afabfb302140225) 新建恶意智能合约 Attack,实施攻击。不仅取出了自己存入的 10ether,还取出了 A 存入的 50ether。

用户 A 的余额还是 50ether,而恶意攻击者 B 的余额也因为发生溢出变成 115792089237316195423570985008687907853269984665640564039407584007913129639936。

虽然此时用户 A 的余额仍然存在,但由于合约中已经没有以太币了,所以 A 将无法取出其存入的 50 个以太币根据以上的案例可以得出如下结论:

当普通用户将以太币存取该蜜罐智能合约地址,他的代币将会被恶意攻击者通过重入攻击取出,虽然他依旧能查到在该智能合约中存入的代币数量,但将无法取出相应的代币。

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

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

分享到:

相关推荐

    评论(0

    Oh! no

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

    分享到微信