慢雾:Orion Protocol被黑根本原因在于合约兑换功能的函数没有做重入保护

币安(Binance)最新可用网址(点击下图直达注册!)

2月3日消息,慢雾安全团队发布了Orion Protocol被黑分析,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万美元。

此前今日早些时候消息,Orion Protocol在攻击事件中损失约300万美元,官方暂停存款功能并正修复漏洞。



返回列表页>>> 比特币最新新闻