查看原文
其他

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

21CTO 2022-05-25

导读:NFT项目方Akutar的AkuAuction合约由于智能合约本身漏洞,导致11539ETH(价值约3400万美元)被锁死在合约中。


4月23日,Solidity开发者foobar在Twitter上宣布,11539ETH(价值3400万美元,约2个亿人民币)被永久锁定在AkuDreams合约中,个人用户或开发团队都无法取出资金。



 

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


漏洞一:

第一个合约漏洞在processRefunds中,设计者根据refundProgress计数器进行循环退款。而这里使用了call函数进行退款操作,且把退款的结果作为require的判定条件。



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



漏洞二:

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


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


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



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



bidIndex的值为3669:

totalBids的值为5495:


因此,refundProgress>=5495且refundProgress<3669这个判断条件永远不会成立,最终项目方将永远无法执行后续的提款操作。


开发者应该是想写bidIndex购买人数,结果写成了totalBids,他犯了一个低级的错误,一个单词2个亿。


编辑:大雄

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存