10月2日,跨链 DEX 聚合器 Transit Swap 遭受攻击,导致大量用户的资金从钱包中被取出,预计损失超 2100 万美元。Transit Finance称,各方安全公司和项目组仍在继续追踪黑客事件,并通过邮件、链上等方式与黑客进行沟通。项目组正在抓紧收集被盗用户的具体数据,制定具体的返还方案。同时团队将继续追回黑客被盗资产的剩余资产,并将其归还给丢失的用户。截止发稿前,黑客已经归还约70%的资产。
黑客地址:0x75F2abA6a44580D7be2C4e42885D4a1917bFFD46
Hyperlab 安全实验室根据链上交易进行分析,此次攻击发生的要原因在于 Transit Swap 协议在进行代币兑换时并未对用户传入的数据进行严格检查,导致了任意外部调用的问题。
具体来说,用户在用Transit Swap进行兑换时,会调用一个代理合约(0x8785bb8deae13783b24d7afe250d42ea7d7e9d72)。这个代理合约会根据代币的种类选择路径。紧接着路由桥合约(0x0B47275E0Fe7D5054373778960c99FD24F59ff52)会调用权限管理合约(0xed1afc8c4604958c2f38a3408fa63b32e737c428)的claimtokens进行转账。而 claimTokens 函数是通过调用指定代币合约的 transferFrom 函数进行转账的。其接收的参数都由上层路由桥合约传入,本身没有对这些参数进行任何限制,只检查了调用者必须为路由代理合约或路由桥合约。
攻击者利用路由代理合约、路由桥合约与权限管理合约未对传入的数据进行检查的缺陷,通过路由代理合约传入构造后的数据调用路由桥合约的 callBytes 函数。callBytes 函数解析出攻击者指定的兑换合约与兑换数据。此时兑换合约被指定为权限管理合约地址,兑换数据被指定为调用 claimTokens 函数将指定用户的代币转入攻击者指定的地址中。由此攻击者实现了窃取所有对权限管理合约进行授权的用户的代币。
Hyperlab 安全实验室提醒,在跨合约的函数调用时,合约开发者需要对用户传入的数据进行严格检查,并对下层对上层给的返回值进行正确校验。对Transit Swap用户而言,需停止使用Transit Swap,并提高自身对区块链钱包的安全意识,尤其是对DEX 的router的无限授权权限保持谨慎。