比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads

NFT:一文看懂典型的NFT合約漏洞有哪些?

Author:

Time:1900/1/1 0:00:00

歡迎來到Web3安全連載系列,上周,我們剛推送《Web3安全連載|當硬核黑客開始研究“釣魚”,你的NFT還安全嗎?》后,就有一位NFT收藏者被盜。

在上篇文章里,我們就說過Web3世界黑客依然猖狂,因此個人的安全防范非常重要,大家可以再次閱讀下面這篇文章:

干貨|釣魚網站“入侵”Web3,這些防騙技巧必須學會!

此外,NFT智能合約層面上的漏洞同樣值得我們警惕!隨著今年一系列NFT智能合約相關安全事件的發生,如:APECoin空投事件、TreasureDAO安全事件等,讓我們必須再次關注NFT領域的智能合約安全。

典型的NFT合約漏洞主要包含兩大類,一類是NFT自身的漏洞;一類是NFT平臺業務相關漏洞問題。閑話少說,本文我們將對NFT中的這兩類合約安全問題進行詳細介紹,歡迎來圍觀。

??PART01

「NFT自身漏洞問題」

NFT的生命周期通常分為發行、流轉、銷毀等階段,其中在發行階段存在的安全問題最多。NFT的購買通常分為預售、正式發售兩種情況。而預售階段項目方一般會設置能夠參與的用戶白名單。但是即使進行了設置,但仍然存在各類白名單繞過漏洞的問題。

案例一:APECoin空投事件?

2022年3月17日,推特用戶WillSheehan發布推文稱套利機器人通過閃電貸薅羊毛拿到了超過6萬的APECoin空投。

關于本次攻擊事件中,相關信息如下:

攻擊交易:

0xeb8c3bebed11e2e4fcd30cbfc2fb3c55c4ca166003c7f7d319e78eaab9747098

獲利者地址:

自SEC起訴交易所以來,Coinbase股價上漲50%:金色財經報道,自美國證券交易委員會(SEC)提起訴訟以來,Coinbase(COIN)股票從6月6日的約52美元上漲至7月7日的78.7美元。該股在過去六個月內也上漲了約133%,而同比增長約為50%。[2023/7/10 10:46:09]

0x6703741e913a30D6604481472b6d81F3da45e6E8

漏洞合約地址:

0x025C6da5BD0e6A5dd1350fda9e3B6a614B205a1F

攻擊者獲得相關APE空投的交易具體如下圖所示:

攻擊者套利的主要步驟為:

1.首先從Opensea購買了ID為1060的BAYCNFT;

2.通過NFTX以閃電貸借出5個BAYCNFT;

3.利用空投合約漏洞,領取6個BAYC對應數量的APECoin;

4.歸還閃電貸,并轉移獲利的APECoin;

其中涉及到的漏洞合約AirdropGrapesToken代碼如下圖所示:

如上圖所示,該函數使用alpha.balanceOf()和beta.balanceOf()判定調用者對BAYC/MAYCNFT的所有權。但是這種方式僅能獲取到用戶對該NFT所有權的瞬時狀態,該瞬時狀態可以通過閃電貸借入進行操控,更安全的方式是采用基于默克爾樹的鏈下快照方式。該方式將白名單存儲在鏈下項目方的中心服務器上,當用戶在前端官網點擊mint之后,服務器會根據錢包地址生成Merkleproof,用戶再向智能合約發送一筆攜帶Merkleproof的交易,并在鏈上的智能合約中進行驗證。

美股上市公司Direct Equity International宣布更名為“Metaverse Inc.”:金色財經報道,美股上市公司Direct Equity International, Inc.宣布正式將公司名稱更改為“Metaverse Inc.”,旨在進一步加強其人工智能、社交媒體、Web3和增強現實產品新戰略,據悉該公司正在開發一種與AI聊天機器人進行交互的軟件, 還在開發結合區塊鏈、加密貨幣和NFT的Web3產品,以構建潛在新收入流和獨立于傳統廣告和數據收集方法的商業模式。(globenewswire)[2023/2/23 12:25:32]

該方式一般包含以下三部分:

-后臺根據白名單地址生成Merkletree;

-將MerkleRoot上傳到區塊鏈;

-驗證時前端根據當前用戶生成MerkleProof,并將其傳入NFT合約校驗;

具體可以參考NFT項目InvisibleFriends(INVSBLE),合約地址:0x59468516a8259058baD1cA5F8f4BFF190d30E066。以下是INVSBLE項目中采取的白名單鑄幣方法mintListed():

