零时科技 || TransitSwapRouterV5攻击分析
事件背景
2023 年 12 月 20 日下午 我们监控到 Transit Swap 项目遭到黑客在多个公链上的攻击交易,且最终黑客共计获利约 110k $。
下方为该漏洞合约在多个链上的部署地址:
https://docs.transit.finance/en/reference/smart-contracts
攻击交易:
0x93ae5f0a121d5e1aadae052c36bc5ecf2d406d35222f4c6a5d63fef1d6de1081(BSC链)
攻击分析
由于攻击者在多个链上对该项目进行攻击,本文主要通过对BNB链上攻击者交易数据进行分析,并对其交易进行整理归纳。
黑客通过 TransitSwapRouterV5 合约的多路径兑换功能将 0.01 BNB 成功兑换了约为 173.9 BNB ,如下图:
通过交易堆栈数据,我们看出该笔兑换操作经过 2 次兑换操作,不过期间调用了一个未验证的交易对合约
(0x7d7583724245eeebb745ebcb1cee0091ff43082b),并将一个最小单位的BNB( 1/1e18 BNB )兑换为了约 43841.86 USDT,而且此处兑换得到的金额与当前 TransitSwapRouterV5 合约的自身USDT储备余额一致。
根据攻击交易的参数对其合约逻辑进行分析:
当兑换路径大于1时的逻辑如下:
深入 _swap 函数,查看具体兑换逻辑,此处的内部兑换函数在调用外部传入的 pool 池子进行代币兑换后,未对兑换后的资金进行校验,直接使用 pool 返回的兑换金额进行下一个路径的兑换操作,从而导致攻击者构造假的 pool 合约并直接在swap函数中返回当前TransitSwapRouterV5 合约自身的USDT储备,进而造成合约资金被拿去做第二次兑换,最终使攻击者获利。
经分析该攻击者获利资金最终流入 Tornado Cash 混币平台。
总结
简单来说,TransitSwapRouterV5 合约中多路径兑换函数缺少兑换成功校验,导致多路径兑换中使用虚假的兑换金额在后续的兑换中换取真实资金并成功获利。
安全建议
在多路径兑换代币时对传入的交易对池子进行校验,或对多路径兑换操作中的兑换结果进行校验,如某次兑换资金未到账或兑换失败则直接回滚,避免攻击者使用虚假交易池造成的虚假兑换。
建议项目方上线前进行多次审计,避免出现审计步骤缺失。