NFT:NFT项目惊现低级漏洞:合约未审计导致3400万美元资产被锁死

2022年4月23日,成都链安链必应-区块链安全态势感知平台舆情监测显示,NTF项目方Akutar的AkuAuction合约由于智能合约本身漏洞,导致11539ETH被锁死在合约中。成都链安技术团队第一时间对事件进行了分析,结果如下。

1事件相关信息

4月23日消息,Solidity开发者foobar发推称,11539ETH被永久锁定在AkuDreams合约中,个人用户或开发团队都无法取出资金。退款处理完成后,将每个出价状态设置为1。因此,用户无法调用emergencyWithdraw()。此外,团队也无法领取资金,基本上等于销毁。?

CZ:持有最稀有款ForeverCR7:The GOAT NFT可解锁与C罗会面及训练机会:金色财经报道,Binance首席执行官CZ在社交媒体发文表示,持有最稀有款ForeverCR7:The GOAT NFT可解锁与Cristiano Ronaldo(C罗)会面及一同训练机会,Binance将承担机票与住宿费用。[2023/7/5 22:17:57]

成都链安技术团队立刻进行了分析。

漏洞合约:

0xf42c318dbfbaab0eee040279c6a2588fa01a961d

2?漏洞分析

Akutar项目的智能合约包含2个漏洞:

NFT音乐平台MUSIC-INFINITY测试阶段MUSIC BOX NFT已售罄:5月19日消息,元宇宙基础设施公司 Element.Black 旗下 NFT 音乐平台 MUSIC-INFINITY 测试阶段 MUSIC BOX NFT 推出后 1 分钟内售罄,数量共 1000 个。Music Box 兼具音乐播放器、加密矿机、NFTs 三重属性,玩家持有 Music Box 每日收听音乐广场的音乐,即可获得 MIT 奖励。Listen to Earn 的创世测试版本将在未来一周内上线。测试期间玩家获取 MIT 奖励,可在产品正式上线后使用或交易。[2022/5/19 3:28:12]

漏洞一:

英国宣布计划创建自己的NFT,以寻求“走在加密货币领域的前沿”:4月4日消息,据CNBC报道,英国财政大臣苏纳克周一表示,已要求英国皇家铸币厂创建自己的非同质化代币(NFT),并在今年夏季之前发行。英国财政部经济大臣JohnGlen表示,该倡议是政府希望”领跑“加密货币领域作出的广泛努力中的一部分。Glen还宣布了一系列措施,使数字资产能够受到更严格的监管审查,其中包括,将某些稳定币引入英国支付框架,这样稳定币发行方和服务提供商就能够在英国发展和扩大,以及要求法律委员会考虑区块链社区的法律地位等。(金十)[2022/4/4 14:03:42]

1.第一个合约漏洞在processRefunds中,设计者根据refundProgress计数器进行循环退款。

NFT游戏My DeFi Pet与MakerDAO达成合作:10月16日消息,NFT游戏My DeFi Pet与MakerDAO达成合作,其即将推出的NFT市场将支持稳定币DAI。玩家将能够通过完成游戏中的任务来获得DAI作为奖励。具有特殊要求的PVE和PVP战斗模式即将推出,将使玩家有机会获得DPET和DAI。此外,由于其稳定的价值,DAI是市场上受欢迎的加密货币,并且可以在全球范围内轻松转移。因此,MakerDao的集成将为My DeFi Pet在BEP20和KRC20游戏服务器中的生态系统带来稳定性。[2021/10/16 20:34:35]

2.而这里使用了call函数进行退款操作,且把退款的结果作为require的判定条件。

3.因此如果此时有攻击者在队列中进行退款操作,调用call退款给攻击者时,攻击者在fallback中进行进行恶意的revert则会导致退款队列卡在攻击者这里,从而导致队列后面的所有人都无法进行退款。

4.这个漏洞被人在链上证明有效,但随后攻击合约便进行了解锁,并没有进行攻击利用,且公开进行了申明。

漏洞二:

该漏洞也是导致价值约3400万美元的ETH资产被锁死在合约中的元凶。

1.在claimProjectFunds函数中,该函数主要用于项目方提款。为了避免项目方权限过大,在用户完成提款之前就将合约中的资产全部转走导致用户无法退款,所有的退款操作应全部完成之后项目方才能够提款。业务逻辑设计上来说,是没有问题的。然而,在具体的代码实现中,当前的代码容易受到漏洞一的影响,导致项目方无法提款,不过这只是潜在的风险,本次资金锁死的元凶不是这个原因。

2.注意函数中第620行代码:require此处refundProgress表示已经处理了多少个用户的退款,totalBids表示所有用户总投标了多少个NFT。注意由于一个用户可以投标多个NFT,导致单从数值上比较,refundProgress可能小于totalBids。

而再来看看退款函数processRefunds中:require(_refundProgress<_bidIndex);bidIndex表示所有参与竞标的用户,refundProgress永远不会高于bidIndex。

此时来看看bidIndex的值,为3669:

totalBids的值为5495:

3.所以refundProgress>=5495且refundProgress<3669这个判断条件永远不会成立,最终导致项目方团队将永远无法执行后续的提款操作。此处应将refundProgress与bidIndex做对比,开发者犯了一个很低级的错误。最终,导致项目方11539ETH(价值约3400万美元)被锁定无法提取。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

链链资讯

[0:0ms0-3:161ms