由於 WooPPV2 合約的價格計算存在缺陷,駭客能夠操控兌換過程中的價格,導致大量 Woo 代幣被盜。

封面:WOOFi

北京時間 2024 年 3 月 5 日深夜,據 Beosin Trace 平台顯示,Arbitrum 鏈上的 WooPPV2 合約專案受到價格操控攻擊,造成約 850 萬美元的損失。 駭客利用閃電貸借出 USDC.e 和 Woo 代幣,然後通過 WooPPV2 合約進行頻繁的代幣兌換。  由於 WooPPV2 合約的價格計算存在缺陷,駭客能夠操控兌換過程中的價格,導致大量 Woo 代幣被盜。 Beosin 安全團隊第一時間對本次事件進行了分析。

漏洞分析

WooPPV2 合約中存在一個 swap 函數,使用者可以調用該函數進行代幣兌換,這裡主要是 USDC.e 和 Woo 兩者的兌換(下文均按 USDC.e 與 Woo 之間的兌換來分析),其中函數中的 quoteToken 變數表示的就是 USDC.e。

_sellQuote 函數和_sellBase 函數邏輯差不多,都是根據價格計算兌換的代幣數量,再將代幣發送給調用者。 _sellQuote 是當調用者用 USDC.e 來兌換 Woo 代幣時調用的函數,其中主要的函數是 state 以及_calcBaseAmountSellQuote,state 是用於返回保存 Woo 價格的結構體,_calcBaseAmountSellQuote 是使用者計算兌換數量以及新價格的函數。

接下來我們看_calcBaseAmountSellQuote 函數實現邏輯,baseAmount 為計算出來的兌換數量,其中主要邏輯是 USDC.e 數量除以 Woo 的價格,得到能兌換出的 Woo 的數量,接下來根據當前價格以及兌換數量計算出兌換之後的新價格。

_sellBase 函數與_sellQuote 函數相同,只是_calcQuoteAmountSellBase 函數有些許不同,主要邏輯是 Woo 數量乘以 Woo 的價格,得到能兌換出的 USDC.e 的數量。

根據兌換邏輯我們能發現一個問題,這種兌換數量的計算邏輯與 Uniswap 等傳統 swap 的乘積恆定模型不同,這種模式是直接根據價格做乘除來計算數量,使得兌換過程不存在滑點,但價格又會隨著兌換而變化。 如果調用者精心計算,就能將裡面的代幣套取出來。

舉個例子:

如果池子裡面初始存在 1000 個 A 代幣和 1000 個 B 代幣,B 代幣價格為 1。 那麼如果使用 500 個 A 代幣,便能兌換出 500 個 B 代幣,此時池子變為 1500:500,B 代幣價格將上漲,例如變為 2。 接下來,使用兌換出的 500 個 B 代幣,將兌換出 1000 個 A 代幣,最終池子變為 500:1000,憑空套出 500A 代幣。

此次事件,攻擊者便是使用了該安全問題,我們來看看攻擊者是如何進行攻擊的。

攻擊流程

本次事件攻擊者通過多次相同的手法進行攻擊,這裡以 0xe80a16678b5008d5be1484ec6e9e77dc6307632030553405863ffb38c1f94266 這筆交易為例。
1. 攻擊者通過閃電貸借出 1000 多萬枚 USDC.e 以及 272 萬枚 Woo 代幣。

2. 接下來,攻擊者分三次使用 10 萬枚 USDC.e 兌換 Woo 代幣,此時可以看到 Woo 價格還處於正常價格,攻擊者目前持有 800 多萬枚 Woo。

3. 緊接著,攻擊者直接使用 800 多萬枚 Woo 代幣去兌換 USDC.e,由於上述問題,此時 800 多萬枚 Woo 是全部按照正常價格進行兌換的,兌換了 200 多萬枚 USDC.e,並且根據上述公式計算出此時 Woo 的價格為 7,縮小了近 1000 萬倍。

4. 最後,由於 Woo 代幣價格極小,導致攻擊者使用極少的 USDC.e 就將 800 多萬枚 Woo 代幣兌換出來,最後歸還閃電貸離場。

資金追蹤

駭客攻擊后,攻擊者將 200 枚 ETH 通過跨鏈橋轉至乙太坊鏈上的位址上,其餘 2000 多枚 ETH 保存在 Arbitrum 鏈的位址上,截止發稿時,資金均未移動。

鑒於此次在 Arbitrum 鏈上發生的價格操控攻擊事件,我們必須認識到在虛擬資產領域中安全風險的重要性。 Beosin 安全團隊將繼續密切關注並分析類似事件的發生,以提供及時的安全解決方案和風險控制建議。

免責聲明:作為區塊鏈資訊平臺,本站所發佈文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。 文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。