20250528 - Usual 攻擊事件: 價差兌換與請君入甕
背景信息
項目背景
VaultRouter 合約有用特權身份,可以通過 Usd0PP 合約將 USD0++ 以 1:1 的比例兌換成 USD0,隨后通過 UniV3 將 USD0 swap 成 sUSDS,并 deposit 成 usUSDS 發送給用戶。
攻擊概述
在本次 Usual 攻擊事件中,攻擊者首先創建了惡意的 [USD0, sUSDS] 池子,然后利用 VaultRouter 合約的特權身份,將 1899838 USD0++ 以 1:1 的比例兌換成 USD0,并且在惡意池子中將 USD0 兌換為 sUSDS。隨后攻擊者通過移除流動性的方式獲取所有的 USD0。最后通過 USD0USD0++ 市場將 1899838 USD0 兌換成 1943686 USD0++,兌換比例為 1 : 1.02,獲利 43847 USD0++。
漏洞成因
- VaultRouter 合約可以將 USD0++ 以 1:1 的比例兌換成 USD0,與市場價 1 : 1.02 存在價差。
- VaultRouter 和 Augustus 合約均沒有對傳入的 swapData 進行檢查,使得攻擊者可以操控 USD0 swap sUSDS 這一步驟在全部流動性均為自己添加的、且價格失衡的惡意池子中進行。
相關鏈接
Alert:https://x.com/BlockSecTeam/status/1927607817378177316
漏洞合約:
-
VaultRouter:https://etherscan.io/address/0xe033cb1bb400c0983fa60ce62f8ecdf6a16fce09#code
-
VaultRouter:https://etherscan.io/address/0xe033cb1bb400c0983fa60ce62f8ecdf6a16fce09#code
Trace 分析
Trace 概覽

- 創建惡意的 [USD0, sUSDS] 池子,并向其添加了 10 wei 的 sUSDS
- 執行閃電貸
- 將獲利資金兌換成 ETH
FlashLoan 分析

攻擊者在閃電貸內執行了本次攻擊,具體做了以下操作:
- VaultRouter.deposit()
- 移除 2.1 中創建的池子流動性
- USD0USD0++.exchange() USD0 -> USD0++
- USD0USD0++.exchange() USD0++ -> USD0
- Uniswap V3: Router.exactInput() USD0 -> ETH
- 歸還閃電貸
VaultRouter.deposit()
- 首先通過 Usd0PP.unwrapWithCap() 函數將 USD0++ 按照 1:1 的比例換成 USD0

- VaultRouter 在攻擊者創建的惡意池子中將 1899838 USD0 兌換成 5wei sUSDS

- 將兌換得到的 5wei sUSDS 通過 deposit() 質押成 usUSDS 并發送給攻擊合約(不重要)

移除流動性
攻擊者將 VaultRouter 在 2.2.1 中 swap 進去的 1899838 USD0 通過移除流動性的方式取出

exchange USD0 -> USD0++
攻擊者通過 USD0USD0++.exchange() 將 1899838 USD0 兌換成 1943686 USD0++,兌換比例為 1 : 1.02,獲利 43847 USD0++

exchange USD0++ -> USD0
攻擊者隨后又將獲利部分的 43847 USD0++ 兌換成 42973 USD0

exactInput() USD0 -> ETH
42973 USD0 兌換成了 15 WETH

歸還閃電貸

代碼分析
Usd0PP 合約允許 VaultRouter 將 USD0++ 以 1:1 的比例兌換成 USD0

VaultRouter 沒有對 augustus 使用的參數 data 進行檢查和限制,這使得攻擊者可以傳入自己構造的惡意池子(相同幣種不同費率),從而在 USD0 -> sUSDS 兌換完成后可以通過移除流動性的方法取回所有 USD0。




浙公網安備 33010602011771號