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

漏洞 I

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

  1. 我们建议如果项目方存在退款逻辑,可以通过以下的方式安全退款。
  2. 只有EOA用户才可以参与项目
  3. 使用ERC20资产比如WETH,而不是原生资产
  4. 设计一个用户自己主动claim自己退款的函数,而不是批量退款

漏洞 II

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

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

总结

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