[如何写出一行价值34M USD的代码] Akutar NFT漏洞分析

  • BlockSec
  • 更新于 2022-04-24 12:16
  • 阅读 2236

BlockSec发现Akutar数字藏品合约 (https://etherscan.io/address/0xf42c318dbfbaab0eee040279c6a2588fa01a961d) 存在两个非常严重的漏洞。第一个漏洞可以导致合约被DoS攻击,用户存入的资产被锁定...

BlockSec发现Akutar数字藏品合约(https://etherscan.io/address/0xf42c318dbfbaab0eee040279c6a2588fa01a961d)存在两个非常严重的漏洞。第一个漏洞可以导致合约被DoS攻击,用户存入的资产被锁定(所幸漏洞没有被利用)。第二个漏洞可以导致项目方的资产(超过34M USD)被永远锁定在合约中无法取出。

漏洞 I

1.jpg

第一个漏洞是存在于 processRefunds 函数中。这个函数中使用循环来给所有用户进行退款。然而如果被退款的用户是一个恶意合约,这个合约合约可以拒绝退款并且revert交易,这导致所有用户的退款交易都会被revert。幸运的是这个漏洞在实际上没有被利用。

我们建议如果项目方存在退款逻辑,可以通过以下的方式安全退款。

  • 只有EOA用户才可以参与项目
  • 使用ERC20资产比如WETH,而不是原生资产
  • 设计一个用户自己主动claim自己退款的函数,而不是批量退款

漏洞 II

2.jpg

第二个漏洞是一个软件bug。在claimProjectFunds 函数中,项目方尝试取出项目中所有的资产。然而,函数中require(refundProgress >= totalBids, "Refunds not yet processed");语句有一个bug,这个语句应该是比较refundProgress_bidIndex 而不是totalBids. 由于合约中refundProgress 永远比totalBids小,而且refundProgress的值也不会再增大,导致这个比较永远不能满足。因此项目方的资产被永远锁定在合约中。

目前在合约中锁定了超过34M USD的资产。

总结

我们再一次惊讶(在发生了NBA的NFT签名校验漏洞后)一个非常知名项目居然会发生这样低级的错误。在开发的时候,项目方需要编写足够的测试用例以及需要有基本的安全思维。在DeFi场景中,安全审计已经成为通用实践,然而在数字藏品项目中,我们发现安全审计目前还是缺失的,而这样的缺失导致了3400万美金的损失。

640.jpg

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

2 条评论

请先 登录 后评论
BlockSec
BlockSec
江湖只有他的大名,没有他的介绍。