據慢霧安全團隊情報,2023 年6 月1 日,Cellframe 遭到閃電貸攻擊,Cellframe ERC20 v2 價格下跌41.2%。慢霧安全團隊第一時間介入分析,並將結果分享如下:
相關信息
攻擊者地址:
0x2525c811EcF22Fc5fcdE03c67112D34E97DA6079
攻擊者合約地址:
0x1e2a251b29e84e1d6d762c78a9db5113f5ce7c48
攻擊交易:
0x943c2a5f89bc0c17f3fe1520ec6215ed8c6b897ce7f22f1b207fea3f79ae09a6
攻擊者添加LP(OLD) 交易:
0xe2d496ccc3c5fd65a55048391662b8d40ddb5952dc26c715c702ba3929158cb9
前置信息
此次攻擊中出現多個新舊合約,我們將使用LpMigration 合約中新舊合約的參數名作為本次攻擊分析中的合約名。
address OLD_CELL: 0xf3E1449DDB6b218dA2C9463D4594CEccC8934346
address LP_OLD: 0x06155034f71811fe0D6568eA8bdF6EC12d04Bed2
address CELL: 0xd98438889Ae7364c7E2A3540547Fad042FB24642
address LP_NEW: 0x1c15f4E3fd885a34660829aE692918b4b9C1803d
具體細節分析
1. 通過DODO 的DPPOracle 閃電貸1000 個BNB。
2. 通過PancakeSwap V3 閃電貸50 萬枚CELL。
3. 攻擊者在PancakeSwap V2 LP_NEW 池子中,將閃電貸來的50 萬枚CELL Token 全部swap 為50 枚BNB。這時,LP_NEW 池中僅剩8 枚 BNB,而CELL 有55 萬枚。
4. 緊接著,攻擊者在另外一個PancakeSwap V2 池子LP_OLD 池中,將900 枚BNB swap 為OLD_CELL。此時LP_OLD 中的BNB 數量為902 枚,OLD_CELL 僅有7 枚。
5. 在攻擊者將BNB 兌換成OLD_CELL 後,我們發現攻擊者直接調用LpMigration 合約的migrate 函數進行LP 遷移。奇怪的是,在我們剛剛的分析裡,攻擊者並沒有獲取LP Token 的操作,那麼這些LP Token 又是從哪裡來的呢?
6. 於是回到攻擊合約,通過攻擊合約的前一筆交易可以發現,攻擊者在交易中向LP_OLD 池子添加流動性,獲取LP(OLD) Token。
7. 攻擊者對LP_OLD 池的LP(OLD) 進行連續migrate 操作,細節如下:
先調用migrateLP 函數移除LP(OLD) 的流動性,並將代幣返還給用戶。由於池子LP_OLD 中的BNB 代幣很多,在移除流動性時,計算所獲得的BNB 數量會增加,OLD_CELL 減少。隨後,在LP_NEW 池中,getReserves 獲取到BNB 和CELL 的數量。由於之前的swap 操作,LP_NEW 池中的BNB 數量少,CELL 數量多,所以計算出來的resoult 值會偏大,使得新計算出的CELL 的token1 值也偏大。
8. 然而,原本LpMigration 合約中又是存在CELL 代幣的,所以攻擊者添加流動性所用的token1 代幣CELL 都來自LpMigration 合約。隨後將計算出的結果添加流動性到ROUTER_V2 池中。 (PS: 這也是為什麼在攻擊發生後,Cellframe: Deployer 會通過withdrawCELL() 函數將合約中的CELL 代幣全部取出)
9. 也就是說,攻擊者利用LP_OLD 池中BNB 多,OLD_CELL 少,通過移除流動性獲取到更多的BNB。而在LP_NEW 池中BNB 少,CELL 多的情況下,以少量的BNB 和CELL 就可以添加流動性。攻擊者通過多次migrate 操作獲利。
10. 最後,攻擊者將LP_NEW 的流動性移除,將OLD_CELL 在LP_OLD 池中兌換為BNB,並在一個新的CELL-BUSD 池中先兌換成BUSD 再兌換成BNB,償還FlashLoan,獲利245.522826177178247245 BNB。
總結
此次攻擊的核心在於利用流動性遷移計算,攻擊者操縱兩個不同池子中的流動性致其不平衡,進而套利。