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有關。
2. 這些資金被用來創建和執行兩個合約,來利用Socket的漏洞。第一個合約針對的是授權了SocketGateway 的地址中的USDC(截圖如下);127 名受害者被騙走約250 萬美元。
3. 接下來,第二個合約將目標對準了受害者地址內的WETH, USDT, WBTC, DAI 與MATIC。於是,另外104名受害者損失如下資產:
– 42.47526105 WETH
– 347,005.65 USDT
– 2.88962154 WBTC
– 13,821.01 DAI
– 165,356.99 MATIC
4. 攻擊者將USDC與USDT轉換成了ETH。
漏洞來源
被攻擊者利用的漏洞存在於新加入的路由位址routeAddress內的performAction函數。
該位址內的performAction函數原本的功能是協助Wrapping與Unwrapping的功能。然而,該函數中出現了一個關鍵漏洞:使用者在無需驗證的情況下,直接在.call() 中透過swapExtraData呼叫外部數據,這意味著攻擊者可以執行任意惡意函數。
在這次事件中,攻擊者製作了一個惡意的swapExtraData 輸入,觸發transferFrom函數。該惡意調用利用了用戶對SocketGateway 合約的授權,從他們那裡盜走了資金。
雖然合約會透過檢查餘額檢查確保fromToken.call() 呼叫後用戶餘額會出現正確的變化,但函數沒有考慮攻擊者將金額設為0的情況。
還原攻擊流程
1. 使用攻擊合約,攻擊者在Socket Gateway合約上呼叫了0x00000196()。
2. fallback() 使用六進位簽章196 呼叫了有漏洞的路由位址合約(routerAddress)。
3. 在下面的截圖中,我們可以看到攻擊者使用的虛假輸入,Swapping數量全部為0。
4. 接下來將會呼叫WrappedTokenSwapperImpl.performAction() 進行Swap。
5. 在沒有進行任何驗證的情況下,虛假的SwapExtraData被fromToken (WETH)接受並執行。
6. 攻擊者重複執行以上流程,直到受害者資產耗盡。惡意交易出現後,Socket 迅速呼叫了disableRoute,屏蔽了先前有漏洞的路由,阻止了更大範圍的攻擊。
7. 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將繼續致力於為平台提供全方位審計與檢測,降低各類聚合風險,提高社區信任和整個行業的安全水平。