驚現低級漏洞?簡析NFT項目Akutar資金鎖定事件
成都链安
2022-04-24 02:40
本文约1441字,阅读全文需要约6分钟
建議在合約設計和實現時,注意代碼實現的正確性。

2022年4月23日,一級標題一級標題

一級標題

#1 事件相關信息

4月23日消息,Solidity開發者foobar發推稱,11539ETH(價值3400萬美元)被永久鎖定在AkuDreams合約中,個人用戶或開發團隊都無法取出資金。退款處理完成後,將每個出價狀態設置為1。因此,用戶無法調用emergencyWithdraw()。此外,團隊也無法領取資金,基本上等於銷毀。

成都鏈安技術團隊立刻進行了分析。

0xf42c318dbfbaab0eee040279c6a2588fa01a961d

二級標題

漏洞一:

漏洞一:

漏洞一:processRefunds1.第一個合約漏洞在

中,設計者根據refundProgress計數器進行循環退款。

二級標題

漏洞二:

漏洞二:

漏洞二:

該漏洞也是導致價值約3400萬美元的ETH資產被鎖死在合約中的元兇。

1.在claimProjectFunds函數中,該函數主要用於項目方提款。為了避免項目方權限過大,在用戶完成提款之前就將合約中的資產全部轉走導致用戶無法退款,所有的退款操作應全部完成之後項目方才能夠提款。業務邏輯設計上來說,是沒有問題的。然而,在具體的代碼實現中,當前的代碼容易受到漏洞一的影響,導致項目方無法提款,不過這只是潛在的風險,本次資金鎖死的元兇不是這個原因。

2.注意函數中第620行代碼:require (refundProgress > = totalBids)此處refundProgress表示已經處理了多少個用戶的退款,totalBids表示所有用戶總投標了多少個NFT。注意由於一個用戶可以投標多個NFT,導致單從數值上比較,refundProgress可能小於totalBids。

而再來看看退款函數processRefunds中:require(_refundProgress < _bidIndex); bidIndex表示所有參與競標的用戶,refundProgress永遠不會高於bidIndex。

此時來看看bidIndex的值,為3669:

3.所以refundProgress>=5495且refundProgress一級標題

一級標題

#3 總結

針對本次事件,成都鏈安技術團隊建議:

1.開發者應具備基本的安全開發意識,熟悉智能合約開發應注意的安全問題;

成都链安
作者文库