2022年4月23日,成都链安链必应-区块链安全态势感知平台舆情监测显示,NTF项目方Akutar的AkuAuction合约由于智能合约本身漏洞,导致11539ETH(价值约3400万美元)被锁死在合约中。成都链安技术团队第一时间对事件进行了分析,结果如下。
1 事件相关信息
4月23日消息,Solidity开发者foobar发推称,11539ETH(价值3400万美元)被永久锁定在AkuDreams合约中,个人用户或开发团队都无法取出资金。退款处理完成后,将每个出价状态设置为1。因此,用户无法调用emergencyWithdraw()。此外,团队也无法领取资金,基本上等于销毁。?
The Sandbox NFT近24小时交易额增长超900%:金色财经报道,OpenSea最新数据显示,The Sandbox NFT过去24小时的交易额为302ETH,增长率为943%。近24小时交易额排名位列OpenSea第10。[2022/9/23 7:16:30]
成都链安技术团队立刻进行了分析。
漏洞合约:
0xf42c318dbfbaab0eee040279c6a2588fa01a961d
6月BNB Chain链上NFT销售额近2000万美元,创历史最高记录:金色财经报道,据 NFT 交易数据显示,6 月 BNB Chain 链上 NFT 销售额达到 19,396,292.52 美元,链上交易量为 116,127 笔,创下 BSC 链上单月交易额历史最高记录。本文撰写时,BNB Chain 链上 NFT 销售总额为 137,524,827 美元,交易总量为 302,971 笔。[2022/7/5 1:50:42]
Akutar项目的智能合约包含2个漏洞:
漏洞一:
1.第一个合约漏洞在processRefunds中,设计者根据refundProgress计数器进行循环退款。
Julian Lennon正在出售披头士乐队纪念品NFT:1月29日消息,朱利安·列侬(Julian Lennon)正在出售披头士乐队和约翰·列侬(John Lennon)的纪念品NFT,不包括实物。该系列NFT包括保罗·麦卡特尼(Paul McCartney)关于歌曲\"Hey Jude\"的手写笔记,以及约翰·列侬(John Lennon)在乐队里穿的衣服。
“Hey Jude”笔记的出价将从30000美元开始,而John Lennon穿着的黑色斗篷和阿富汗外套将分别以8000美元和6000美元的价格进入拍卖行。用户还将有机会竞拍列侬拥有的几把吉他NFT,每把吉他NFT的开盘价为4000美元。
据了解,Julian Lennon是John Lennon和前妻Cynthia的儿子。该系列NFT是通过与YellowHeart合作在Polygon上构建的。Julian Lennon发推称,竞标的部分收益将捐赠给基金会White Feather Foundation,用于抵消NFT的碳足迹。(Cryptoglobe)[2022/1/29 9:21:51]
2.而这里使用了call函数进行退款操作,且把退款的结果作为require的判定条件。
Beeple的三幅开放版加密艺术NFT被加密巨鲸0xb1以333.666ETH高价打包买走:近日,加密艺术家Beeple曾在NiftyGateway发售的三件开放版加密艺术NFT被加密巨鲸0xb1以333.666ETH高价打包买走,价值约54万美元。[2021/2/8 19:11:26]
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万美元)被锁定无法提取。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。