freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

NFT合约同样也有重入风险:Revest Finance被黑事件分析
2022-03-28 15:37:10
所属地 江苏省

2022 年 3 月 27 日,Revest Finance遭到黑客攻击。黑客利用了 Revest 合约的逻辑漏洞盗取了近 770 万枚 ECO、579 枚 LYXe、近 7.15 亿枚 BLOCKS 以及超 35 万枚 RENA,价值约200万美元。黑客攻击使用从 Tornado Cash 取出的资金发动了攻击,通过SushiSwap以及Uniswap将盗取的Token兑换成了ETH,最后通过Tornado Cash平台将ETH转移到了其他账户。

1648452725_62416475bf98181fe7587.png!small

SharkTeam第一时间对此事件进行了攻击分析和技术分析,并总结了安全防范手段,希望后续的区块链项目可以引以为戒,共筑区块链行业的安全防线。

一、事件分析

攻击者地址:0xef967ece5322c0d7d26dab41778acb55ce5bd58b

攻击合约地址:0xb480ac726528d1c195cd3bb32f19c92e8d928519

发起攻击资金来源于Tornado Cash,交易为:

0x6b868d0c6090ed5486c633f97013df2fb92bb901f54a6be2612429234a9f5ded1648452756_624164943c90b461988fd.png!small

攻击交易如下:

0xe0b0c2672b760bef4e2851e91c69c8c0ad135c6987bbf1f43f5846d89e691428

1648452784_624164b09b0d8fd1ffe50.png!small

在交易中,攻击的关键步骤如下:

1648452805_624164c52f416b93e17eb.png!small

首先,攻击者通过UniswapV2的闪电兑换功能调用Revest合约中的mintAddressLock函数:

1648452819_624164d347202517ed8fc.png!small

攻击者第一次调用mintAddressLock函数铸造了2个ID为1027的Token。

1648452833_624164e1e4b2632ae076a.png!small

攻击者第二次调用mintAddressLock函数铸造了360000个ID为1028的Token。

1648452852_624164f433669216f49d5.png!small

在mintAddressLock函数完成前调用_mint函数时,攻击者重入了depositAdditionalToFNFT函数【ERC1155 onERC1155Received 重入】。

1648452865_624165015cbf0683ff4d7.png!small

由于NFTnextId(即FNFTHandler.fnftsCreated)在mint函数铸造NFT完成并进行更新。

1648452878_6241650e7ae34034fc970.png!small

因此,在重入调用depositAdditionalToFNFT函数时,NFT Id仍然是1027,nextId任仍然是1028。

1648452931_62416543730706515d869.png!small

另外,合约并未验证1028的Token数量是否为0,代码如下:

1648452945_624165512815f50e1e1e1.png!small

因此攻击者再次成功地铸造了1个ID为1028的NFT。至此,攻击完成。

1648452959_6241655fe402370b2f861.png!small

二、安全建议

本次安全事件产生的根本原因在于NFT铸造后再修改nextId,违背了“检查-生效-交互”的设计模式,同时没有使用重入锁,导致合约函数是可重入的,最终引发重入攻击。

在智能合约安全领域,重入是典型的智能合约高危漏洞,也曾引发多个安全事件,造成了大量的经济损失。重入漏洞的防范措施也已经非常成熟,包括:

(1)引入重入锁机制,推荐以modifier的形式使用;

(2)应用“检查-生效-交互”模式,即先修改状态变量,然后进行外部调用;

(3)在将ether发送给外部合约时使用内置的transfer()函数。转账功能只发送2300 gas不足以使目的地地址/合约调用另一份合约;

(4)使用安全库(如openzeppelin)中的函数进行转账和外部调用。

强烈建议合约开发人员在开发过程中严格遵守“检查-生效-交互”模式,做到先修改状态变量,然后进行外部调用,结合重入锁机制,严密控制甚至杜绝重入漏洞发生的可能。

SharkTeam提醒您,在涉足区块链项目时请提高警惕,选择更稳定、更安全,且经过完备多轮审计的公链和项目,切不可将您的资产置于风险之中,沦为黑客的提款机。

SharkTeam作为领先的区块链安全服务团队,为开发者提供智能合约审计服务。智能合约审计服务由人工审计和自动化审计构成,满足不同客户需求,独家实现覆盖高级语言层、虚拟机层、区块链层、业务逻辑层四个方面近两百项审计内容,全面保障智能合约安全。

Website: https://www.sharkteam.org/

Telegram: https://t.me/sharkteamorg

Twitter:https://twitter.com/sharkteamorg

更多区块链安全咨询与分析,点击下方链接查看

D查查|链上风险核查 https://m.chainaegis.com/

# 系统安全 # 数据安全 # 网络安全技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者