-amount:鑄造NFT的數量;

-maxAmount:該地址能鑄造的NFT最大數量;

-merkleProof:判斷某特定白名單地址節點是否屬于Merkletree上所需的數據,包含葉子節點、路徑、根;

該函數首先校驗預售是否開啟、調用者是否還有額度鑄造,接著進行白名單校驗,并驗證調用者出價是否正確,最后鑄造NFT。以下為進行白名單驗證的代碼實現:

keccak256(abi.encodePacked(sender,maxAmount.toString()))用于計算默克爾樹的葉子節點,此處用白名單用戶地址和每個用戶能夠鑄造的最大NFT數量作為葉子節點屬性。同時還隱藏了一個校驗,即msg.sender必須是白名單地址本身。

WazirX:Binance在WazirX所有權問題上撒謊:金色財經報道,幣安于1月25日凌晨給WazirX發了一封信,要求WazirX交易所在本月底之前滿足兩項要求,否則幣安有可能在2月3日之前終止與WazirX的服務協議。首先,幣安要求WazirX發布一份事先寫好的“澄清聲明”,收回WazirX聯合創始人NischalShetty之前關于幣安擁有WazirX的聲明。它還要求WazirX在其服務條款中刪除所有提到幣安的內容。上周五,WazirX的官方名稱Zanmai在一封信中回應了幣安的要求。該公司予以回擊,稱這封要求信是“不道德的”,并試圖利用“媒體壓力和威脅迫使Zanmai發布虛假和誤導性的聲明作為‘澄清’。[2023/1/28 11:33:36]

MerkleProof驗證計算使用libraryMerkleProof,計算過程可以參考SPV驗證,具體源碼如下:

使用該方式,NFT發行合約中不需要存儲整個白名單列表,只需要存儲Merkleroot。當交易發送方是非白名單用戶時,因為其無法提供合法的MerkleProof,則無法通過校驗。

鏈下數據快照驗證白名單還有另一種使用簽名的方式,此時如果合約開發者未設置足夠的安全檢查,也容易造成安全問題,如:NBA薅羊毛事件。

案例二:NBA薅羊毛事件?

2022年4月21日,NBAxNFT項目方遭遇黑客攻擊。根據官方回復,由于其白名單校驗出現問題導致預售提前售罄。

本次攻擊事件中,漏洞合約地址:

0xdd5a649fc076886dfd4b9ad6acfc9b5eb882e83c

分析師:比特幣現貨基金申請通過可能推動下一輪牛市:金色財經報道,三星資產管理香港首席執行官Sam Park表示,香港正在推動成為亞太加密貨幣中心,三星目前也在密切關注該地區不斷變化的數字資產規則,如果條件允許,未來會考慮在香港啟動基于現貨比特幣的交易所交易基金。Park稱:“這實際上取決于政策將如何制定,當地政府顯然熱衷于開發一個加密中心。” 此前今日早些時候消息,三星資產管理公司推出的“三星比特幣期貨主動型ETF”已在港交所上市交易。

對此,小牛精選特邀分析師保羅大帝表示,目前,“三星比特幣期貨主動型ETF”已在港交所上市交易。未來在眾多投資機構支持下,比特幣現貨基金申請通過可能性非常大。如果通過,這將對加密資產具有里程碑的意義,將很可能成為下一輪大牛市發動機。[2023/1/13 11:10:42]

上述代碼存在兩個安全問題:簽名冒用和簽名復用。簽名復用指的是,同一個簽名只能使用一次,一般項目方會在合約中設置一個mapping結構存儲該簽名是否已經被使用,具體源碼如下:

?mapping(bytes=>bool)privateusedClaimSignatures

其中bytes代表Hash簽名數據,bool值代表該簽名是否曾經被使用,但是mint_approved()函數中并未存儲該值,所以存在簽名復用問題。

本文主要研究白名單校驗中的簽名冒用問題,即由于vDatamemory參數info在傳參時未進行msg.sender校驗導致簽名可冒用。具體白名單校驗函數verify()如下:

上述代碼采用簽名校驗的方式驗證白名單,白名單存儲在中心化服務器上,用戶從前端NFT官網點擊mint時,服務器會首先校驗是否是白名單用戶。如果是,則由服務器使用項目方私鑰進行簽名,再將簽名數據返回。最后用戶攜帶該簽名的交易發送到鏈上進行驗證。因此此處ecrecover()驗證的僅僅是項目方的地址,僅能證明該簽名數據是由項目方進行簽發的,但是由于未對簽名數據中的調用者,即info.from進行驗證,所以導致簽名可冒用。

