7月10日,NFT金融协议Omni因智能合约漏洞遭到黑客闪电贷攻击,耗尽了1300ETH,损失约143万美元。 近期NFT流动性市场安全问题频发。SharkTeam第一时间对此事件进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
重入攻击+闪电贷—NFT金融协议Omni被黑事件分析
7月10日,NFT金融协议Omni因智能合约漏洞遭到黑客闪电贷攻击,耗尽了1300ETH,损失约143万美元。
近期NFT流动性市场安全问题频发。SharkTeam第一时间对此事件进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
攻击者创建多个攻击合约并发起了多次攻击,以其中一笔攻击交易为例:
攻击者地址:0x00000000c251faf2de8217ab64accd0070b97e47
攻击合约地址:0x3c10e78343c475b99d20fa544dd30b43c0cba26f
攻击者在创建了攻击合约后,通过攻击合约发起了攻击交易,攻击交易如下:
txHash: 0x264e16f4862d182a6a0b74977df28a85747b6f237b5e229c9a5bbacdf499ccb4
攻击者在该交易中获利148.8 ETH,攻击过程如下:
(1)销毁抵押NFT时铸造的nDOODLE,然后调用safeTransferFrom函数将抵押的NFT转移到攻击合约。
safeTransferFrom函数如下:
攻击者利用onERC721Received函数发起了重入攻击。
质押的3个NFT提取了两个,还剩下一个tokenID = 3693的NFT,此时抵押仓位,攻击者在重入攻击中实现了自我清算
即支付WETH,销毁nDOODLE,提取tokenId = 3693的NFT,在转移NFT时再次发生重入。
此次重入,攻击者抵押了全部的20个NFT,然后铸造nDOODLE,以此做抵押,借贷了81 WETH。
最后,将所有的20个NFT提取出来。
那么,黑客为什么可以将重入中质押的NFT提取出来呢?
原因是在重入发生前,攻击者自我清算了所有抵押的NFT,清算完成后,将借贷设置为false。,即没有抵押和借贷。
在重入发生后,该状态一直没有改变。准确的说,重入后修改的状态并不是重入前以及提取时的状态
重入前:
重入后:
修改的userConfig的状态变量对应着不同的地址,因此最后可以将所有的NFT提取出来。
攻击者在完成攻击后,将获得的ETH存入Tornado.Cash平台。
此外,该攻击者的账户地址最初的资金同样来自于Tornado.Cash平台。
以上分析,本次安全事件发生的根本原因是合约存在重入漏洞,而且是safeTransferFrom函数调用onERC721Received函数引起的。攻击者利用该漏洞发起了重入攻击,最终获利。
引发本次安全事件的根本原因是合约存在重入漏洞。针对重入漏洞,我们提出以下建议,将有效帮助您规避重入带来的风险:
此外,选择多个专业的智能合约审计团队进行审计,也是提高合约安全性的重要保障
SharkTeam的愿景是全面保护Web3世界的安全。团队成员分布在北京、南京、苏州、硅谷,由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约的底层理论,提供包括智能合约审计、链上分析、应急响应等服务。已与区块链生态系统各个领域的关键参与者,如Huobi Global、OKC、polygon、Polkadot、imToken、ChainIDE等建立长期合作关系。
Telegram:https://t.me/sharkteamorg
Twitter:https://twitter.com/sharkteamorg
Reddit:https://www.reddit.com/r/sharkteamorg
更多区块链安全咨询与分析,点击下方链接查看
D查查|链上风险核查 https://m.chainaegis.com
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!