時間:2023-06-15|瀏覽:281
小編提醒:請注意保護自己的資產安全,謹慎投資。
來源:慢霧科技
原標題:千萬美元被盜——DeFi平臺MonoXFinance被黑分析
作者:九九@慢霧安全團隊
2021年11月30日,據慢霧區消息,DeFi平臺MonoXFinance遭遇攻擊,本次攻擊中約合1820萬美元的WETH和1050萬美元的MATIC被盜,其他被盜Token包括WBTC、LINK、GHST、DUCK、MIM和IMX,損失共計約3100萬美元。慢霧安全團隊第一時間介入分析,并將簡要分析結果分享如下。
攻擊核心:
本次攻擊的核心在于利用swap合約中沒有對池中傳入和傳出代幣是否相同作檢查,以此利用價格更新機制的缺陷,使得攻擊者傳入和傳出代幣相同時,價格被二次計算并覆蓋,導致代幣價格不斷被推高,并以此代幣換出池中的其他代幣來獲利。
相關信息:
MonoX是一種新的DeFi協議,使用單一代幣設計用于流動性池。這是通過將存入的代幣與vCASH穩定幣組合成一個虛擬交易對來實現的。其中的單一代幣流動性池的第一個應用是自動做市商系統-Monoswap,它在2021年10月時推出。
攻擊者地址1:
0xecbe385f78041895c311070f344b55bfaa953258
攻擊者地址2:
0x8f6a86f3ab015f4d03ddb13abb02710e6d7ab31b
攻擊合約1:
0xf079d7911c13369e7fd85607970036d2883afcfd
攻擊合約2:
0x119914de3ae03256fd58b66cd6b8c6a12c70cfb2
攻擊交易1:
https://etherscan.io/tx/0x9f14d093a2349de08f02fc0fb018dadb449351d0cdb7d0738ff69cc6fef5f299
攻擊交易2:
https://polygonscan.com/tx/0x5a03b9c03eedcb9ec6e70c6841eaa4976a732d050a6218969e39483bb3004d5d
攻擊細節:
1、首先攻擊者調用Monoswap.swapExactTokenForToken:0.1個WETH換出79.986094311542621010個MONO。
2、接著攻擊者利用漏洞移除池子中其他用戶的流動性,并為添加攻擊合約的流動性以此來獲取最大的利益。
這里移除流動性處的漏洞在Monoswap.sol中的471-510行,移除池中流動性時通過removeLiquidity函數調用_removeLiquidityHelper函數,而這兩個函數都未做調用者和傳入的to參數的身份驗證,所以可直接移除任意用戶在池中的流動性。
移除0x7b9aa6的流動性,把1670.7572297649224個MONO和6.8620290個vCASH轉出給0x7b9aa6;移除cowrie.eth的流動性,把152.9745213857155個MONO和0.628300423692773565個vCASH轉出給cowrie.eth;移除0xab5167的流動性,把99940.7413658327個MONO和410.478879590637971405個vCASH轉出給0xab5167;為攻擊合約1在MONO代幣流動池創建流動性。
3、緊接著攻擊者調用55次Monoswap.swapExactTokenForToken以此來不斷堆高MONO的價格。
這里攻擊的核心是在Monoswap.sol中的swapExactTokenForToken函數,攻擊者傳入MONO代幣使得tokenIn和tokenOut是相同的代幣。跟到swapIn函數中,可以發現在swapIn函數中,調用了函數getAmountOut來計算價格。接著跟到getAmountOut函數中發現是利用了_getNewPrice函數來計算tokenInPrice和tokenOutPrice。跟到_getNewprice函數中,發現當計算tokenInPrice時候傳入的txType參數為TxType.SELL,此時: 當計算tokenOutPrice時候傳入的txType參數為TxType.BUY,此時:如果傳入和傳出為同一種代幣時,價格計算式中的四個變量都相同,所以很容易得出tokenOutPrice會比tokenInPrice要大。由于tokenIn和tokenOut是同一個token,swapIn函數在計算完價格后會再次調用_updateTokenInfo函數,使得tokenOutPrice的更新會覆蓋tokenInPrice的更新,所以導致這個token的價格上漲。
4、最后攻擊者調用swapTokenForExactToken函數用MONO來換出池子中的其他代幣。
swapTokenForExactToken函數中調用了swapOut函數,而swapOut函數中計算價格是調用的getAmountIn函數。在該函數中由于tokenInPoolPrice是取的MONO代幣在池中的價格,而此價格在之前已被推高,導致tokenInPrice變大,計算最后的amountIn變小,用更少的MONO換出了原來相同數量的WETH、WBTC、MONO、USDC、USDT、DUCK、MIM、IMX等池子中的代幣。
5、攻擊者最終把攻擊獲利轉入地址0x8f6a86f3ab015f4d03ddb13abb02710e6d7ab31b。
以上為以太坊主鏈上的攻擊分析,此外,攻擊者除了在以太坊主鏈上進行攻擊外,還在Polygon上進行了同樣的攻擊,攻擊手法與以太坊主鏈上相同,此處不做過多重復的分析。
據慢霧AML統計,MonoXFinance最終損失約3400萬美元,包括約2.1K個WETH、1.9M個WMATIC、36.1個WBTC、143.4K個MONO、8.2M個USDC、9.1M個USDT、1.2K個LINK、3.1K個GHST、5.1M個DUCK、4.1K個MIM以及274.9個IMX。
總結:
本次攻擊是利用了swap合約里沒有對池中傳入和傳出代幣作檢查,從而利用價格更新機制的問題,由于在swap合約中會對池中傳入和傳出的代幣的價格調用同一個函數_upTokenInfo來進行更新,而當傳入和傳出的代幣為同一