特斯拉Q2出售75%比特幣持倉套現9.36億美元,單枚均價約為2.9萬美元:7月21日消息,據特斯拉公布的2022年第二季度財報顯示,該公司本季度出售了價值9.36億美元的比特幣,占其比特幣持倉的75%,使第二季度的資產負債表增加了9.36億美元現金,單枚比特幣的出售均價約為29000美元,利潤表中顯示相關虧損為1.06億美元。截止第二季度結束,特斯拉持有的比特幣總價值約為2.18億美元,而前三個季度為12.6億美元。

第二季度結束時,比特幣的價格約為1.87萬美元,這意味著特斯拉通過在當季度早些時候出售比特幣,避免了針對其持倉的巨額減值支出。

2021年2月,特斯拉宣布購買15億美元比特幣,并于2021年第二季度出售10%比特幣持倉,使當季收益增加了2.72億美元。在最近的聲明公布之前,該公司沒有再買賣比特幣。

總體而言,特斯拉第二季度調整后的每股收益為2.27美元,超過了FactSet分析師的普遍預期——每股收益為1.81美元。該季度營收為169億美元,超過了165億美元的預期。(CoinDesk)[2022/7/21 2:27:24]

PART02

「NFT平臺漏洞問題」

NFT平臺主要有兩類,一類是NFT交易平臺,如:Opensea、TreasureDAO等;另一類是結合了DeFi業務的平臺,如:RevestFinance等。根據平臺類型不同,對應的業務類型也不同,造成的安全漏洞也不同。

NFT+DeFi?類型

目前NFT+DeFi主要分為三種類型:一種是將NFT當作流動性代幣,如:Uniswap-V3等;一種是將NFT碎片化,即FNFT,如:RevestFinance等;另一種是將NFT作為借貸的抵押品,如:PositionExchange等。其中RevestFinance項目包含以上三種業務類型,因此本文從業務邏輯的角度研究了RevestFinance安全事件。

RevestFinance是針對DeFi領域的staking解決方案,用戶通過該項目參與任何Defi的staking,都可以直接生成一個F-NFT,其代表了staking倉位當前和未來的價值,具體的業務模型如下:

該項目中用戶可以通過mintAddressLock()鑄造對應抵押資產的FNFT,具體代碼如下所示:

其中涉及到的重要參數為:

-trigger:只有該address可以解鎖質押的資產;

-recipients:鑄造的FNFT對應的接收者;

-quantities:各個接收者接收的FNFT數量;

-IRevest.FNFTConfig:描述FNFT對應的質押資產,包括:asset、depositAmount等。

用戶也可以通過depositAdditionalToFNFT()追加FNFT的抵押資產,具體代碼如下:

其中涉及到的重要的參數為:

-fnftId:需要追加資產的FNFT;

-amount:每個FNFT需要追加的抵押資產數量,包含精度;

-quantity:為多少個FNFT追加抵押;

用戶追加質押資產時,根據quantity的不同存在三種情況,第一種情況是為所有FNFT追加抵押,第二種情況是為其中一部分FNFT追加抵押,第三種情況是追加抵押的FNFT數量大于FNFT總量,此時報錯返回。該漏洞為第二種情況下造成的重入,具體邏輯如下:

由上述代碼可知,追加抵押時需要先把之前的FNFT銷毀,之后再鑄造新的FNFT。但是在鑄造時,由于min()函數中未判斷需鑄造的FNFT是否已經存在,并且狀態變量fnftId自增在_mint()函數后。而_min()中存在ERC-1155中的隱藏外部調用_doSafeTransferAcceptanceCheck(),造成了重入漏洞。具體代碼如下:

此處的mint()函數中_mint()包含一個隱藏的外部調用,具體如下:

攻擊主要包括以下三個步驟:

1.調用mintAddressLock()鑄造了2個fnftId為1027的FNFT,但是它們對應的資產為0;

2.調用mintAddressLock()鑄造了360000個fnftId為1028的FNFT,它們對應的抵押資產仍然為0;

3.在步驟2中,利用ERC-1155中_mint()函數中的_doSafeTransferAcceptanceCheck()重入了depositAdditionalToFNFT(),將1個fnftId為1027的FNFT對應的抵押更新為1WETH。

