來(lái)源:Beosin
2024年1月17日,據(jù)Beosin旗下EagleEye安全風(fēng)險(xiǎn)監(jiān)控、預(yù)警與阻斷平臺(tái)監(jiān)測(cè)顯示,Socket協(xié)議遭受攻擊者call注入攻擊,導(dǎo)致大量授權(quán)用戶(hù)資金被盜。目前攻擊者將被盜資金兌換為ETH,并保存在攻擊者地址上。
攻擊發(fā)生之后,Socket官方確認(rèn)被攻擊,并第一時(shí)間暫停受影響的合約。

同時(shí),MetaMask在X平臺(tái)發(fā)文稱(chēng),MetaMask Bridge用戶(hù)不受今天發(fā)生的Socket漏洞的影響。MetaMask稱(chēng)設(shè)計(jì)跨鏈橋合約時(shí)采用了獨(dú)特的架構(gòu),旨在防范此類(lèi)攻擊。

關(guān)于本次攻擊,Beosin安全團(tuán)隊(duì)對(duì)本次漏洞進(jìn)行了分析。
漏洞分析
該事件發(fā)生的主要原因是Socket合約的performAction函數(shù)存在不安全的call調(diào)用。如下圖,該函數(shù)的基本功能是將用戶(hù)的ETH和WETH進(jìn)行轉(zhuǎn)換,如果調(diào)用者選擇fromToken為ETH,那么將會(huì)查詢(xún)合約的toToken(WETH)余額,隨后通過(guò)call調(diào)用toToken(正常邏輯下,此處必須調(diào)用WETH的deposit函數(shù)),并轉(zhuǎn)入用戶(hù)指定的ETH數(shù)量,接下來(lái)查詢(xún)合約的toToken(WETH)新余額,如果等于轉(zhuǎn)入用戶(hù)指定的ETH數(shù)量,那么通過(guò),并將toToken轉(zhuǎn)給調(diào)用者指定地址。如果調(diào)用者選擇fromToken不為ETH,那么與上述同理,函數(shù)功能就是將調(diào)用者的WETH兌換成ETH(正常情況下,call調(diào)用必須是調(diào)用WETH的withdraw函數(shù))并發(fā)送給用戶(hù)指定地址。
雖然函數(shù)中并沒(méi)有對(duì)fromToken與toToken進(jìn)行任何檢查限制,但是除了傳入WETH地址,其他ERC20地址都將導(dǎo)致余額檢查失敗,從而無(wú)法偽造這兩個(gè)參數(shù),間接將token地址限制為WETH。?

雖然對(duì)token地址有所限制,但是該函數(shù)還存在一個(gè)問(wèn)題,便是未對(duì)amount進(jìn)行限制,如果調(diào)用者傳入的amount為0,則函數(shù)的檢查條件將恒通過(guò),并不需要調(diào)用WETH的deposit與withdraw函數(shù)。此時(shí)便可以在call中注入異常的數(shù)據(jù),從而達(dá)到攻擊的目的。
明白了函數(shù)問(wèn)題點(diǎn),我們來(lái)看看攻擊者是如何實(shí)施攻擊的。
1.攻擊者首先創(chuàng)建了一個(gè)攻擊合約。

2.隨后,攻擊者多次查詢(xún)不同地址的WETH余額,并且查詢(xún)?cè)摰刂穼?duì)于Socket: Gateway合約的授權(quán)數(shù)量,最后調(diào)用Socket: Gateway合約。?

3.可以看到,這里調(diào)用performAction函數(shù)的時(shí)候,swapExtraData參數(shù)傳入的是0x23b872dd...,該數(shù)據(jù)是transferfrom的函數(shù)簽名,說(shuō)明這里將直接調(diào)用token的transferfrom函數(shù)。

4.可以看到,攻擊者傳入fromToken為WETH,amount正是我們上述的0,合約將攻擊者的WETH轉(zhuǎn)入合約,但轉(zhuǎn)的是0,而在call調(diào)用中,攻擊者指定一個(gè)用戶(hù)地址向攻擊者轉(zhuǎn)了16枚WETH。

5.攻擊者通過(guò)大量操作,將無(wú)數(shù)用戶(hù)的WETH轉(zhuǎn)移給自己。?

6.攻擊者使用相同的方式,將授權(quán)給該合約的USDT轉(zhuǎn)移給自己。?

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



截止發(fā)稿,被盜的近330萬(wàn)美元的資金,部分被攻擊者兌換為了ETH,并且一直存在黑客地址未移動(dòng),Beosin Trace將對(duì)被盜資金進(jìn)行持續(xù)監(jiān)控。?

目前,互操作性協(xié)議Socket在X平臺(tái)發(fā)布安全事件更新:Socket現(xiàn)已恢復(fù)運(yùn)營(yíng),受影響的合約已暫停,損害已得到完全控制。在Bungee的橋接以及其大多數(shù)合作伙伴前端的橋接已經(jīng)恢復(fù)。詳細(xì)的事件分析和后續(xù)步驟將很快公布。
Socke提醒道:“小心回復(fù)中試圖對(duì)您進(jìn)行網(wǎng)絡(luò)釣魚(yú)的虛假Socket帳戶(hù)。在采取任何行動(dòng)之前,請(qǐng)務(wù)必仔細(xì)檢查帳戶(hù)。”

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