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萬美金的損失。