時(shí)間:2021-12-17|瀏覽:343
2021 年 11 ? 30 ?,據(jù)慢霧區(qū)消息,DeFi 平臺(tái) MonoX Finance 遭遇攻擊,本次攻擊中約合 1820 萬(wàn)美元的 WETH 和 1050 萬(wàn)美元的 MATIC 被盜,其他被盜 Token 包括 WBTC、LINK、GHST、DUCK、MIM 和 IMX,損失共計(jì)約 3100 萬(wàn)美元。慢霧安全團(tuán)隊(duì)第?時(shí)間介?分析,并將簡(jiǎn)要分析結(jié)果分享如下。
攻擊核心
本次攻擊的核?在于利? swap 合約中沒(méi)有對(duì)池中傳?和傳出代幣是否相同作檢查,以此利?價(jià)格更新機(jī)制的缺陷,使得攻擊者傳?和傳出代幣相同時(shí),價(jià)格被二次計(jì)算并覆蓋,導(dǎo)致代幣價(jià)格不斷被推?,并以此代幣換出池中的其他代幣來(lái)獲利。
相關(guān)信息
MonoX 是?種新的 DeFi 協(xié)議,使?單?代幣設(shè)計(jì)?于流動(dòng)性池。這是通過(guò)將存?的代幣與 vCASH 穩(wěn)定幣組合成?個(gè)虛擬交易對(duì)來(lái)實(shí)現(xiàn)的。其中的單?代幣流動(dòng)性池的第?個(gè)應(yīng)?是?動(dòng)做市商系統(tǒng) - Monoswap,它在 2021 年 10 ?時(shí)推出。
攻擊細(xì)節(jié)
首先攻擊者調(diào)用 Monoswap.swapExactTokenForToken:
0.1 個(gè) WETH 換出 79.986094311542621010 個(gè) MONO。
接著攻擊者利用漏洞移除池子中其他用戶的流動(dòng)性,并為添加攻擊合約的流動(dòng)性以此來(lái)獲取最大的利益。
這里移除流動(dòng)性處的漏洞在 Monoswap.sol 中的 471-510 行,移除池中流動(dòng)性時(shí)通過(guò) removeLiquidity 函數(shù)調(diào)用 _removeLiquidityHelper 函數(shù),而這兩個(gè)函數(shù)都未做調(diào)用者和傳入的 to 參數(shù)的身份驗(yàn)證,所以可直接移除任意用戶在池中的流動(dòng)性。
移除 0x7b9aa6 的流動(dòng)性,把 1670.7572297649224 個(gè) MONO 和 6.862171986812230290 個(gè) vCASH 轉(zhuǎn)出給 0x7b9aa6;
移除 cowrie.eth 的流動(dòng)性,把 152.9745213857155 個(gè) MONO 和 0.628300423692773565 個(gè) vCASH 轉(zhuǎn)出給 cowrie.eth;
移除 0xab5167 的流動(dòng)性,把 99940.7413658327 個(gè) MONO 和 410.478879590637971405 個(gè) vCASH 轉(zhuǎn)出給 0xab5167;
為攻擊合約 1 在 MONO 代幣流動(dòng)池創(chuàng)建流動(dòng)性。
緊接著攻擊者調(diào)? 55 次 Monoswap.swapExactTokenForToken 以此來(lái)不斷堆? MONO 的價(jià)格。
這里攻擊的核心是在 Monoswap.sol 中的 swapExactTokenForToken 函數(shù),攻擊者傳入 MONO 代幣使得 tokenIn 和 tokenOut 是相同的代幣。
跟到 swapIn 函數(shù)中:
可以發(fā)現(xiàn)在 swapIn 函數(shù)中,調(diào)用了函數(shù) getAmountOut 來(lái)計(jì)算價(jià)格。接著跟到 getAmountOut 函數(shù)中發(fā)現(xiàn)是利用了 _getNewPrice 函數(shù)來(lái)計(jì)算 tokenInPrice 和 tokenOutPrice。
跟到 _getNewprice 函數(shù)中,發(fā)現(xiàn)當(dāng)計(jì)算 tokenInPrice 時(shí)候傳入的 txType 參數(shù)為 TxType.SELL,此時(shí):
當(dāng)計(jì)算 tokenOutPrice 時(shí)候傳入的 txType 參數(shù)為 TxType.BUY,此時(shí):
如果傳入和傳出為同一種代幣時(shí),價(jià)格計(jì)算式中的四個(gè)變量都相同,所以很容易得出 tokenOutPrice 會(huì)比 tokenInPrice 要大。
由于 tokenIn 和 tokenOut 是同一個(gè) token,swapIn 函數(shù)在計(jì)算完價(jià)格后會(huì)再次調(diào)用 _updateTokenInfo 函數(shù),使得 tokenOutPrice 的更新會(huì)覆蓋 tokenInPrice 的更新,所以導(dǎo)致這個(gè) token 的價(jià)格上漲。
最后攻擊者調(diào)用 swapTokenForExactToken 函數(shù)用 MONO 來(lái)?yè)Q出池子中的其他代幣
swapTokenForExactToken 函數(shù)中調(diào)用了 swapOut 函數(shù),而 swapOut 函數(shù)中計(jì)算價(jià)格是調(diào)用的 getAmountIn 函數(shù)。
在該函數(shù)中由于 tokenInPoolPrice 是取的 MONO 代幣在池中的價(jià)格,而此價(jià)格在之前已被推高,導(dǎo)致 tokenInPrice 變大,計(jì)算最后的 amountIn 變小,用更少的 MONO 換出了原來(lái)相同數(shù)量的 WETH、WBTC、MONO、USDC、USDT、 DUCK、MIM、IMX 等池子中的代幣。
攻擊者最終把攻擊獲利轉(zhuǎn)入地址
以上為以太坊主鏈上的攻擊分析,此外,攻擊者除了在以太坊主鏈上進(jìn)行攻擊外,還在 Polygon 上進(jìn)行了同樣的攻擊,攻擊手法與以太坊主鏈上相同,此處不做過(guò)多重復(fù)的分析。
據(jù)慢霧 AML 統(tǒng)計(jì),MonoX Finance 最終損失約 3400 萬(wàn)美元,包括約 2.1K 個(gè) WETH、1.9M 個(gè) WMATIC、36.1 個(gè) WBTC、143.4K 個(gè) MONO、8.2M 個(gè) USDC、 9.1M 個(gè) USDT、1.2K 個(gè) LINK、3.1K 個(gè) GHST、5.1M 個(gè) DUCK、4.1K 個(gè) MIM 以及 274.9 個(gè) IMX。