在我們發布的 《2022年上半年Web 3安全態勢深度研報》中,我們已經從各個維度展示和分析了區塊鏈安全領域的總體態勢。今天,我們將針對NFT合約安全展開分析,看看在NFT合約在審計過程中都會出現哪些常見問題呢?

上半年NFT安全事件分析:哪些典型案列值得我們警惕?

1、上半年NFT領域安全事件的總損失有多少?

據成都鏈安鷹眼區塊鏈安全態勢感知平台監控顯示, 2022年上半年,共監測到NFT領域主要安全事件10起,統計到的損失約為6490萬美元,主要攻擊方式為合約漏洞利用、私鑰洩露、釣魚等。而上半年Discord釣魚事件頻發,幾乎每天都有Discord服務器受到攻擊,個人用戶因點擊釣魚鏈接而遭受損失的情況頻繁發生。

上半年NFT安全事件分析:哪些典型案列值得我們警惕?

2、上半年NFT典型安全事件?

TreasureDAO事件

2022年3月3日,TreasureDAO交易平台遭到黑客攻擊,造成100多個NFT 被盜。

擴展閱讀: 怪事?盜了又歸還? TreasureDAO安全事件分析

漏洞原因:邏輯漏洞

該漏洞存在於TreasureMarketplaceBuyer合約中,該合約的buyItem函數在傳入_quantity參數後,並沒有做代幣類型判斷,直接將_quantity與_pricePerItem相乘計算出了totalPrice,因此safeTransferFrom函數可以在ERC- 20代幣支付數額只有0的情況下,調用TreasureMarketplace合約的buyItem函數來進行代幣購買。

本次安全事件主要原因是ERC-1155代幣和ERC-721代幣混用導致的邏輯混亂,ERC-721代幣並沒有數量的概念,但是合約卻使用了數量來計算代幣購買價格,且最後在代幣轉賬的實現中也未進行邏輯分離。

APE Coin空投事件

2022年3月17日,黑客通過閃電貸拿到了超過6萬的APE Coin空投。

漏洞原因:邏輯漏洞

該漏洞存在於AirdropGrapesToken空投合約中,由於其使用alpha.balanceOf()和beta.balanceOf()判定調用者對BAYC/MAYC NFT的所有權。而這種方式僅能獲取到用戶對該NFT所有權的瞬時狀態,但該瞬時狀態可以通過閃電貸借入進行操控。攻擊者利用該漏洞,以閃電貸借出BAYC NFT並獲取對應的空投。

Revest Finance事件

2022年3月27日,Revest Finance項目遭遇黑客攻擊,損失餘額12萬美元。

擴展閱讀: 老調重彈,ERC1155的重入攻擊又“現身”,Revest Finance被攻擊事件簡析

漏洞原因:ERC-1155重入

該漏洞存在於Revest合約中,當用戶採用depositAdditionalToFNFT()追加FNFT的抵押資產時,合約需要將先把之前的FNFT銷毀,之後再鑄造新的FNFT。但是在鑄造時,由於min()函數中未判斷需鑄造的FNFT是否已經存在,並且狀態變量fnftId自增在_mint()函數後。而_min()中存在ERC-1155中的隱藏外部調用_doSafeTransferAcceptanceCheck(),造成了重入漏洞。

NBA薅羊毛事件

2022年4月21日,NBA項目方遭遇黑客攻擊。

漏洞原因:簽名冒用和復用

該漏洞存在於The_Association_Sales合約中,項目當在採用簽名校驗的方式驗證白名單時,主要存在兩個安全問題:簽名冒用和簽名復用。其中籤名復用問題是由於項目方並未在合約中存儲已經使用過的簽名,造成簽名可以被攻擊者重複多次使用;簽名冒用的問題是由於vData memory參數info在傳參時未進行msg .sender校驗導致簽名可冒用。

Akutar事件

2022年4月23日,NFT項目方Akutar的AkuAuction合約由於智能合約本身漏洞,導致11539ETH(價值約3400萬美元)被鎖死在合約中。

擴展閱讀: NFT項目惊現低級漏洞,合約未審計導致3400萬美元資產被鎖死——Akutar事件分析

漏洞原因:邏輯漏洞

該合約存在兩個邏輯漏洞,第一是退款函數processRefunds使用call函數進行退款操作,並且把退款結果作為require判定條件,如果攻擊者在fallback中進行惡意revert會導致整個合約的退款操作無法繼續進行。第二個漏洞是造成此次事件的根本原因,即退款函數中存在的兩個判斷條件,由於沒有考慮到一個用戶可以投標多個NFT的情況,使得項目方後續的退款操作永遠無法執行。

XCarnival事件

2022年6月24日,NFT 借貸協議XCarnival 遭到攻擊,黑客獲利3087 枚以太坊(約380 萬美元)。

擴展閱讀: NFT 借貸平台需警惕,XCarnival被攻擊事件給我們哪些啟示?

漏洞原因:邏輯漏洞

該漏洞存在於XNFT合約中,該合約中的pledgeAndBorrow 函數在質押NFT時並未未檢查攻擊者傳入的xToken地址是否為項目方白名單中的地址;並且在藉貸時,並未對抵押記錄的狀態進行檢測,導致攻擊者反複使用無效的抵押記錄進行借貸。

上半年NFT安全事件分析:哪些典型案列值得我們警惕?

3、NFT合約在審計過程中都會出現哪些常見問題呢

上半年發生了多起NFT合約相關的安全事件,主要原因還是沒有進行全面的安全審計,那麼NFT合約在審計過程中都會出現哪些常見問題呢?

成都鏈安審計團隊在審計NFT系列合約時,發現NFT合約主要的問題包括以下幾類:

(1)簽名冒用和復用:

簽名數據缺少重複執行驗證(例如:缺少用戶nonce),導致可以重複使用簽名數據鑄造NFT;

簽名檢查不合理(例如:未檢查簽名者為零地址的情況),導致任意用戶均可通過檢查進行鑄幣;

(2) 邏輯漏洞:

合約管理員可以通過私募等特殊方式鑄幣而不受總量的限制,導致NFT的實際量超過預期;

拍賣NFT時,獲勝者可在領取交易順序依賴攻擊,修改競拍價格,導致競拍獲勝者可以低價獲取NFT;

(3) ERC721&ERC1155重入攻擊

當合約使用轉賬通知功能時(onERC721Received函數),NFT合約會主動向轉賬的目標合約發送一次調用,那麼這就可能導致重入攻擊;

(4) 授權範圍過大

用戶在進行質押或者拍賣時,僅需要對單個代幣授權,但合約要求_operatorApprovals授權,一旦用戶授權成功,那麼就存在NFT被盜的風險。

(5) 價格操控

NFT的價格依賴於某合約的代幣持有量,導致攻擊者利用閃電貸拉高代幣價格,使得質押的NFT被異常清算。

從上半年發生的NFT合約安全事件來看,審計過程中經常出現的漏洞在實際中也會被黑客利用。因此尋求專業的安全公司對NFT合約進行審計也是非常有必要的。