被盜約330萬美元跨鏈互通協議Socket如何遭受駭客call注入攻擊?

來源:Beosin

2024年1月17日,根據Beosin旗下EagleEye安全風險監控、預警與阻斷平台監控顯示,Socket協定遭受攻擊者call注入攻擊,導致大量授權用戶資金被竊。目前攻擊者將被竊資金兌換為ETH,並保存在攻擊者地址上。

攻擊發生之後,Socket官方確認被攻擊,並在第一時間暫停受影響的合約。

同時,MetaMask在X平台發文稱,MetaMask Bridge用戶不受今天發生的Socket漏洞的影響。 MetaMask稱設計跨鏈橋合約時採用了獨特的架構,旨在防範此類攻擊。

關於本次攻擊,Beosin安全團隊對本次漏洞進行了分析。

漏洞分析

該事件發生的主要原因是Socket合約的performAction函數存在不安全的call呼叫。如下圖,函數的基本功能是將使用者的ETH和WETH轉換,如果呼叫者選擇fromToken為ETH,那麼將會查詢合約的toToken(WETH)餘額,隨後透過call呼叫toToken(正常邏輯下,此處必須呼叫WETH的deposit函數),並轉入使用者指定的ETH數量,接下來查詢合約的toToken(WETH)新餘額,如果等於轉入使用者指定的ETH數量,那麼透過,並將toToken轉給呼叫者指定地址。如果呼叫者選擇fromToken不為ETH,那麼與上述同理,函數功能就是將呼叫者的WETH兌換成ETH(正常情況下,call呼叫必須是呼叫WETH的withdraw函數)並傳送給使用者指定位址。

雖然函數中並沒有對fromToken與toToken進行任何檢查限制,但是除了傳入WETH地址,其他ERC20地址都將導致餘額檢查失敗,從而無法偽造這兩個參數,間接將token地址限制為WETH。

雖然對token位址有所限制,但是該函數還存在一個問題,便是未對amount進行限制,如果調用者傳入的amount為0,則函數的檢查條件將恆通過,並不需要調用WETH的deposit與withdraw函式。此時便可在call中註入異常的數據,從而達到攻擊的目的。

攻擊流程

明白了函數問題點,我們來看看攻擊者是如何實施攻擊的。

1.攻擊者首先創建了一個攻擊合約。

2.隨後,攻擊者多次查詢不同位址的WETH餘額,並且查詢該位址對於Socket: Gateway合約的授權數量,最後呼叫Socket: Gateway合約。

3.可以看到,這裡呼叫performAction函數的時候,swapExtraData參數傳入的是0x23b872dd…,該資料是transferfrom的函數簽名,說明這裡將直接呼叫token的transferfrom函數。

4.可以看到,攻擊者傳入fromToken為WETH,amount正是我​​們上述的0,合約將攻擊者的WETH轉入合約,但轉的是0,而在call呼叫中,攻擊者指定一個用戶地址向攻擊者轉了16枚WETH。

5.攻擊者透過大量操作,將無數用戶的WETH轉移給自己。

6.攻擊者使用相同的方式,將授權給該合約的USDT轉移給自己。

7.還包括WBTC、DAI以及MATIC三種代幣。

截止發稿,被盜的近330萬美元的資金,部分被攻擊者兌換為了ETH,並且一直存在黑客地址未移動,Beosin Trace將對被盜資金進行持續監控。

目前,互通性協議Socket在X平台發布安全事件更新:Socket現已恢復運營,受影響的合約已暫停,損害已完全控制。在Bungee的橋接以及其大多數合作夥伴前端的橋接已經恢復。詳細的事件分析和後續步驟將很快公佈。

Socke提醒道:“小心回復中試圖對您進行網絡釣魚的虛假Socket帳戶。在採取任何行動之前,請務必仔細檢查帳戶。”

這次事件也再次提醒各位,安全不可掉以輕心。

Total
0
Shares
Related Posts