02月03日,星期五 05:40
据慢雾安全团队情报,2023 年 2 月 3 日,Orion Protocol 项目的 ETH 和 BSC 链上的合约遭到攻击,攻击者获利约 302.7 万美元。慢雾安全团队以简讯的形式分享如下:
1. 攻击者首先调用 ExchangeWithAtomic 合约的 depositAsset 函数进行存款,存入 0.5 个 USDC 代币为下面的攻击作准备;
2. 攻击者闪电贷出 284.47 万枚 USDT 代币,接着调用 ExchangeWithAtomic 合约的 doSwapThroughOrionPool 函数兑换代币,兑换路径是 [USDC -> ATK(攻击者创建的恶意代币)-> USDT];
3. 因为兑换出来的结果是通过兑换后 ExchangeWithAtomic 合约里的 USDT 代币余额减去兑换前该合约里的 USDT 代币余额(284.47 万枚),但问题就在兑换 USDC -> ATK 后,会调用 ATK 代币的转账函数,该函数由攻击恶意构造会通过攻击合约调用 ExchangeWithAtomic 合约的 depositAsset 函数来将闪电贷来的 284.4 万 USDT 代币存入 ExchangeWithAtomic 合约中。此时攻击合约在 ExchangeWithAtomic 合约里的存款被成功记账为 284.47 万枚并且 ExchangeWithAtomic 合约里的 USDT 代币余额为 568.9 万枚,使得攻击者兑换出的 USDT 代币的数量被计算为兑换后的 568.9 万减去兑换前的 284.47 万等于 284.47 万;
4. 之后兑换后的 USDT 代币最后会通过调用库函数 creditUserAssets 来更新攻击合约在 ExchangeWithAtomic 合约里的使用的账本,导致攻击合约最终在 ExchangeWithAtomic 合约里 USDT 代币的存款记账为 568.9 万枚;
5. 最后攻击者调用 ExchangeWithAtomic 合约里的 withdraw 函数将 USDT 提取出来,归还闪电贷后将剩余的 283.6 万枚 USDT 代币换成 WETH 获利。攻击者利用一样的手法在 BSC 链上的也发起了攻击,获利 19.1 万美元;
此次攻击的根本原因在于合约兑换功能的函数没有做重入保护,并且兑换后再次更新账本存款的数值是根据兑换前后合约里的代币余额差值来计算的,导致攻击者利用假代币重入了存款函数获得超过预期的代币。
参考攻击交易:
https://etherscan.io/tx/0xa6f63fcb6bec8818864d9
6a5b1bb19e8bd85ee37b2cc916412e720988440b2aa
https://bscscan.com/tx/0xfb153c572e304093023b
4f9694ef39135b6ed5b2515453173e81ec02df2e2104