根據Numen 鏈上監控,2023年6月1日10點7分55秒(UTC+8),Cellframe Network(@cellframenet)在Binance Smart Chain 上因為流動性遷移過程中代幣數量計算問題遭到黑客攻擊,黑客從中獲利76112美元。
事件分析
黑客地址:
https://bscscan.com/address/0x2525c811ecf22fc5fcde03c67112d34e97da6079
攻擊交易:
https://bscscan.com/tx/0x943c2a5f89bc0c17f3fe1520ec6215ed8c6b897ce7f22f1b207fea3f79ae09a6
預先調用交易:https://bscscan.com/tx/0xe2d496ccc3c5fd65a55048391662b8d40ddb5952dc26c715c702ba3929158cb9
根本原因
流動性遷移中計算出現問題。
攻擊流程
1.首先,攻擊者通過DPP 的flashloan 獲得了1000個BNB,然後利用Pancake v3 的閃電貸功能獲取了50萬個New Cell 代幣。
接下來,他們將所有的New Cell 代幣換成了BNB,導致池中的BNB 數量接近為0。
最後,攻擊者用900個BNB 兌換成了Old Cell 代幣。
2.需要注意的是,攻擊者在攻擊之前添加了Old Cell 和BNB 的流動性,獲得Old lp。
3.接著,攻擊者調用流動性遷移函數。此時的狀態是新池子中幾乎沒有BNB,老池子中幾乎沒有Old Cell 代幣。
遷移的過程涉及以下步驟:
首先,移除舊流動性,並將對應數量的代幣返回給用戶;接著,按照新池子的比例添加新的流動性。
由於舊池子中基本沒有Old Cell 代幣,因此在移除流動性時獲得的BNB 數量會增加,而Old Cell 代幣的數量會減少。
Resoul 中的數值變大,Token1 的數值也變大。
用戶只需添加少量的BNB 和少量的New Cell 代幣即可獲取流動性,並將多餘的BNB 和Old Cell 代幣返回給用戶。
然後,重複進行遷移操作。
4.最後,攻擊者移除新池子的流動性,並將遷移返回的Old Cell 代幣兌換成BNB。
此時,老池子中有大量的Old Cell 代幣,但沒有BNB,攻擊者將Old Cell 代幣重新兌換成BNB,從而完成盈利。
總結
遷移流動性時應該多重考慮新池子和舊池子兩種代幣的數量的變化或者當前的代幣價格,直接取交易對兩個幣種數量計算容易被操控。
此外,代碼上線前應做好全面的安全審計。