由于此時fnftId還未自增,仍然為1027,所以該函數會生成一個fnftid為1028且價值為1WETH的FNFT,導致將id為1028的FNFT價值從0更新為了1WETH。

綜上,由于FNFT是一種證券化后的NFT,其價值會根據業務邏輯的不同產生波動,如該例中的staking倉位價值。所以FNFT存在價值變更的情況,一般會通過重寫burn()和mint()等函數實現價值變更,如:本例中的FNFTHandler合約。如果實現時沒有考慮檢查-交互-生效機制,就可能存在嚴重安全問題。

NFT交易平臺?

該類平臺一般會實現簡單的市場功能,包括:掛單、取消掛單、購買、出價、取消出價、接受出價、提現等。其中涉及到的NFT資產包括ERC721、ERC1155兩種,開發過程中如果沒有考慮到二者的區別,就可能造成安全問題,如TreasureDAO事件。

2022年3月3日,TreasureDAO生態的TreasureMarketplace交易平臺遭到黑客攻擊,造成NFTtoken被盜。傳送門——《怪事?盜了又歸還?TreasureDAO安全事件分析》

在本次事件攻擊事件中,攻擊者信息如下:

交易發起地址:

Arbitrum:0x9b1acd4336ebf7656f49224d14a892566fd48e68

漏洞合約:

Arbitrum:0x812cda2181ed7c45a35a691e0c85e231d218e273

攻擊交易:

Arbitrum:0x57dc8e6a28efa28ac4a3ef50105b73f45d56615d4a6c142463b6372741db2a2b

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

但是在調用TreasureMarketplace合約的buyItem函數時,函數只對購買代幣類型進行了判斷,并沒有對代幣數量進行非0判斷,導致ERC-721類型的代幣可以在無視_quantity數值的情況下直接購買,從而實現了漏洞攻擊。

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

此外,在與NFT交易平臺相關的漏洞中,除了上述由于NFT本身造成的漏洞外,還有由于平臺本身存在安全問題而危害NFT交易的情況。如:近期發現的OpenseaWyvern2.2合約漏洞,攻擊者可以利用該漏洞竊取Opensea市場中具有活躍報價的用戶WETH。所幸Opensea團隊預先發現了該問題,并進行了及時的修復,尚無相關攻擊產生。

Tags:NFTFNF比特幣MINOpenLive NFTFNF幣比特幣行情最新價格人民幣MintWay

狗狗幣價格
比特幣:除了備受攻擊的 S2F PlanB 還有哪些常用分析模型?

近日推特KOLPlanB例舉了自己除了熟知的S2F以外常用的輔助決策的幾個指標模型,鑒于當前波動較大的行情走勢以及暴跌后的抄底情緒,我們將這些指標模型展開介紹,以供參考使用之需.

1900/1/1 0:00:00
元宇宙:全球咨詢巨頭麥肯錫發布的萬字元宇宙報告究竟說了什么?(附報告下載)

歡迎來到元宇宙。目前,我們到底在哪里?想象一下互聯網的下一次更新迭代,將我們的現實生活和數字生活無縫結合.

1900/1/1 0:00:00
區塊鏈:市場跌宕起伏 頂級銀行仍在擴充加密投資版圖

早在2021年8月,區塊鏈分析公司Blockdata就向我們揭示了:在管理資產排名前100的頂級銀行中,有55家直接或通過子公司間接投資了與加密貨幣和區塊鏈相關的公司.

1900/1/1 0:00:00
WEB:Web3 真正的樣子是什么?

一段時間以來,區塊鏈領域一直在兜售Web3田園詩的承諾,以及它將如何徹底改革現有的互聯網,圍繞太多登錄憑據、安全性、可訪問性和內容審核的問題都困擾著當今的互聯網.

1900/1/1 0:00:00
NFT:慢霧:XCarnival NFT借貸協議漏洞分析

原文作者:九九,慢霧安全團隊2022年6月27日,據慢霧區消息,XCarnival項目被曝出嚴重漏洞遭黑客攻擊并盜走3,087個ETH.

1900/1/1 0:00:00
BNB:當這板塊大漲時 才是抄底比特幣最好的時機

因為比特幣跟美股的正相關性,所以今天從2個指標來看看,是否究竟是否到底? 第一個指標是美林時鐘! 美林時鐘.

1900/1/1 0:00:00
ads