SushiBar重入事件分析
每次获利分析: https://etherscan.io/tx/0x8037b3dc0bf9d5d396c10506824096afb8125ea96ada011d35faa89fa3893aea
1、攻击合约先通过ERC1820注册发送代币回调接口keccak256("ERC777TokensSender")=0x29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe895 2、通过SLP 闪电贷获取资金 3、攻击合约调用Xn00d合约的enter函数存入资金 4、因为n00d合约是ERC777合约,在调用transferFrom转移代币时会调用发送者的回调函数tokensToSend ,攻击合约在该函数中又重新调用n00d合约的enter函数再次存入,此时上一次transferFrom 转移代币还未完成 5、攻击合约再次通过回调函数调用enter函数(每轮3次递归调用)
漏洞原因: 1、每次调用 _mint 函数都会增加 _totalSupply的值
2、漏洞合约先使用 _mint函数先增加了totalSupply的值,再使用transferFrom函数进行转账,而ERC777合约会先调用发送者的tokentosend函数,使得重入发生。而根据公式 uint256 what = _amount.mul(totalShares).div(totalSushi); 使得转给攻击者的代币数量(what)明显增加
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!