查看原文
其他

攻击者获利约302万美元,Orion Protocol项目如何被黑客套路?

Beosin Beosin 2023-02-07

据区块链安全审计公司Beosin旗下Beosin EagleEye安全风险监控、预警与阻断平台监测显示,2023-02-02 15:56:35 (UTC) ,Ethereum和BSC上的Orion Protocol项目被黑客攻击,攻击者获利约302万美元。据了解,Orion Protoco一个去中心化的加密网关协议,用户可以用于在CEX和DEX直接进行交易。Beosin安全团队对本次事件进行了分析,结果如下。



#事件相关信息


项目地址
0xb5599f568D3f3e6113B286d010d2BCa40A7745AA(Ethereum)
0xe9d1d2a27458378dd6c6f0b2c390807aed2217ca(BSC)

攻击交易
https://etherscan.io/tx/0xa6f63fcb6bec8818864d96a5b1bb19e8bd85ee37b2cc916412e720988440b2aa
https://bscscan.com/tx/0xfb153c572e304093023b4f9694ef39135b6ed5b2515453173e81ec02df2e2104

攻击者地址
0x837962b686fd5a407fb4e5f92e8be86a230484bd

#攻击流程


1.攻击者先调用ExchangeWithAtomic合约的depositAsset函数存入0.5个USDC ,然后闪电贷借出2,844,766.42个USDT。
 
图1
2.攻击者用上面存入的0.5个USDC中的0.0001个USDC按照USDC -> ATK(攻击者提前创建的恶意代币)-> USDT的路径来兑换USDT。如图2所示,调用的ExchangeWithAtomic合约的swapThroughOrionPool函数,该函数会进一步调用PoolFunctionality的doSwapThroughOrionPool函数,后续又调用了 ExchangeWithAtomic合约的depositAsset函数往ExchangeWithAtomic合约中存入上面闪电贷的2,844,766.42个USDT。
 
图2
3.经过上面的操作之后,攻击者存入的金额变成了5,689,532个USDT,然后直接调用ExchangeWithAtomic合约的withdraw函数,提取了5,689,532个USDT,然后归还闪电贷,获利2,836,206.44个USDT。
 

图3

#漏洞分析


本次攻击的根本原因是合约交换功能没有重入保护,并且没有对传入的代币进行检查。当项目合约调用恶意代币transfer函数时,恶意代币重入存款功能函数,配合项目中存款的数值是根据ExchangeWithAtomic合约中代币前后的差值进行计算,获取更多的代币。


让我们来跟进代码看看详细的细节吧。

在PoolFunctionality合约的_doSwapTokens函数里。如图4所示,curBalance是ExchangeWithAtomic合约开始的余额(2,844,766.42个USDT)因为兑换操作调用_swap进而调用ATK代币的转账函数,而ATK代币是攻击者部署的恶意代币。攻击者可以通过恶意构造的transfer函数重新调用ExchangWithAtomic合约的depositAsset函数来将闪电贷的2,844,766.42个USDT存入ExchangeWithAtomic合约,导致amountOut的数量为2,844,766.42。
 
图4
PoolFunctionality的doSwapThroughOrionPool函数如图5所示,amountOut的数量也就是userAmountOut的数量,进而影响amountIn的数量。
 
图5
LibPool合约的doSwapThroughOrionPool函数如图6所示,amountIn的值会传入库合约(LibExchange)的creditUserAssets函数。
 
图6
库合约(LibExchange)的 creditUserAssets函数如图7和图8所示,它 会更新攻击合约在 ExchangeWithAtomic 合约里的使用的账本,原本账本里记的数量beforeBalance是攻击者一开始存入的2,844,766.42个,计算toupdate的值为2,844,766.42,继续调用_updateBalance函数,afterBalance的值等于beforeBalance加上amountIn的数量。计算得到afterBalance的值为5,689,532,然后更新账本的记录值为afterBalance。攻击合约最终在 ExchangeWithAtomic 合约里 USDT 代币的存款记账为 5,689,532个。

 

图7
图8

#资金流向


目前攻击者(0x3da...5f1)已通过Celer Network跨链桥将BSC链上的大部分资金转移到以太坊地址上。
 
截至目前被盗资金大部分(1100个ETH)已经进入Tornado.cash中,还剩657个ETH存放在合约账户中。

 
其中BSC和Ethereum链上攻击者分别获利191,030.28个USDT和2,836,206.44个USDT,累计获利约为3,027,236个USDT,Beosin Trace 将持续对被盗资金进行监控。

#总结


针对本次事件,Beosin安全团队建议:


1.在开发智能合约时,应严格采用”检查-生效-交互“的编程模式。或者对关键函数加入防重入修饰器。2.项目上线前,建议选择专业的安全审计公司进行全面的安全审计,规避安全风险。

Beosin作为一家全球领先的区块链安全公司,在全球10多个国家和地区设立了分部,业务涵盖项目上线前的代码安全审计、项目运行时的安全风险监控、预警与阻断、虚拟货币被盗资产追回、安全合规KYT/AML等“一站式”区块链安全产品+服务,目前已为全球2000多个区块链企业提供安全技术服务,审计智能合约超过3000份,保护客户资产高达5000多亿美元。欢迎点击公众号留言框,与我们联系。

🕹
 近期热点文章阅读:
Beosin2022年全球Web3区块链安全年报
加密大V遭遇木马病毒大额资产为何被盗?
以太坊上海升级哪些细节值得你关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存