以太坊蜜罐智能合约之黑客的漏洞利用
摘要: 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 个以太币根据以上的案例可以得出如下结论:
当普通用户将以太币存取该蜜罐智能合约地址,他的代币将会被恶意攻击者通过重入攻击取出,虽然他依旧能查到在该智能合约中存入的代币数量,但将无法取出相应的代币。
评论(0)
Oh! no
您是否确认要删除该条评论吗?