漏洞合约函数
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