來源:Beosin
2024年1月17日,據Beosin旗下EagleEye安全風險監(jiān)控、預警與阻斷平臺監(jiān)測顯示,Socket協(xié)議遭受攻擊者call注入攻擊,導致大量授權用戶資金被盜。目前攻擊者將被盜資金兌換為ETH,并保存在攻擊者地址上。
攻擊發(fā)生之后,Socket官方確認被攻擊,并第一時間暫停受影響的合約。
同時,MetaMask在X平臺發(fā)文稱,MetaMask Bridge用戶不受今天發(fā)生的Socket漏洞的影響。MetaMask稱設計跨鏈橋合約時采用了獨特的架構,旨在防范此類攻擊。
關于本次攻擊,Beosin安全團隊對本次漏洞進行了分析。
漏洞分析
該事件發(fā)生的主要原因是Socket合約的performAction函數(shù)存在不安全的call調用。如下圖,該函數(shù)的基本功能是將用戶的ETH和WETH進行轉換,如果調用者選擇fromToken為ETH,那么將會查詢合約的toToken(WETH)余額,隨后通過call調用toToken(正常邏輯下,此處必須調用WETH的deposit函數(shù)),并轉入用戶指定的ETH數(shù)量,接下來查詢合約的toToken(WETH)新余額,如果等于轉入用戶指定的ETH數(shù)量,那么通過,并將toToken轉給調用者指定地址。如果調用者選擇fromToken不為ETH,那么與上述同理,函數(shù)功能就是將調用者的WETH兌換成ETH(正常情況下,call調用必須是調用WETH的withdraw函數(shù))并發(fā)送給用戶指定地址。
雖然函數(shù)中并沒有對fromToken與toToken進行任何檢查限制,但是除了傳入WETH地址,其他ERC20地址都將導致余額檢查失敗,從而無法偽造這兩個參數(shù),間接將token地址限制為WETH。
雖然對token地址有所限制,但是該函數(shù)還存在一個問題,便是未對amount進行限制,如果調用者傳入的amount為0,則函數(shù)的檢查條件將恒通過,并不需要調用WETH的deposit與withdraw函數(shù)。此時便可以在call中注入異常的數(shù)據,從而達到攻擊的目的。
攻擊流程
明白了函數(shù)問題點,我們來看看攻擊者是如何實施攻擊的。
1.攻擊者首先創(chuàng)建了一個攻擊合約。
2.隨后,攻擊者多次查詢不同地址的WETH余額,并且查詢該地址對于Socket: Gateway合約的授權數(shù)量,最后調用Socket: Gateway合約。
3.可以看到,這里調用performAction函數(shù)的時候,swapExtraData參數(shù)傳入的是0x23b872dd...,該數(shù)據是transferfrom的函數(shù)簽名,說明這里將直接調用token的transferfrom函數(shù)。
4.可以看到,攻擊者傳入fromToken為WETH,amount正是我們上述的0,合約將攻擊者的WETH轉入合約,但轉的是0,而在call調用中,攻擊者指定一個用戶地址向攻擊者轉了16枚WETH。
5.攻擊者通過大量操作,將無數(shù)用戶的WETH轉移給自己。
6.攻擊者使用相同的方式,將授權給該合約的USDT轉移給自己。
7.還包括WBTC、DAI以及MATIC三種代幣。
截止發(fā)稿,被盜的近330萬美元的資金,部分被攻擊者兌換為了ETH,并且一直存在黑客地址未移動,Beosin Trace將對被盜資金進行持續(xù)監(jiān)控。
目前,互操作性協(xié)議Socket在X平臺發(fā)布安全事件更新:Socket現(xiàn)已恢復運營,受影響的合約已暫停,損害已得到完全控制。在Bungee的橋接以及其大多數(shù)合作伙伴前端的橋接已經恢復。詳細的事件分析和后續(xù)步驟將很快公布。
Socke提醒道:“小心回復中試圖對您進行網絡釣魚的虛假Socket帳戶。在采取任何行動之前,請務必仔細檢查帳戶?!?/strong>
本次事件也再次提醒各位,安全不可掉以輕心。