BlockSec发现Akutar数字藏品合约(https://etherscan.io/address/0xf42c318dbfbaab0eee040279c6a2588fa01a961d)存在两个非常严重的漏洞。第一个漏洞可以导致合约被DoS攻击,用户存入的资产被锁定(所幸漏洞没有被利用)。第二个漏洞可以导致项目方的资产(超过34M USD)被永远锁定在合约中无法取出。
漏洞 I
第一个漏洞是存在于processRefunds
函数中。这个函数中使用循环来给所有用户进行退款。然而如果被退款的用户是一个恶意合约,这个合约合约可以拒绝退款并且revert交易,这导致所有用户的退款交易都会被revert。幸运的是这个漏洞在实际上没有被利用。
- 我们建议如果项目方存在退款逻辑,可以通过以下的方式安全退款。
- 只有EOA用户才可以参与项目
- 使用ERC20资产比如WETH,而不是原生资产
- 设计一个用户自己主动claim自己退款的函数,而不是批量退款
漏洞 II
第二个漏洞是一个软件bug。在claimProjectFunds
函数中,项目方尝试取出项目中所有的资产。然而,函数中require(refundProgress >= totalBids, 'Refunds not yet processed');
语句有一个bug,这个语句应该是比较refundProgress
和_bidIndex
而不是totalBids
. 由于合约中refundProgress
永远比totalBids
小,而且refundProgress
的值也不会再增大,导致这个比较永远不能满足。因此项目方的资产被永远锁定在合约中。
目前在合约中锁定了超过34M USD的资产。
总结
我们再一次惊讶(在发生了NBA的NFT签名校验漏洞后)一个非常知名项目居然会发生这样低级的错误。在开发的时候,项目方需要编写足够的测试用例以及需要有基本的安全思维。在DeFi场景中,安全审计已经成为通用实践,然而在数字藏品项目中,我们发现安全审计目前还是缺失的,而这样的缺失导致了3400万美金的损失。