今晨OrionProtocol项目的ETH和BSC链上的合约遭到攻击,攻击者获利约302.7万美元,对此次攻击过程和原因慢雾安全团队分析如下:
1.攻击者首先调用ExchangeWithAtomic合约的depositAsset函数进行存款,存入0.5个USDC代币为下面的攻击作准备;
2.攻击者闪电贷出284.47万枚USDT代币,接着调用ExchangeWithAtomic合约的doSwapThroughOrionPool函数兑换代币,兑换路径是;
3.因为兑换出来的结果是通过兑换后ExchangeWithAtomic合约里的USDT代币余额减去兑换前该合约里的USDT代币余额,但问题就在兑换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万美元;
此次攻击的根本原因在于合约兑换功能的函数没有做重入保护,并且兑换后再次更新账本存款的数值是根据兑换前后合约里的代币余额差值来计算的,导致攻击者利用假代币重入了存款函数获得超过预期的代币。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。