北京時間2024年2月28日,根據Beosin trace資金分析平台顯示,ETH鏈上的SenecaUSD專案合約存在漏洞,駭客利用精心建構的calldata參數,調用transferfrom將授權到該專案合約的代幣轉移到自己地址上,最後兌換為ETH。目前駭客已歸還80%資金,剩餘20%用作白帽獎勵。以下是Beosin對此攻擊事件的分析。
漏洞分析
Seneca專案合約中存在一個performOperations函數,該函數傳入的參數來選擇執行不同的函數邏輯。
可以看到,當使用者指定action為30時,函數會選擇呼叫_call函數,並且傳入使用者指定的呼叫參數。
_call函數只檢查了一下呼叫位址的黑名單,隨後便直接呼叫了使用者指定位址的指定函數,期間並未對呼叫者以及呼叫參數做任何限制性檢查。
如果呼叫者在這裡建構非法的呼叫數據,便可能導致攻擊事件的發生。
攻擊流程
本次事件攻擊者透過多次相同的手法進行攻擊,這裡以0x23fcf9d4517f7cc39815b09b0a80c023ab2c8196c826c93b4100f2e26b701286這筆交易為例。讓我們來看看這次攻擊者是如何建構呼叫資料以及實施攻擊的。
1. 攻擊者直接呼叫performOperations函數,並建構了以下參數,其中actions傳入了上述的30,將呼叫_call函數。
2. Datas數據為:
0x000000000000000000000000b05cabcd99cf9a73b19805edefc5f67ca5d1895e
0000000000000000000000000000000000000000000000000000000000000a0
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000064
23b872dd00000000000000000000000009cbf099ff424979439dfba03f00b5961
784c06ce00000000000000000000000094641c01a4937f2c8ef930580cf39614
2a2942dc0000000000000000000000000000000000000000000004b180b8661
8eddc3ab00000000000000000000000000000000000000000000000000000000
根據解析規則來看,第一個32位元組為callee=0xb05cabcd99cf9a73b19805edefc5f67ca5d1895e。
第二個callData在a0處,100(0x64)位元組,則得到
callData為:
0x23b872dd0000000000000000000000009cbf099ff424979439dfba03f00b5961784c06ce0000000000000000000021 a2942dc0000000000000000000000000000000000000000000004b180b86618eddc3ab
3. 查詢函數選擇器,根據callData資料可知,callData指定的是transferFrom函數。那本次呼叫我們可以解析出來為:
0xb05cabcd99cf9a73b19805edefc5f67ca5d1895e.transferFrom(0x9cbf099ff424979439dfba03f00b5961784c06ce,0x94641c01a00b5961784c06ce,0x94641c01a649386a 238431763437306795)。
4. 由於在先前的交易中,0x9cbf099ff424979439dfba03f00b5961784c06ce向0x65c210c59b43eb68112b7a4f75c8393c36491f068112b7a4f75c8393c36491f068112b7a4f75c8393c36491f066Fffx dfba03f00b5961784c06ce的超1385枚PT-rsETH-27JUN2024(0xb05cabcd99cf9a73b19805edefc5f67ca5d1895e)代幣轉移到自己的地址上。
5. 隨後攻擊者將PT-rsETH-27JUN2024代幣兌換為ETH。
資金追蹤
在被攻擊後,Seneca部署者向攻擊者喊話,要求攻擊者歸還資金,並表示可以保留20%的資金作為白帽獎勵。
根據Beosin trace資金追蹤平台顯示,截止發稿,攻擊者已將被盜1900多枚ETH中的1537枚ETH(80%)歸還到部署者指定地址,剩餘370枚ETH(20%)分散保留在攻擊者地址上。