11月30日,鏈必應-區塊鏈安全態勢感知平臺輿情監測顯示,自動做市商協議MonoX遭閃電貸攻擊,獲利約3100萬美元。關于本次攻擊,成都鏈安技術團隊第一時間進行了事件分析。
事件概覽
攻擊發生之后,MonoX在官方推特確認其合約遭到攻擊,團隊正在調查并將盡最大努力追回被盜資金。
MonoX使用單邊代幣池模型,其使用vCASH穩定幣與AMM提供的代幣創建虛擬的交易對。簡單來說,MonoX創建的是代幣-vCASH交易對,添加流動性時,只需要添加代幣,進行任意代幣兌換時,兌換路徑為:代幣A->vCASH->代幣B,而不需要像Uniswap一樣經過多個交易對:代幣A->Pair1->Pair2->Pair3->TokenB。
事件具體分析
攻擊者使用相同的地址
0xEcbE385F78041895c311070F344b55BfAa953258對以太坊以及MATIC上的MonoX發起了攻擊,在兩個平臺進行攻擊所部署的合約一致。攻擊交易為:
Cyber Capital 創始人:Polygon 當前狀態很中心化且不安全:2月14日消息,Cyber Capital創始人兼 CIO Justin Bons 發推稱,Polygon當前狀態下是不安全和中心化的。首先,Polygon 智能合約管理密鑰由 8 個多簽名合約中的 5 個人控制,其中內部團隊占到4人,這意味著團隊可以完全控制 Polygon,多重簽名中的其他 4 方也由 Polygon 選擇。更糟糕的是,就其操作安全性和圍繞創建此多重簽名的加密儀式而言,Polygon 完全不透明。使用管理密鑰至少需要非常高的安全標準,而Polygon沒有適當的披露。作為存在此問題的最大加密貨幣之一,這是一場“等待發生的災難”。
此外,Justin Bons還為 Polygon 提出批評建議:Polygon 必須根據 Matic 代幣持有者分散他們自己的治理,有效地將控制權移交給“Matic DAO”。[2022/2/14 9:50:05]
以太坊:
0x9f14d093a2349de08f02fc0fb018dadb449351d0cdb7d0738ff69cc6fef5f299
機構分析:盡管英國央行做出了保證,但通脹上升可能會令英國投資者感到不安:英國eToro公司的分析師本?萊德勒表示,隨著政府逐步放寬疫情限制措施,英國通脹率的急劇飆升是不可避免的。通脹加劇會讓一些投資者感到恐慌,因為他們將價格飆升視為利率即將上調的信號。
不過,萊德勒認為情況還沒那么糟。英國央行一直表示最近的高通脹是過渡性的,是暫時的。因此,工資增長將低于物價增長,這也將在未來幾個月抑制通脹走高。[2021/6/17 23:44:44]
MATIC:
0x5a03b9c03eedcb9ec6e70c6841eaa4976a732d050a6218969e39483bb3004d5d
由于兩個平臺代碼完全一致,下面的分析將基于以太坊上的攻擊交易進行。
Round1
將0.1WETH通過Monoswap中兌換為79.98609431154262101MONO;
鮑威爾:除非出現令人不安的通脹和不均衡 否則將不會加息:美聯儲主席鮑威爾:除非出現令人不安的通脹和不均衡,否則將不會加息。如果通脹以不符合預期的方式出現,美聯儲有相應的工具。(金十)[2021/1/15 16:12:24]
圖1?WETH兌換MONO
Round2
移除Monoswap所有的流動性。這里利用了Monoswap合約中的任意地址流動性移除漏洞。
漏洞1:
Monoswap合約中未檢測流動性的所有者to是否為msg.sender。_removeLiquidity函數中,如圖2所示,第443行,獲取調用者(攻擊合約)最后一次添加流動性的時間戳,返回結果是0,因此第445行的檢測通過。第446行,topLPHolderOf如果不是調用者(攻擊合約)地址,第447行的檢測通過。此后移除流動性相關代碼中,再無msg.sender相關的操作。
圖2?_removeLiquidity源碼
報告:多數去中心化交易所是不安全的:金色財經報道,根據第三方安全機構CER的一份報告,在25個去中心化交易所(DEX)中,有14個在網絡安全方面得分很低。CER的標準包括幾個因素,如DEX是否經過安全審計,漏洞賞金的可用性,以及適當的SSL/TLS證書。CER認為任何低于6的分數都屬于“低分”,是“不安全”的。其中只有Uniswap和Syntetyx獲得了“高分”,而有6個交易所(占24%)未通過安全審計或未公開宣布已接受審計。報告稱,應當指出,未經審計的交易所不能被認為是安全的。[2020/10/29]
圖3?第一次移除流動性內部調用細節
圖4?移除Monoswap中MONO池所有的流動性
Round3
添加極少數量的MONO到Monoswap中,這一步是為了后面快速提升MONO的價格做準備。
Curve已解決參數更改不安全問題:剛剛,DeFi穩定幣兌換平臺Curve官方發推稱,參數更改不安全的問題已經解決。現在可以安全地降低舊資金池的放大系數。此前17日消息,Curve 3pool宣布實施新的放大系數Ramp。[2020/10/20]
圖5?攻擊合約添加流動性
Round4
利用Monoswap合約中的代幣兌換價格覆寫漏洞,反復進行同種代幣的兌換,拉升MONO的價格。第3步攻擊者將Monoswap合約中MONO的儲量控制到了一個極小的值,目的就是更快的以極低的MONO數量來拉升MONO的價格。
漏洞2:
Monoswap合約的代幣兌換過程為:檢查兌換參數是否正常,然后計算應輸入輸出代幣的數量以及代幣兌換后的價格,最后執行兌換操作并將新的代幣價格寫入賬本。以上邏輯在不同種代幣兌換的時候會正常運行。但是在同種代幣兌換時,將出現兩處問題:
在_getNewPrice函數計算應輸入輸出代幣數量時,未考慮到兌換過程中交易池代幣儲量的變更,同種代幣是基于相同的初始價格進行兌換后價格的計算。
在最后一步更新代幣過程中,未考慮到同種代幣進行兌換時,兌出代幣的價格更新操作會覆蓋兌入代幣更新的操作。該漏洞導致MONO代幣兌換MONO代幣時,MONO的價格異常增長。此外不止攻擊者使用的swapExactTokenForToken函數存在該問題,swapTokenForExactToken函數也存在該問題。
圖6?swapIn函數源碼
圖7?兌換過程參數計算
圖8?兌換后價格計算
圖9?swapOut函數源碼
現在看看攻擊者是如何利用漏洞2進行攻擊的:
如圖10所示,初始MONO的價格為5.218vCASH/MONO。
圖10?初始MONO價格
然后攻擊者反復進行MONO->MONO的兌換,一共進行了55次兌換,如下圖所示:
圖11?反復兌換,拉升MONO價格
對其中一筆兌換交易進行分析,每次兌換的數量是交易池中MONO的總量減去1,這是能夠最大提升MONO價格的兌換數量(使圖8?_getNewPrice第527行,分母為1)。另外由于交易池中MONO的總量較低,攻擊者已經通過第1步保證了有足夠的余額進行兌換操作。
圖12?MONO兌換細節
截止至兌換結束時,MONO的價格已經被拉升至843,741,636,512.366vCASH/MONO。攻擊合約中剩余51.92049285389317MONO。
圖13?最終的MONO價格
通過UniswapV2的USDC/WETH池借入了847.2066974335073WETH。然后攻擊者通過Monoswap將0.0709532091008681MONO兌換為4,029,106.880396USDC,然后將USDC歸還給USDC/WETH池。注意,這里實際上是攻擊者將從Monoswap中兌換的USDC到UniswapV2中兌換為WETH,而不是閃電貸攻擊。
攻擊者所有轉出的資產如下:
所有被盜資產全部發送到
0x8f6a86f3ab015f4d03ddb13abb02710e6d7ab31b地址。
目前項目方已經和攻擊者進行了溝通,成都鏈安將持續對此事件進行監控。
事件復盤
這次攻擊事件中,攻擊者利用了合約中的兩個漏洞:任何地址都可以任意移除指定地址的流動性;特殊情況下的價格寫入操作覆蓋問題。
建議項目方在進行合約開發過程中做好權限的檢查;在開發以及測試過程中將特殊情況納入考慮,例如同種代幣轉賬。
以太坊L2解決方案 Metaverse?元宇宙已經爆火過了,公鏈賽道競爭的熱度也逐漸褪去,那下一步會是什么?近期?ThreeArrows?創始人SuZhu引發的輿論口水戰吸引了巨大的關注.
1900/1/1 0:00:00如果您只有幾分鐘的空閑時間,以下是投資者、運營商和創始人可以了解的有關MetaMask的信息。加密錢包不再是利基市場。三年前,有3100萬加密錢包用戶;今天,有近8000萬.
1900/1/1 0:00:001.LDCapital:新公鏈進化——制勝關鍵源于自上而下新公鏈的擴展遵循自上而下的路徑:從上層應用到下層技術,從生態應用的繁榮到公鏈使用的爆發.
1900/1/1 0:00:00金色財經報道,12月3日消息,Vitalik發推為信標鏈慶生,信標鏈于一年前上線,意味著PoS權益證明共識已經穩定運行1年,下一步,將是PoW鏈和PoS鏈的合并等重要的發展節點.
1900/1/1 0:00:00過去兩年間,非同質化通證NFT成為一股席卷世界的潮流,不僅以太坊等鏈上原生NFT如火如荼地迭代,阿里巴巴、騰訊、Facebook等國內外互聯網巨頭也進入這一領域.
1900/1/1 0:00:00官方消息,北京時間2021年12月1日,Avalanche(AVAX)?亞洲生態系統風險基金AVATAR宣布對?Juggernaut(JGN)進行戰略投資,建立深度合作伙伴關系.
1900/1/1 0:00:00