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

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

1 事件相关信息

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

近一半买家希望保留英国知名艺术家 Damien Hirst 画作的 NFT 版本并销毁实物作品:7月29日消息,英国知名艺术家 Damien Hirst 将焚烧他的数千幅画作,作为其为期一年的 NFT 项目“The Currency”的一部分。从 9 月开始,Hirst 伦敦私人博物馆的参观者将能够看到他 10000 幅油画中的一部分,这些油画是他在 2016 年创作的,并在去年与 NFT 挂钩。

这些 NFT 的地板价为 2000 美元,购买者可以选择保留 NFT 或用它换取实物画作。对于那些选择保留 NFT 版本的人来说,原始画作将被烧毁。决定的截止日期是 7 月 27 日。数据显示,4851 人希望他们的画作被烧掉,以换取数字版 NFT,而 5149 名收藏者选择将他们的 NFT 换成实物版本。这些艺术品将在 9 月 9 日开始的活动期间每天被烧毁,最终在 10 月中旬的伦敦 Frieze 周活动期间关闭,届时剩余的画作将全部销毁。

Damien Hirst 在 2020 年被宣布为英国最富有的艺术家,其净资产超过 3.8 亿美元。(Cointelegraph)[2022/7/29 2:44:24]

6月Solana链上NFT销售量近170万笔,创2021年8月以来最高记录:金色财经报道,据cryptoslam数据显示,在刚刚过去的6月中,Solana链上NFT销售额仅为1.03亿美元,创过去11个月以来的最低纪录。自2021年8月以来,Solana链上NFT销售额最高记录发生在今年一月,当时交易额为299,419,009.15美元。不过,6月Solana链上NFT销售量却达到1,697,912笔,创下自2021年8月以来的最高纪录,此外5月Solana链上NFT销售额为1,227,362笔,创过去11个月以来第二高交易量记录。[2022/7/2 1:45:51]

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

Uniswap空投条件更正为需在4月15日快照时持有Genie Genesis NFT:金色财经报道,据Uniswap Labs官方社交媒体账号更新信息显示,Genie空投条件为在4月15日之前多次使用Genie(大于1次),以及在4月15日快照时持有Genie Genesis NFT,而非持有GENIE GEM NFT。早些时间报道,Uniswap Lab将对4月15日之前不止一次使用Genie进行swap的历史用户或持有Genie Genesis NFT的用户进行USDC空投,空投将于8月开启,根据已经拍摄的快照,用户可在12个月内申领。[2022/6/22 4:44:23]

漏洞合约:

NFT 概念板块今日平均跌幅为0.50%:金色财经行情显示,NFT 概念板块今日平均跌幅为0.50%。26个币种中13个上涨,13个下跌,其中领涨币种为:COCOS(+14.18%)、LYXE(+7.34%)、DEGO(+3.22%)。领跌币种为:ATTN(-13.77%)、RARI(-6.81%)、SAND(-5.37%)。[2021/9/7 23:05:53]

0xf42c318dbfbaab0eee040279c6a2588fa01a961d

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

漏洞一:

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

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

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

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

漏洞二:

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

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

2.注意函数中第620行代码:require (refundProgress > = totalBids)此处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-1:58ms