20250917 - WETToken 攻擊事件:價格操控產生的套利空間
背景信息
- Alert:https://x.com/TenArmorAlert/status/1968223320693686423
- TX:https://app.blocksec.com/explorer/tx/bsc/0xf92539acf7eadfd4a98925927a52af5349cb13c2a250908373a5baf8ea4b49ad
Trace 分析
發生攻擊的位置在閃電貸的 callback 函數里面,執行完閃電貸后攻擊合約將獲利的 BUSD 換成 BNB 進行轉移。

進入到閃電貸的 callback 函數里面,首先進行了一系列的授權,然后就是每 4 個 call 操作為一組,進行了多次重復的操作。

- Swap:用 5000000 BUSD → 19432567 WET
- 0x6a154c56:用 322 WET 換出 2234 WUSD
- Swap:用 19432234 WET → 4999040 BUSD
- 0xa6ff54ad:用 2234 WUSD 換出 223800 WET
從上面這組操作可以看出,1 和 3 是對等的操作,2 和 4 是不對等的操作。在操作 2 中用 322 WET 換出來的 2234 WUSD 在操作 4 中居然可以換回 223800 WET,這里面產生了獲利空間。

代碼分析
接下來就是繼續跟進 0x0A4085F8a587af76936Ac6368DFc161e5C875882 合約,查看 0x6a154c56 和 0xa6ff54ad 兩個函數的具體實現邏輯,但是很可惜合約代碼并沒有開源。
那只能上反編譯了。
反編譯代碼:https://app.dedaub.com/binance/address/0x0a4085f8a587af76936ac6368dfc161e5c875882/decompiled
0x6a154c56 & 0xa6ff54ad
根據 0x6a154c56 函數的反匯編代碼大致可以推斷出它的功能:
- 從 msg.sender 處收取 varg0 數量的 WET
- 通過 0x235f 函數,根據 varg0 計算得到 v2
- 向 msg.sender 發送 v2 數量的 WUSD

繼續跟進 0x235f 函數
說實話,很抽象。

結合 trace 可以看出,在 0x235f 函數中通過 _uniswapV2Router.getAmountsOut() 函數來獲取對應的 AmountOut 數量。結合在 Trace 分析環節中提到的攻擊過程中對 WET 和 BUSD 的幣價進行了操控的信息,可以推斷出 AmountOut 數量對應的代幣是 BUSD 。
也就是說當攻擊合約調用 0x6a154c56 函數進行兌換時,會根據已經被操控的 [WET, BUSD] 價格將 WET 兌換成 BUSD。

同樣,快速過一下 0xa6ff54ad 函數,它的實現就是 0x6a154c56 函數的鏡像操作
- 從 msg.sender 處收取 varg0 數量的 WUSD
- 通過 0xbb9 函數,調用 _uniswapV2Router.getAmountsOut() 根據 [WET, BUSD] 的價格計算 v2
- 向 msg.sender 發送 v2 數量的 WET
Rootcause 總結
總的來說,本次攻擊事件的 rootcause 就是 0x0A40 合約提供了 [WET, WUSD] 互相兌換的功能,而兌換的比例是通過獲取當前 [WET, BUSD] 的價格來決定的。攻擊者通過閃電貸獲得的大量資金操控 [WET, BUSD] 的價格,從而在 WET 價格高時通過 0x0A40 合約把 WET 換成 WUSD,然后在 WET 價格低時把 WUSD 換成 WET,從而套取超額的 WET 。兌換成 BUSD 歸還閃電貸后,再兌換成 BNB 進行資金轉移。

浙公網安備 33010602011771號