# 跨链 DEX 聚合器 Transit Swap 攻击分析

By [HyperLab](https://paragraph.com/@hyperlab) · 2022-10-03

---

![](https://storage.googleapis.com/papyrus_images/0954eeba5de8ec570ea93d73757e018538d7599a2b43317f6c35695526b4577d.jpg)

10月2日，跨链 DEX 聚合器 Transit Swap 遭受攻击，导致大量用户的资金从钱包中被取出，预计损失超 2100 万美元。Transit Finance称，各方安全公司和项目组仍在继续追踪黑客事件，并通过邮件、链上等方式与黑客进行沟通。项目组正在抓紧收集被盗用户的具体数据，制定具体的返还方案。同时团队将继续追回黑客被盗资产的剩余资产，并将其归还给丢失的用户。截止发稿前，黑客已经归还约70%的资产。

![](https://storage.googleapis.com/papyrus_images/73b680494b968a4a7312657ff46267ba1dd80119a461607aa75fc5d5aaf063fc.png)

黑客地址：0x75F2abA6a44580D7be2C4e42885D4a1917bFFD46

Hyperlab 安全实验室根据链上交易进行分析，此次攻击发生的要原因在于 Transit Swap 协议在进行代币兑换时并未对用户传入的数据进行严格检查，导致了任意外部调用的问题。

具体来说，用户在用Transit Swap进行兑换时，会调用一个代理合约(0x8785bb8deae13783b24d7afe250d42ea7d7e9d72)。这个代理合约会根据代币的种类选择路径。紧接着路由桥合约（0x0B47275E0Fe7D5054373778960c99FD24F59ff52）会调用权限管理合约（0xed1afc8c4604958c2f38a3408fa63b32e737c428）的claimtokens进行转账。而 claimTokens 函数是通过调用指定代币合约的 transferFrom 函数进行转账的。其接收的参数都由上层路由桥合约传入，本身没有对这些参数进行任何限制，只检查了调用者必须为路由代理合约或路由桥合约。

攻击者利用路由代理合约、路由桥合约与权限管理合约未对传入的数据进行检查的缺陷，通过路由代理合约传入构造后的数据调用路由桥合约的 callBytes 函数。callBytes 函数解析出攻击者指定的兑换合约与兑换数据。此时兑换合约被指定为权限管理合约地址，兑换数据被指定为调用 claimTokens 函数将指定用户的代币转入攻击者指定的地址中。由此攻击者实现了窃取所有对权限管理合约进行授权的用户的代币。

Hyperlab 安全实验室提醒，在跨合约的函数调用时，合约开发者需要对用户传入的数据进行严格检查，并对下层对上层给的返回值进行正确校验。对Transit Swap用户而言，需停止使用Transit Swap，并提高自身对区块链钱包的安全意识，尤其是对DEX 的router的无限授权权限保持谨慎。

---

*Originally published on [HyperLab](https://paragraph.com/@hyperlab/dex-transit-swap)*
