此次攻击事件的根本原因在于合约兑换功能的函数没有做重入保护。

作者:九九

据慢雾安全团队情报,2023 年 2 月 3 日,Orion Protocol 项目的 ETH 和 BSC 链上的合约遭到攻击,攻击者获利约 302.7 万美元。慢雾安全团队第一时间介入分析,并将结果分享如下:

相关信息

Orion Protocol 是一个去中心化的加密网关,用户可以通过其来进行代币交易、质押、跨链等。

以下是本次攻击涉及的相关地址:

攻击者 EOA 地址:

0x837962b686fd5a407fb4e5f92e8be86a230484bd

攻击合约地址:

https://etherscan.io/address/0x5061F7e6dfc1a867D945d0ec39Ea2A33f772380A

https://bscscan.com/address/0x84452042cb7be650be4eb641025ac3c8a0079b67

攻击交易:

https://etherscan.io/tx/0xa6f63fcb6bec8818864d96a5b1bb19e8bd85ee37b2cc916412e720988440b2aa

https://bscscan.com/tx/0xfb153c572e304093023b4f9694ef39135b6ed5b2515453173e81ec02df2e2104

被攻击的合约地址:

https://etherscan.io/address/0xb5599f568D3f3e6113B286d010d2BCa40A7745AA

https://bscscan.com/address/0xe9d1d2a27458378dd6c6f0b2c390807aed2217ca

攻击核心点

被攻击的 ExchangeWithAtomic 合约类似一个市场,用户可以先在 ExchangeWithAtomic 合约存款,并通过该合约来进行代币兑换和提取。但是 ExchangeWithAtomic 合约兑换代币的函数并没有做重入保护,且兑换后再次更新账本存款的取值方式仅采用兑换前后的余额差计算,这使得被重入操控。

具体细节分析

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 万枚。注意此时的 amountIn 是取的上一步兑换中返回的 amountOut。

5、最后攻击者调用 ExchangeWithAtomic 合约里的 withdraw 函数将 USDT 提取出来,归还闪电贷后将剩余的 283.6 万枚 USDT 代币换成 WETH 获利。攻击者利用一样的手法在 BSC 链上的也发起了攻击,获利 19.1 万美元。

6、根据慢雾 MistTrack 分析,黑客在经过一系列兑换以及跨链操作后,目前黑客在 BSC 上的地址仍有约 30.5 BNB,而黑客在 ETH 上的地址已将 1,100 ETH 转入 TornadoCash,目前留存 657.55 ETH。MistTrack 将持续监控黑客异动并跟进拉黑。

总结

此次攻击事件的根本原因在于合约兑换功能的函数没有做重入保护,并且兑换后再次更新账本存款的数值是根据兑换前后合约里的代币余额差值来计算的,导致攻击者利用假代币重入了存款函数获得超过预期的代币。慢雾安全团队建议协议为核心功能的函数添加重入锁的保护,且对于用户资产的操作例如记账等所传入的值需要考虑好计算方式,根据业务逻辑选择合适且安全的方法来防止被外部操控。

免责声明:作为区块链信息平台,本站所发布文章仅代表作者及嘉宾个人观点,与 Web3Caff 立场无关。文章内的信息仅供参考,均不构成任何投资建议及要约,并请您遵守所在国家或地区的相关法律法规。