攻击者获利约 302 万美元,Orion Protocol 项目如何被黑客套路?
2023-02-04 00:27

据区块链安全审计公司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/0xa6f63fcb6bec8818864d96a5b1bb19e8bd85ee37b2cc916412e720988440b2aahttps://bscscan.com/tx/0xfb153c572e304093023b4f9694ef39135b6ed5b2515453173e81ec02df2e21040x837962b686fd5a407fb4e5f92e8be86a230484bd#攻击流程
1.攻击者先调用 ExchangeWithAtomic 合约的 depositAsset 函数存入 0.5 个 USDC ,然后闪电贷借出 2,844,766.42 个 USDT。
图 12.攻击者用上面存入的 0.5 个 USDC 中的 0.0001 个 USDC 按照 USDC -> ATK(攻击者提前创建的恶意代币)-> USDT 的路径来兑换 USDT。如图 2 所示,调用的 ExchangeWithAtomic 合约的 swapThroughOrionPool 函数,该函数会进一步调用 PoolFunctionality 的 doSwapThroughOrionPool 函数,后续又调用了 ExchangeWithAtomic 合约的 depositAsset 函数往 ExchangeWithAtomic 合约中存入上面闪电贷的 2,844,766.42 个 USDT。
图 23.经过上面的操作之后,攻击者存入的金额变成了 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。
图 4PoolFunctionality 的 doSwapThroughOrionPool 函数如图 5 所示,amountOut 的数量也就是 userAmountOut 的数量,进而影响 amountIn 的数量。
图 5LibPool 合约的 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 多亿美元。欢迎点击公众号留言框,与我们联系。
相关Wiki
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。