零时科技 | OMNI遭到黑客攻击,损失超1300ETH

OMNI遭到黑客攻击,损失超1300ETH, 随后OMNI发布公告称OMNI仍处于测试阶段(测试版),没有客户资金损失,只有内部测试资金受到影响!

微信图片_20220722140141.jpg

0x1 事件背景

OMNI是一个用于创建和交易自定义数字资产和货币的平台。 零时科技区块链安全情报平台监控到消息,北京时间2022年7月10日,OMNI遭到黑客攻击,损失超1300ETH, 随后OMNI发布公告称OMNI仍处于测试阶段(测试版),没有客户资金损失,只有内部测试资金受到影响!零时科技安全团队及时对此安全事件进行分析。

0x2 攻击信息

攻击钱包地址: 0x00000000c251faf2de8217ab64accd0070b97e47 0x627a22FF70Cb84e74c9C70E2d5B0B75af5A1Dcb9 攻击合约地址: 0x3c10e78343c475b99d20fa544dd30b43c0cba26f 0x1C244c94090390f885d472b83dF267f083C72Faf 攻击交易: 0x264e16f4862d182a6a0b74977df28a85747b6f237b5e229c9a5bbacdf499ccb4 Pool合约: 0x50c7a557d408a5f5a7fdbe1091831728ae7eba45

0x3 攻击步骤

1)攻击者从Balancer闪电贷 1000 WETH 至 0x3c10e78343c475b99d20fa544dd30b43c0cba26

图片1.png 2)攻击者利用flashloan函数借出20 Doodles ,并通过sushiswap使用13.203802230912588834 WETH兑换1 Doodles

图片2.png 3)调用supplyERC721方法质押三个NFT,并借出12.15 WETH

图片3.png

图片4.png

图片5.png

图片6.png 4)取出其中两个NFT

图片7.png

5)将借出的12.15 WTH还回,并调用清算方法对剩余一个NFT进行清算

图片8.png

6)在清算过程中通过调用ERC721_checkOnERC721Received函数进行重入攻击,继续将 20 doodles进行质押,并借出 81 WETH

图片9.png

图片10.png 7)取出 20 NFT,由于清算函数中返回值将状态设置为false,因此在取出函数中对于借贷状态判断错误,20NFT 可以成功取出 8)由于在进行清算时,先将NFT取出,之后将还回的钱扣除,攻击者通过取出NFT时进行重入,重入后继续进行判断,此时状态已经改变,之前借出的12.15 WETH 也不需要归还,所以攻击者最终将得到93.15 WETH

图片11.png 9)将通过调用flashloan获得的 20 Doodles 归还,将闪电贷得到的 1000 WETH 归还

图片12.png

0x4 漏洞核心

攻击者通过调用LiquidationLogic.sol 中清算方法executeERC721LiquidationCall进行清算

图片13.png

在调用_burnCollateralNTokens方法时,burn函数会调用ERC721中_checkOnERC721Received方法

图片14.png

图片15.png

此时to地址为攻击合约地址,攻击者在此处实现重入攻击。继续质押20 Doodles进行借款

ID状态标记为true,之后继续执行清算函数时,清算函数会将此处的true覆盖为false。之后执行取出质押操作,isBorrowAny()判断ID状态,此时为false,成功取出质押的Doodles。

图片16.png

0x5 资金流向

两个攻击钱包地址已分别将获取的800 ETH 和 426.5 ETH资金转入Tornado.Cash

图片18.png

总结及建议

通过此次攻击来看,该次攻击核心主要为项目方合约访问控制缺陷,未对Pool合约中质押做重入限制,使得攻击者恶意调用ERC721中_checkOnERC721Received函数进行重入攻击,以及在setBorrowing()方法之前没有设置状态判断操作。 安全建议 建议对合约方法传参进行严格访问控制 建议状态判断在转账之前 建议项目方上线前进行多次审计,避免出现审计步骤缺失

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
零时科技
零时科技
0xbD0b...A354
专注区块链生态安全