# NFT合約安全分析:2022年上半年事件回顧與常見問題探討2022年上半年,NFT領域安全事件頻發,造成了巨大的經濟損失。據統計,這半年內共發生10起重大NFT安全事件,總損失高達6490萬美元。攻擊手段主要包括合約漏洞利用、私鑰泄露和釣魚等。值得注意的是,Discord平台上的釣魚攻擊尤爲猖獗,幾乎每天都有服務器遭受攻擊,導致大量用戶因點擊惡意連結而蒙受損失。## 典型安全事件分析### TreasureDAO事件3月3日,TreasureDAO交易平台遭遇攻擊,超過100個NFT被盜。問題出在TreasureMarketplaceBuyer合約的buyItem函數上。該函數在計算總價時未對代幣類型進行判斷,直接將數量與單價相乘。這導致攻擊者可以在ERC-20代幣支付額爲0的情況下,調用TreasureMarketplace合約的buyItem函數購買代幣。根本原因是ERC-1155和ERC-721代幣混用引發的邏輯混亂。ERC-721代幣本身沒有數量概念,但合約卻用數量計算購買價格,且在最終轉帳實現中未進行邏輯分離。### APE Coin空投事件3月17日,黑客通過閃電貸獲取了超過6萬枚APE Coin空投。問題出在AirdropGrapesToken空投合約上。合約使用alpha.balanceOf()和beta.balanceOf()判斷調用者對BAYC/MAYC NFT的所有權,但這種方式只能獲取用戶對NFT所有權的瞬時狀態,而這個狀態可以通過閃電貸操縱。攻擊者正是利用這一漏洞,通過閃電貸借入BAYC NFT並獲取相應空投。### Revest Finance事件3月27日,Revest Finance項目遭受攻擊,損失約12萬美元。這是一起典型的ERC-1155重入攻擊。問題出在Revest合約中。當用戶使用depositAdditionalToFNFT()追加FNFT抵押資產時,合約需要先銷毀舊FNFT,再鑄造新FNFT。然而,鑄造過程中min()函數未檢查需鑄造的FNFT是否已存在,且fnftId狀態變量自增在_mint()函數之後。而_min()中存在ERC-1155的隱藏外部調用_doSafeTransferAcceptanceCheck(),這就造成了重入漏洞。### NBA薅羊毛事件4月21日,NBA項目遭遇攻擊。問題出在The_Association_Sales合約的籤名驗證機制上。主要存在兩個安全隱患:籤名冒用和籤名復用。籤名復用是因爲合約未存儲已使用的籤名,導致攻擊者可多次重復使用同一籤名。籤名冒用則是因爲vData memory參數info在傳參時未進行msg.sender校驗,使得籤名可被冒用。### Akutar事件4月23日,NFT項目Akutar的AkuAuction合約因漏洞導致11539ETH(約3400萬美元)被鎖死。合約存在兩個邏輯漏洞:1. 退款函數processRefunds使用call函數進行退款,並將退款結果作爲require判定條件。攻擊者可在fallback中惡意revert,導致整個合約退款操作無法進行。2. 退款函數中的兩個判斷條件未考慮用戶可投標多個NFT的情況,導致項目方後續退款操作永遠無法執行。### XCarnival事件6月24日,NFT借貸協議XCarnival遭攻擊,黑客獲利3087枚以太坊(約380萬美元)。問題出在XNFT合約的pledgeAndBorrow函數上。該函數在質押NFT時未檢查攻擊者傳入的xToken地址是否在項目白名單中,且在借貸時未對抵押記錄狀態進行檢測,導致攻擊者可反復使用無效抵押記錄進行借貸。## NFT合約審計常見問題1. 籤名冒用和復用: - 籤名數據缺少重復執行驗證,如缺少用戶nonce,導致可重復使用籤名數據鑄造NFT。 - 籤名檢查不合理,如未檢查籤名者爲零地址的情況,導致任意用戶均可通過檢查進行鑄幣。2. 邏輯漏洞: - 合約管理員可通過特殊方式鑄幣而不受總量限制,導致NFT實際量超過預期。 - NFT拍賣時,獲勝者可利用交易順序依賴攻擊修改競拍價格,低價獲取NFT。3. ERC721/ERC1155重入攻擊: - 使用轉帳通知功能(onERC721Received函數)時,NFT合約向轉帳目標合約發送調用可能導致重入攻擊。4. 授權範圍過大: - 質押或拍賣時要求_operatorApprovals授權,而非單個代幣授權,增加NFT被盜風險。5. 價格操控: - NFT價格依賴某合約的代幣持有量,攻擊者可利用閃電貸拉高代幣價格,導致質押NFT被異常清算。鑑於NFT合約安全事件頻發,且審計過程中發現的漏洞往往與實際攻擊相符,尋求專業安全公司對NFT合約進行全面審計顯得尤爲重要。
NFT合約安全風險剖析:2022上半年事件回顧與審計要點
NFT合約安全分析:2022年上半年事件回顧與常見問題探討
2022年上半年,NFT領域安全事件頻發,造成了巨大的經濟損失。據統計,這半年內共發生10起重大NFT安全事件,總損失高達6490萬美元。攻擊手段主要包括合約漏洞利用、私鑰泄露和釣魚等。值得注意的是,Discord平台上的釣魚攻擊尤爲猖獗,幾乎每天都有服務器遭受攻擊,導致大量用戶因點擊惡意連結而蒙受損失。
典型安全事件分析
TreasureDAO事件
3月3日,TreasureDAO交易平台遭遇攻擊,超過100個NFT被盜。問題出在TreasureMarketplaceBuyer合約的buyItem函數上。該函數在計算總價時未對代幣類型進行判斷,直接將數量與單價相乘。這導致攻擊者可以在ERC-20代幣支付額爲0的情況下,調用TreasureMarketplace合約的buyItem函數購買代幣。
根本原因是ERC-1155和ERC-721代幣混用引發的邏輯混亂。ERC-721代幣本身沒有數量概念,但合約卻用數量計算購買價格,且在最終轉帳實現中未進行邏輯分離。
APE Coin空投事件
3月17日,黑客通過閃電貸獲取了超過6萬枚APE Coin空投。問題出在AirdropGrapesToken空投合約上。合約使用alpha.balanceOf()和beta.balanceOf()判斷調用者對BAYC/MAYC NFT的所有權,但這種方式只能獲取用戶對NFT所有權的瞬時狀態,而這個狀態可以通過閃電貸操縱。攻擊者正是利用這一漏洞,通過閃電貸借入BAYC NFT並獲取相應空投。
Revest Finance事件
3月27日,Revest Finance項目遭受攻擊,損失約12萬美元。這是一起典型的ERC-1155重入攻擊。問題出在Revest合約中。當用戶使用depositAdditionalToFNFT()追加FNFT抵押資產時,合約需要先銷毀舊FNFT,再鑄造新FNFT。然而,鑄造過程中min()函數未檢查需鑄造的FNFT是否已存在,且fnftId狀態變量自增在_mint()函數之後。而_min()中存在ERC-1155的隱藏外部調用_doSafeTransferAcceptanceCheck(),這就造成了重入漏洞。
NBA薅羊毛事件
4月21日,NBA項目遭遇攻擊。問題出在The_Association_Sales合約的籤名驗證機制上。主要存在兩個安全隱患:籤名冒用和籤名復用。籤名復用是因爲合約未存儲已使用的籤名,導致攻擊者可多次重復使用同一籤名。籤名冒用則是因爲vData memory參數info在傳參時未進行msg.sender校驗,使得籤名可被冒用。
Akutar事件
4月23日,NFT項目Akutar的AkuAuction合約因漏洞導致11539ETH(約3400萬美元)被鎖死。合約存在兩個邏輯漏洞:
XCarnival事件
6月24日,NFT借貸協議XCarnival遭攻擊,黑客獲利3087枚以太坊(約380萬美元)。問題出在XNFT合約的pledgeAndBorrow函數上。該函數在質押NFT時未檢查攻擊者傳入的xToken地址是否在項目白名單中,且在借貸時未對抵押記錄狀態進行檢測,導致攻擊者可反復使用無效抵押記錄進行借貸。
NFT合約審計常見問題
籤名冒用和復用:
邏輯漏洞:
ERC721/ERC1155重入攻擊:
授權範圍過大:
價格操控:
鑑於NFT合約安全事件頻發,且審計過程中發現的漏洞往往與實際攻擊相符,尋求專業安全公司對NFT合約進行全面審計顯得尤爲重要。