Certik 詳解 Socket 攻擊事件始末

2024年2月6日 16点热度 0人点赞

2024 年 1 月 16 日,Socket Tech遭到攻擊,損失約 330 萬美元。 攻擊者利用了Socket某合約中數據驗證環節的漏洞,通過惡意數據輸入盜取了授權合約的用戶資金。 這次攻擊共給 230 個地址帶來損失,最大的單地址損失約為 65.6 萬美元。

背景介紹

Socket 是一種服務於跨鏈安全、高效數據和資產傳輸的互操作性協議。 Socket Gateway合約是與 Socket 流動性層所有交互的接入點,所有資產橋接器和 DEX 在此匯聚成一個唯一的元橋接器,並根據用戶偏好(如成本、延遲或安全性)選擇最佳交易路由。

黑客攻擊發生的前三天,Socket合約管理員執行了addRoute命令,在系統中加入了一條新路由。 添加路由的目的是擴展Socket網關的功能,但卻無意中引入了一個關鍵漏洞。

下圖為通過合約管理員添加路由的記錄

事件梗概

  1. 北京時間1月16日15:03,攻擊者錢包轉入攻擊所用資金,我們的時間分析表明這筆資金來自0xe620,與從Tornado Cash提取的10 BNB有關。

  1. 這些資金被用於創建和執行兩個合約,來利用Socket的漏洞。 第一個合約針對的是授權了 SocketGateway 的地址中的 USDC(截圖如下);127 名受害者被騙走約 250 萬美元。

  1. 接下來,第二個合約則將目標對準了受害者地址內的WETH, USDT, WBTC, DAI 與MATIC。於是,另外104名受害者損失了如下資產:
  • 42.47526105 WETH
  • 347,005.65 USDT
  • 2.88962154 WBTC
  • 13,821.01 DAI
  • 165,356.99 MATIC
  1. 攻擊者將USDC與USDT轉換成了ETH。

漏洞來源

被攻擊者利用的漏洞存在於新添加的路由地址 routeAddress內的performAction函數中。

該地址內的performAction函數原本的功能是協助Wrapping與Unwrapping的功能。 然而,該函數中出現了一個關鍵漏洞:用戶在無需驗證的情況下,直接在.call() 中通過swapExtraData調用外部數據,這意味著攻擊者可以執行任意惡意函數。

在這次事件中,攻擊者制作了一個惡意的 swapExtraData 輸入,觸發transferFrom函數。 該惡意調用利用了用戶對 SocketGateway 合約的授權,從他們那裡盜走了資金。

雖然合約會通過檢查餘額檢查確保 fromToken.call() 調用後用戶餘額會出現正確的變化,但該函數沒有考慮攻擊者將金額設置為0的情況。

還原攻擊流程

  1. 使用攻擊合約,攻擊者在Socket Gateway合約上調用了0x00000196()。

  1. fallback() 使用六進制簽名 196 調用了有漏洞的路由地址合約(routerAddress)。

  1. 在下面的截圖中,我們可以看到攻擊者使用的虛假輸入,Swapping數量全部為0。

  1. 接下來將調用WrappedTokenSwapperImpl.performAction() 進行Swap。

  1. 在沒有進行任何驗證的情況下,虛假的SwapExtraData被fromToken (WETH)接受並執行。

  1. 攻擊者重復執行以上流程,直到受害者資產耗盡。 惡意交易出現後,Socket 迅速調用了 disableRoute,屏蔽了之前有漏洞的路由,阻止了更大范圍的攻擊。
  2. 1月23日,Socket宣佈已經追回1032枚ETH,並在25日宣佈將全額補償所有損失。本次事件得到解決。

事件總結

在有著無限額用戶授權的路由合約中,惡意 calldata 攻擊並不罕見。 以前類似的攻擊包括 Dexible 和 Hector Bridge。 2023 年 2 月 17 日,去中心化交易所 Dexible 被攻擊,損失超過 150 萬美元。 漏洞利用者向 Dexible 的 fill() 函數輸入惡意 calldata,以竊取用戶資產。 2023 年 6 月 2 日,Hector 網絡的協議被攻擊。攻擊者部署了一個虛假的 USDC合約,並通過惡意 calldata,將 65.2萬枚真實的USDC從受害者的合約中轉移出去。

區塊鏈聚合平臺通常通過封裝一系列橋和路由合約來提高流動性,減少損耗。然而,這種復雜的封裝會給安全性帶來更多難題。我們欣慰地看到Socket此次事件可以得到解決,CertiK將繼續致力於為平臺提供全方位審計與檢測,降低各類聚合風險,提高社區信任和整個行業的安全水平。