基礎(chǔ)信息 攻擊者地址: 0x2525c811ecf22fc5fcde03c67112d34e97da6079 攻擊合約: 0x1e2a251b29e84e1d6d762c78a9db5113f5ce7c48 攻擊tx: 0x943c2a5f89bc0c17f3fe1520ec6215ed8c6b897ce7f22f1b207fea3f79ae09a6 相關(guān)其它合約 - OLD_CELL = 0xf3E1449DDB6b218dA2C9463D4594CEccC8934346;
- LP_OLD = 0x06155034f71811fe0D6568eA8bdF6EC12d04Bed2;
- NEW_CELL = 0xd98438889Ae7364c7E2A3540547Fad042FB24642;
- LP_NEW = 0x1c15f4E3fd885a34660829aE692918b4b9C1803d;
漏洞代碼分析遷移合約的工作原理是:將用戶老的LP代幣轉(zhuǎn)到遷移合約地址,然后遷移合約調(diào)用removeLiquidity移除流動(dòng)性。然后根據(jù)新池子中CELL和WBNB的比例,計(jì)算出需要的NEW CELL的數(shù)量。然后在新池子中添加流動(dòng)性,新的LP代幣會(huì)直接發(fā)送給用戶。如果添加流動(dòng)性需要的WBNB代幣小于移除流動(dòng)性獲得的WBNB,那么將多余的WBNB退還給用戶。 攻擊者可以通過(guò)閃電貸操縱池子中兩種代幣的比例,使得舊池子中WBNB增加,OLD CELL減少,新池子中WBNB減少,NEW CELL增加。這樣會(huì)導(dǎo)致舊LP撤銷流動(dòng)性的時(shí)候會(huì)獲得更多的WBNB,添加新池子的時(shí)候只需要少量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 ); }攻擊過(guò)程分析1.攻擊者從dodo借出WBNB。 
2.從pancake V3中借出NEW CELL,并調(diào)用了攻擊合約中的0xa1d48336方法。 
3.通過(guò)調(diào)用0xa1d48336方法,在V2池子中將借來(lái)的NEW CELL全部換成了WBNB,然后將大量WBNB換成OLD CELL,這會(huì)導(dǎo)致新池子中WBNB減少,舊池子中OLD WBNB的比例升高。然后攻擊者調(diào)用流動(dòng)性遷移合約的migrate方法,移除舊池子流動(dòng)性的時(shí)候,獲得的WBNB會(huì)增多,然后添加新池子流動(dòng)性的時(shí)候,只需要少量的WBNB。 
4.然后將新池子中的lp代幣移除流動(dòng)性,獲得WBNB和NEW CELL。 
5.因?yàn)橹敖枇薔EW CELL,因此將WBNB換成換成NEW CELL,OLD CELL已經(jīng)沒用了,將OLD CELL換成WBNB,并償還V3 pool借來(lái)的NEW CELL。 
6.分別在V3和V2池子中將NEW CELL賣出換成WBNB,最后歸還dodo閃電貸出的WBNB。 
|