freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

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

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 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者