背景介紹
2024年11月18日,我們監控BNB Smart Chain 上的一起攻擊事件,被攻擊的物品為BTB 。攻擊交易為
https://bscscan.com/tx/0xfb6df4053c2f1000cb03135064af19a79a87cf25efe612ae5f3468390d6be216
本次攻擊共造成約5000 USD 的損失。
攻擊及事件分析
首先,攻擊者利用flashloan 從pancakeSwapV3 中貸款100,000 BUSD
隨後,攻擊者利用pancakeSwapV2 將貸到的100,000 BUSD 兌換為1,263,427 BTB
接著,攻擊者利用BTB 的exchangeBTBToUSDT 將3,052 BTB 兌換為4,999 BUSD
我們來看看被攻擊的智慧合約的函數exchangeBTBToUSDT 的程式碼
可以看到,兌換的價格是由pancakeSwapV2 的BTB 和BUSD 的pair 的reserve 決定的。這樣,攻擊者就可以利用pacakeSwap 兌換大額BTB 或BUSD 來操縱BTB 的價格。我們可以看到,攻擊者在用flashloan 貸來的100,000 BUSD 兌換了BTB 。
因此,在攻擊者使用pancakeSwapV2 進行大額BUSD 兌換BTB 前
reserve0 為:
1,327,362,530,716,302,619,951,383 ,
reserve1 為:
5047758199614262100984 ,
兌換後reserve0 為:
63934622394514316973499 ,
reserve1 為:
105047758199614262100984 。
透過getPrice 中getAmountOut 的實現,我們可以計算出攻擊者兌換前和兌換後的BTB 價格變化。
我們透過計算得到BTB 的價格從1BTB=0.00379143964708692 BUSD 拉升到了1 BTB =1.6381204893766859 BUSD 。價格被拉升了400 倍以上。
因此,攻擊者使用了3052 BTB 兌換到了4999 BUSD 。
最後,攻擊者用剩下的1260375 BTB 從pancakeSwapV2 兌換了99,964 BUSD。
攻擊者再歸還flashloan 的貸款及利息100,100 BUSD 後,獲利4,863 BUSD 。
總結
本次漏洞的成因是專案方在完成兌換BTB 到BUSD 時,使用了過時的價格預言機,導致攻擊者可以輕易操縱BTB 的價格,先進行大筆買入BTB ,拉高BTB 的價格後再賣出。最後完成套利。建議專案方在設計價格預言機和程式碼運作邏輯時要多方驗證,合約上線前審計時盡量選擇多個審計公司交叉審計。