基础信息 攻击者地址: 0x2525c811ecf22fc5fcde03c67112d34e97da6079 攻击合约: 0x1e2a251b29e84e1d6d762c78a9db5113f5ce7c48 攻击tx: 0x943c2a5f89bc0c17f3fe1520ec6215ed8c6b897ce7f22f1b207fea3f79ae09a6 相关其它合约 - OLD_CELL = 0xf3E1449DDB6b218dA2C9463D4594CEccC8934346;
- LP_OLD = 0x06155034f71811fe0D6568eA8bdF6EC12d04Bed2;
- NEW_CELL = 0xd98438889Ae7364c7E2A3540547Fad042FB24642;
- LP_NEW = 0x1c15f4E3fd885a34660829aE692918b4b9C1803d;
漏洞代码分析迁移合约的工作原理是:将用户老的LP代币转到迁移合约地址,然后迁移合约调用removeLiquidity移除流动性。然后根据新池子中CELL和WBNB的比例,计算出需要的NEW CELL的数量。然后在新池子中添加流动性,新的LP代币会直接发送给用户。如果添加流动性需要的WBNB代币小于移除流动性获得的WBNB,那么将多余的WBNB退还给用户。 攻击者可以通过闪电贷操纵池子中两种代币的比例,使得旧池子中WBNB增加,OLD CELL减少,新池子中WBNB减少,NEW CELL增加。这样会导致旧LP撤销流动性的时候会获得更多的WBNB,添加新池子的时候只需要少量WBNB。 function migrate(uint amountLP) external { (uint token0,uint token1) = migrateLP(amountLP); (uint eth,uint cell, ) = IUniswapV2Router01(LP_NEW).getReserves(); uint resoult = cell/eth; token1 = resoult * token0; IERC20(CELL).approve(ROUTER_V2,token1); IERC20(WETH).approve(ROUTER_V2,token0); (uint tokenA, , ) = IUniswapV2Router01(ROUTER_V2).addLiquidity( WETH, CELL, token0, token1, 0, 0, msg.sender, block.timestamp + 5000 ); uint balanceOldToken = IERC20(OLD_CELL).balanceOf(address(this)); IERC20(OLD_CELL).transfer(marketingAddress,balanceOldToken); if (tokenA < token0) { uint256 refund0 = token0 - tokenA; IERC20(WETH).transfer(msg.sender,refund0); } } function migrateLP(uint amountLP) internal returns(uint256 token0,uint256 token1) { IERC20(LP_OLD).transferFrom(msg.sender,address(this),amountLP); IERC20(LP_OLD).approve(ROUTER_V2,amountLP); return IUniswapV2Router01(ROUTER_V2).removeLiquidity( WETH, OLD_CELL, amountLP, 0, 0, address(this), block.timestamp + 5000 ); }攻击过程分析1.攻击者从dodo借出WBNB。 2.从pancake V3中借出NEW CELL,并调用了攻击合约中的0xa1d48336方法。 3.通过调用0xa1d48336方法,在V2池子中将借来的NEW CELL全部换成了WBNB,然后将大量WBNB换成OLD CELL,这会导致新池子中WBNB减少,旧池子中OLD WBNB的比例升高。然后攻击者调用流动性迁移合约的migrate方法,移除旧池子流动性的时候,获得的WBNB会增多,然后添加新池子流动性的时候,只需要少量的WBNB。 4.然后将新池子中的lp代币移除流动性,获得WBNB和NEW CELL。 5.因为之前借了NEW CELL,因此将WBNB换成换成NEW CELL,OLD CELL已经没用了,将OLD CELL换成WBNB,并偿还V3 pool借来的NEW CELL。 6.分别在V3和V2池子中将NEW CELL卖出换成WBNB,最后归还dodo闪电贷出的WBNB。 |