OMNI遭到黑客攻击,损失超1300ETH, 随后OMNI发布公告称OMNI仍处于测试阶段(测试版),没有客户资金损失,只有内部测试资金受到影响!
OMNI是一个用于创建和交易自定义数字资产和货币的平台。 零时科技区块链安全情报平台监控到消息,北京时间2022年7月10日,OMNI遭到黑客攻击,损失超1300ETH, 随后OMNI发布公告称OMNI仍处于测试阶段(测试版),没有客户资金损失,只有内部测试资金受到影响!零时科技安全团队及时对此安全事件进行分析。
攻击钱包地址: 0x00000000c251faf2de8217ab64accd0070b97e47 0x627a22FF70Cb84e74c9C70E2d5B0B75af5A1Dcb9 攻击合约地址: 0x3c10e78343c475b99d20fa544dd30b43c0cba26f 0x1C244c94090390f885d472b83dF267f083C72Faf 攻击交易: 0x264e16f4862d182a6a0b74977df28a85747b6f237b5e229c9a5bbacdf499ccb4 Pool合约: 0x50c7a557d408a5f5a7fdbe1091831728ae7eba45
1)攻击者从Balancer闪电贷 1000 WETH 至 0x3c10e78343c475b99d20fa544dd30b43c0cba26
2)攻击者利用flashloan函数借出20 Doodles ,并通过sushiswap使用13.203802230912588834 WETH兑换1 Doodles
3)调用supplyERC721方法质押三个NFT,并借出12.15 WETH
4)取出其中两个NFT
5)将借出的12.15 WTH还回,并调用清算方法对剩余一个NFT进行清算
6)在清算过程中通过调用ERC721_checkOnERC721Received函数进行重入攻击,继续将 20 doodles进行质押,并借出 81 WETH
7)取出 20 NFT,由于清算函数中返回值将状态设置为false,因此在取出函数中对于借贷状态判断错误,20NFT 可以成功取出 8)由于在进行清算时,先将NFT取出,之后将还回的钱扣除,攻击者通过取出NFT时进行重入,重入后继续进行判断,此时状态已经改变,之前借出的12.15 WETH 也不需要归还,所以攻击者最终将得到93.15 WETH
9)将通过调用flashloan获得的 20 Doodles 归还,将闪电贷得到的 1000 WETH 归还
攻击者通过调用LiquidationLogic.sol 中清算方法executeERC721LiquidationCall进行清算
在调用_burnCollateralNTokens方法时,burn函数会调用ERC721中_checkOnERC721Received方法
此时to地址为攻击合约地址,攻击者在此处实现重入攻击。继续质押20 Doodles进行借款
ID状态标记为true,之后继续执行清算函数时,清算函数会将此处的true覆盖为false。之后执行取出质押操作,isBorrowAny()判断ID状态,此时为false,成功取出质押的Doodles。
两个攻击钱包地址已分别将获取的800 ETH 和 426.5 ETH资金转入Tornado.Cash
通过此次攻击来看,该次攻击核心主要为项目方合约访问控制缺陷,未对Pool合约中质押做重入限制,使得攻击者恶意调用ERC721中_checkOnERC721Received函数进行重入攻击,以及在setBorrowing()方法之前没有设置状态判断操作。 安全建议 建议对合约方法传参进行严格访问控制 建议状态判断在转账之前 建议项目方上线前进行多次审计,避免出现审计步骤缺失
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!