SharkTeam独家分析 | 重入攻击+闪电贷—NFT金融协议Omni被黑事件分析
7月10日,NFT金融协议 Omni 因智能合约漏洞遭到黑客闪电贷攻击,耗尽了1300ETH,损失约143万美元。
近期NFT流动性市场安全问题频发。SharkTeam第一时间对此事件进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
一、 事件分析
攻击者创建多个攻击合约并发起了多次攻击,以其中一笔攻击交易为例:
攻击者地址:0x00000000c251faf2de8217ab64accd0070b97e47
攻击合约地址:0x3c10e78343c475b99d20fa544dd30b43c0cba26f
攻击者在创建了攻击合约后,通过攻击合约发起了攻击交易,攻击交易如下:
txHash: 0x264e16f4862d182a6a0b74977df28a85747b6f237b5e229c9a5bbacdf499ccb4
攻击者在该交易中获利148.8 ETH,攻击过程如下:
1. 首先,攻击者通过Balancer借贷平台闪电贷1000 ETH
2. 通过函数flashLoan闪电贷20个DOODLE
3. 通过SushiSwap平台使用WETH兑换了1个DOODLE
4. 赎回20个NFT,tokenId = 2574, 2595, 6851, 8522, 8883, ……
5. 抵押NFT(supplyERC721),tokenId = 5251, 4777, 3693,然后铸造nDOODLE
6. 借贷WETH(borrow),数量为12.15 ETH
7. 提取抵押的3个NFT中的2个,tokenId = 5251, 4777
(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提取出来。
8. 重复上述步骤5 - 7,最终获利148.8 ETH。
攻击者在完成攻击后,将获得的ETH存入Tornado.Cash平台。
此外,该攻击者的账户地址最初的资金同样来自于Tornado.Cash平台。
以上分析,本次安全事件发生的根本原因是合约存在重入漏洞,而且是safeTransferFrom函数调用onERC721Received函数引起的。攻击者利用该漏洞发起了重入攻击,最终获利。
二、安全建议
引发本次安全事件的根本原因是合约存在重入漏洞。针对重入漏洞,我们提出以下建议,将有效帮助您规避重入带来的风险:
1. 使用重入锁机制,如继承Openzeppelin标准库中的重入锁合约。
2. 应用check-effects-interactions模式,即先修改状态变量,然后进行外部调用
3. 发送ether使用transfer函数,尽量不使用call和send函数,transfer函数只允许消耗2300 gas,不足以使目的地址调用另一份智能合约。
此外,选择多个专业的智能合约审计团队进行审计,也是提高合约安全性的重要保障
三、关于我们
SharkTeam的愿景是全面保护 Web3 世界的安全。团队成员分布在北京、南京、苏州、硅谷,由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约的底层理论,提供包括智能合约审计、链上分析、应急响应等服务。已与区块链生态系统各个领域的关键参与者,如Huobi Global、OKC、polygon、Polkadot、imToken、ChainIDE等建立长期合作关系。
Bitcoin Price Consolidates Below Resistance, Are Dips Still Supported?
Bitcoin Price Consolidates Below Resistance, Are Dips Still Supported?
XRP, Solana, Cardano, Shiba Inu Making Up for Lost Time as Big Whale Transaction Spikes Pop Up
XRP, Solana, Cardano, Shiba Inu Making Up for Lost Time as Big Whale Transaction Spikes Pop Up
Justin Sun suspected to have purchased $160m in Ethereum
Justin Sun suspected to have purchased $160m in Ethereum