背景介紹

近期,我們監控到一起針對Base 上的物品CloberDEX的鏈上攻擊事件,

https://basescan.org/tx/0x8fcdfcded45100437ff94801090355f2f689941dca75de9a702e01670f361c04

被攻擊的項目為CloberDEX ,攻擊者透過攻擊獲利約133 ETH ,約500,000 USD 。此專案的主要功能如下:open 開一個新交易池包含A 到B 和B 到A 的交易對,同樣每個交易對包含預設的交易策略;mint 為給交易對添加流動性並獲得LP Token ; burn 為銷毀LP Token 取得對應的貨幣。

攻擊及事件分析

首先,攻擊者從Morpho Blue 中利用flashloan 借貸了267個WETH,

零時科技 || CloberDEX 攻擊事件分析

接著,攻擊者使用open 在CloberDEX 開了兩個交易對分別是Token/WETH 和WETH/Token ,其中, Token 為攻擊者自行部署的合約。

零時科技 || CloberDEX 攻擊事件分析

然後,攻擊者利用mint 分別向剛開的交易對中轉入267 WETH 和267 Token ,用於添加流動性並獲取LP Token。

零時科技 || CloberDEX 攻擊事件分析

至此,都沒問題。最後,攻擊者利用burn 銷毀剛獲得的LP Token,我們來看看burn 的具體實作;

零時科技 || CloberDEX 攻擊事件分析

控制流走向了lock 函數,同樣,我們看一下lock 的具體實作;

零時科技 || CloberDEX 攻擊事件分析

可以看到,lock 函數中又把bytes caldata data 傳向了lockAcquired 函數,我們繼續看該函數的實作;

零時科技 || CloberDEX 攻擊事件分析

我們發現這行程式碼

零時科技 || CloberDEX 攻擊事件分析

我們可以看到,該程式碼所呼叫的函數由data 決定。那麼data 的前四位元組此時為_burn 的簽名,所以本質上burn 呼叫了_burn 。

零時科技 || CloberDEX 攻擊事件分析

我們可以看到, _burn 又呼叫了pool.strategy.burnHook(msg.sender, key, burnAmount,supply) ,而且,針對pool 的reserver 的處理又在該程式碼之後。所以,問題出現在這裡,交易對對應的pool 的strategy 合約的地址可以由攻擊者控制。在這次攻擊中,攻擊者將該地址寫為自己的攻擊合約地址即: 0x32fb1bedd95bf78ca2c6943ae5aeaeaafc0d97c1

當合約流程走到了攻擊合約的BurnHook 後,又繼續呼叫burn 完成重入攻擊。

零時科技 || CloberDEX 攻擊事件分析

攻擊者透過該漏洞取出了投入的264 個WETH 和CloberDEX 合約中的133 個WETH ,在歸還flashloan 的貸款後獲利133.7 ETH ,約為500,000 USD 。

總結

這次漏洞成因主要是因為CloberDEX 專案方合約在取得銷毀LP Token 的程式碼中沒有進行重入偵測和防護,且更新狀態變數在合約呼叫之後,最終導致攻擊者利用該重入漏洞掏空專案方的WETH 。建議專案方在設計經濟模型、價格電腦制和程式碼運作邏輯時要多方驗證,合約上線前審計時盡量選擇多個審計公司交叉審計。