漏洞合約函數
function returnVaultAssets(address router, address payable asgard, Coin[] memory coins, string memory memo) public payable {if (router == address(this)){for(uint i = 0; i < coins.length; i++){_adjustAllowances(asgard, coins[i].asset, coins[i].amount);}emit VaultTransfer(msg.sender, asgard, coins, memo); // Does not include ETH. } else {for(uint i = 0; i < coins.length; i++){_routerDeposit(router, asgard, coins[i].asset, coins[i].amount, memo);}}asgard.call{value:msg.value}(""); //ETH amount needs to be parsed from tx.}
相關交易與地址
攻擊者地址:0x8c1944fac705ef172f21f905b5523ae260f76d62
?
漏洞合約地址:0xC145990E84155416144C532E31f89B840Ca8c2cE
執行的惡意交易:
具體細節分析
在跨鏈代鏈轉移場景中,合約通過觸發事件(emit event)通知鏈下節點執行后續操作。該函數作為一個跨鏈合約的函數,其參數asgard可被攻擊者所操控,同時在合約里進一步調用了該參數的call函數。攻擊者即可構造一個惡意合約,將asgard設置為該合約地址,并在該合約fallback函數里主動偽造跨鏈事件,誘導鏈下節點誤判為合法跨鏈交易來實施惡意交易
具體實施:
攻擊者調用該函數,并通過構造的合約發起名為Deposit的事件,該事件與THORChain的ROUTER合約中deposit函數發起的事件構造相同,但包含不符合標準的memo:Do not rush code that controls 9 figures,鏈下節點捕捉到該事件后發現不符合標準,即觸發對應的退款邏輯,通過transferout函數將對應的token“退還”給攻擊者,攻擊者即通過該方法盜取對應的代幣。
參考鏈接
https://thearchitect.notion.site/THORChain-Incident-07-22-874a06db7bf8466caf240e1823697e35https://etherscan.io/
https://slowmist.medium.com/slowmist-analysis-of-three-consecutive-attacks-on-thorchain-6223f1c691be