來源:Beosin
北京時間2024年3月5日深夜,據(jù)Beosin Trace平臺顯示,Arbitrum鏈上的WooPPV2合約項目受到價格操控攻擊,造成約850萬美元的損失。黑客利用閃電貸借出USDC.e和Woo代幣,然后通過WooPPV2合約進行頻繁的代幣兌換。由于WooPPV2合約的價格計算存在缺陷,黑客能夠操控兌換過程中的價格,導致大量Woo代幣被盜。Beosin安全團隊第一時間對本次事件進行了分析。
漏洞分析
WooPPV2合約中存在一個swap函數(shù),用戶可以調(diào)用該函數(shù)進行代幣兌換,這里主要是USDC.e和Woo兩者的兌換(下文均按USDC.e與Woo之間的兌換來分析),其中函數(shù)中的quoteToken變量表示的就是USDC.e。
_sellQuote函數(shù)和_sellBase函數(shù)邏輯差不多,都是根據(jù)價格計算兌換的代幣數(shù)量,再將代幣發(fā)送給調(diào)用者。_sellQuote是當調(diào)用者用USDC.e來兌換Woo代幣時調(diào)用的函數(shù),其中主要的函數(shù)是state以及_calcBaseAmountSellQuote,state是用于返回保存Woo價格的結(jié)構(gòu)體,_calcBaseAmountSellQuote是用戶計算兌換數(shù)量以及新價格的函數(shù)。
接下來我們看_calcBaseAmountSellQuote函數(shù)實現(xiàn)邏輯,baseAmount為計算出來的兌換數(shù)量,其中主要邏輯是USDC.e數(shù)量除以Woo的價格,得到能兌換出的Woo的數(shù)量,接下來根據(jù)當前價格以及兌換數(shù)量計算出兌換之后的新價格。
_sellBase函數(shù)與_sellQuote函數(shù)相同,只是_calcQuoteAmountSellBase函數(shù)有些許不同,主要邏輯是Woo數(shù)量乘以Woo的價格,得到能兌換出的USDC.e的數(shù)量。
根據(jù)兌換邏輯我們能發(fā)現(xiàn)一個問題,這種兌換數(shù)量的計算邏輯與Uniswap等傳統(tǒng)swap的乘積恒定模型不同,這種模式是直接根據(jù)價格做乘除來計算數(shù)量,使得兌換過程不存在滑點,但價格又會隨著兌換而變化。如果調(diào)用者精心計算,就能將里面的代幣套取出來。
舉個例子:
如果池子里面初始存在1000個A代幣和1000個B代幣,B代幣價格為1。那么如果使用500個A代幣,便能兌換出500個B代幣,此時池子變?yōu)?500:500,B代幣價格將上漲,例如變?yōu)?。接下來,使用兌換出的500個B代幣,將兌換出1000個A代幣,最終池子變?yōu)?00: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,并且根據(jù)上述公式計算出此時Woo的價格為7,縮小了近1000萬倍。
4.最后,由于Woo代幣價格極小,導致攻擊者使用極少的USDC.e就將800多萬枚Woo代幣兌換出來,最后歸還閃電貸離場。
資金追蹤
黑客攻擊后,攻擊者將200枚ETH通過跨鏈橋轉(zhuǎn)至以太坊鏈上的地址上,其余2000多枚ETH保存在Arbitrum鏈的地址上,截止發(fā)稿時,資金均未移動。
鑒于此次在Arbitrum鏈上發(fā)生的價格操控攻擊事件,我們必須認識到在虛擬資產(chǎn)領域中安全風險的重要性。