留意看,在第二次的兑换计较中,只有 ETH 的储蓄量变少了,而 imBTC 的储蓄量并未增加,这导致对比与单独的挪用 ethToTokenSwapInput 函数,进攻者可以通过重入的方法,在第二次利用 imBTC 兑换 ETH 的进程中,使计较公式的分子产生了变革,而公式的分母不会产生变革。对比正常的兑换,进攻者通过重入方法举办的第二次兑换会获取微小的利润,导致有利可图。反复这样的进程,就能通过等量的 imBTC 获取更多的 ETH,导致 Uniswap 干事商的损失。
开拓合约的时候回收先变动本合约的变量,再举办外部挪用的编写气势气魄
把该公式放到 ethToTokenInput 函数的上下文中,该公式就酿成了
4、tokensReceived 可以通过 hook 函数可以做到在一个生意业务里完成发送代币和通知合约接管代币,而不像 ERC20 必需通过两次挪用(approve/transferFrom)来完成
在举办代币互换的时候,先扣除用户的代币,再将 ETH 发送给用户。
在该公式下,一次正常的 imBTC 兑换 ETH 的进程中,作为分母的 imBTC 储蓄量在兑换事后应该要上升,对应的 ETH 储蓄量会变小。
通过阐明 getInputPrice 函数,我们能知道,ETH 获取量计较的公式为
通过查询生意业务的细节,我们发明,进攻者首先是通过 ethToTokenSwapInput 函数向 Uniswap 兑换了一些 imBTC,然后再通过 tokenToEthSwapInput 函数开始第一次用 imBTC 调换 ETH,然后 Uniswap 先将 ETH 转给了进攻者,再挪用 imBTC 的 transferFrom 函数,由于 imBTC 实现了 ERC777 尺度,所以在挪用 imBTC 的 trasferFrom 函数的时候, imBTC 会对进攻者的 tokensToSend 函数举办挪用。随后,在进攻者的 tokensToSend 函数中,进攻者会举办第二次用 imBTC 调换 ETH,然后流程竣事。
合约尽大概的配置暂停开关,在呈现“黑天鹅”事件的时候可以或许实时发明并止损
据币世界动静,4 月 18 日,Tokenlon 公布暂停 imBTC 转账,因其发明有进攻者通过 ERC777 在 Uniswap 活动性合约中的重入裂痕,对 ETH-imBTC 池轮回套利。此次的进攻手法是一个存在于 Uniswap v1 上的已知裂痕,该裂痕最早由 Consensys 于 2019 年 4 月发明,其时 Consensys 只是发明白该风险,还没有发明可以操作这种手法举办进攻的 token。随后,在 imBTC 上线 Uniswap 后,由于 imBTC 是基于 ERC777 实现的,通过组合 ERC777 的特性及 Uniswap 代码上的问题,使进攻者可以通过重入裂痕实现套利。下面,我们未来阐明此次套利中的进攻手法和详细的细节。
常识筹备ERC777 协议是以太坊上的代币尺度协议,该协议是以太坊上 ERC20 协议的改造版,主要的改造点如下:
最后的思考这两天的 DeFi 世界被闹得沸沸扬扬,imBTC 作为 ERC777 代币首当其冲,ERC777 协议也饱受诟病,可是看完阐明,造成此次的进攻事件原因,真的是 imBTC 可能是 ERC777 协议的问题吗?
假如 Uniswap 做好了 ERC777 的兼容,利用 ReentrancyGuard,并在代币互换的时候先扣除用户的代币,再将 ETH 发送给用户,这样的问题是不是就不会产生?
细节阐明通过 Etherscan 查询进攻者的个中一笔生意业务 0x32c83905db61047834f29385ff8ce8cb6f3d24f97e24e6101d8301619efee96e
项目上线前请优秀的第三方
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。