動區此前報導,有用戶在 17 日利用 NFTX 中的 BAYC 金庫(Vault),透過閃電貸手法,成功領取 60,564 枚 ApeCoin 空投,套利 14.15 ETH(現價約 3.95 萬美金 )。Amber Group 安全團隊表示, 這可能是第一次使用 ERC721 和 NFT AMM DEX 執行的閃電貸套利 / 漏洞利用,因此有必要撰文深入解析。
(前情提要:套利獲6萬枚APE!有用戶閃電貸出 NFTX 6 枚BAYC,領ApeCoin空投)
(本文由 Amber Group 安全團隊撰著、提供。)
2
022 年 3 月 17 日,無聊猿(Bored Ape Yacht Club)確認發幣,將 ApeCoin 總供應量的 15% 空投分配給了 BAYC/MAYC 持有者[1],無聊猿持有者為了獲得空投,必須積極與空投智能合約互動,導致以太坊 gas fee 飆升至約 400 gwei,為當時平均 gas fee 的 10 倍。
空投開始五分鐘後 [2],一位準備充分的持有者 [3] 利用 NFTX [4] 上的 BAYC 流動性進行了非常聰明的套利 / 漏洞利用 [5]操作。由於這可能是第一次使用 ERC721 和 NFT AMM DEX 執行的閃電貸套利 / 漏洞利用,因此我們必須在此對其進行重現以深入解析。
延伸閱讀:乾貨 | Amber 安全專家吳博士:剖析 BSC 的閃電貸攻擊手法,如何再引發 3 個分叉項目連環爆?
0x00:AirdropGraphsToken 合約
無聊猿持有者能夠調用 AirdropGraphsToken 合約的 claimTokens() 函數 [6] 來領取 ApeCoin 空投。
如下方的程式碼片段所示,在第 105 行核對 alpha.balanceOf() 和 beta.balanceOf() 以確保調用者確實是 BAYC/MAYC 持有者。然後,有清單來註記已領取的 tokenId(第 114-117 行),如此一來第 110 行中的 getClaimableTokenAmountAndGammaToClaim() 函數將就能讓合約調用者僅領取到可領取的 ApeCoin 數量。
如果您曾經領取過其他空投,您可能已注意到透過這些 balanceOf() 函數檢查 claimTokens() 調用者的資格並不常見。事實上,許多項目會生成一個默克爾樹(merkle tree),並且將根(Merkle Tree Root ) 節點提交到區塊鏈上來進行資格核查。
balanceOf() 函數的調用使惡意行為者能夠借用無聊猿索取 ApeCoin 空投,但如果領取的 ApeCoin 價值高於借出的費用,那麼惡意行為者將能憑空創造獲利。
0x01:NFTX
關於 ERC20,自 2020 年初以來,我們已經從駭客那裡習得很多關於如何使用閃電貸攻擊來獲利的方法。但在 ERC721 並不常見。 NFTX 是少數允許用戶出於特定目的進行 ERC721 閃電貸的平台之一。
具體來說,NFTVault 合約中的 flashLoan() 函數允許用戶借用任意數量的 vault Token(vToken),該代幣可用於贖回目標 NFT [7]。
如下方程式碼片段所示,在第 998 行 vToken 的鑄造數量有賴於在第 999 行執行的 onFlashLoan() 回調函數。當 onFlashLoan() 回調時,「數量 + 費用」vToken 在第 1003 行被燒毀,這表示 flashLoan() 的調用者必須準備的 vToken 需大於借來的 vToken 才能執行 flashLoan() 函數 。
那麼,我們可以用 vToken 做什麼呢?好吧,如果 BAYC NFTXVault 有 10 個無聊猿作為流動性,用戶可以:
- 閃借 10 個 BAYC vToken
- 贖回 10 個 Apes
- 領取 ApeCoins
- 鑄造 10 個 BAYC vToken
- 償還 10 個 BAYC vToken +額外費用。
除了目前的零閃電貸費用外,NFTX 對閃電貸使用者收取贖回和鑄造費用。您需要支付 1.04 BAYC vToken 才能兌換 1 BAYC NFT。支付 1 個 BAYC NFT 後,您只能獲得 0.9 個 BAYC vTokens。因此,仔細安排用於借貸的代幣數量非常重要。
0x02:利用邏輯缺陷領取空投
讓我們從做些數學題開始。透過分析套利/漏洞利用交易,我們知道燒毀 5 個 vToken 可用來兌換 5 個 Apes,但這些步驟(加上費用)實際上燒毀了 5.2 個 vToken。後來,6 隻無聊猿(包括二手的 BAYC)被發送到 NFTX 金庫以鑄造 5.4 個 vToken。在支付 5.2 個借出的 vToken 後,0.2 個 vToken 在 SushiSwap 被兌換成約 14 個 ETH。
基於上述訊息,我們可以透過在 SushiSwap 上購買一些 BAYC vToken 並將這些 vToken 用作贖回/鑄造費用來重現該漏洞。但是,SushiSwap WETH-BAYC 池中只有約 0.9 個 BAYC vToken,這意味著由於 AMM 的工作方式,我們需要支付大量 ETH 來購買 vToken。因此,惡意行為者選擇花費 106 ETH 從 OpenSea [8] 購買 #1060 BAYC,以將其抵押用於部分的贖回/鑄造費。
藉由 Exp 合約中的 #1060 BAYC,我們可以透過調用 NFTVault.flashLoan() 函數從 NFTVault 贖回所有可用的 Apes,如下所示:
由於每次贖回消耗 1.04 個 vToken,我們需要借出的 vToken 數量將是金庫擁有的 Apes 數量的 1.04 倍(第 56-57 行)。
在 onFlashLoan() 回調函數中,我們首先使用 tokenOfOwnerByIndex() 輔助函數獲取金庫擁有的 Apes 清單(第 84-89 行)。 然後,我們逐步執行 vToken 贖回 NFT(redeem()函數)、領取Ape代幣(claimTokens()函數) 和重鑄造 vtoken 償還(mint() 函數)操作,如下所示:
在 onFlashLoan() 函數結束時,程式執行返回到我們的 trigger() 函數,餘額為 0.2 個 vToken。 在 trigger() 函數的下半部分,我們在 SushiSwap 將所有 vToken 交換為 ETH,並在持有者地址收集這些 ETH 和領取的 APE,如下方程式碼片段所示。
下面是用 eth – brownie+ganache 模擬套利/漏洞利用的截圖:漏洞利用者支付 106 ETH 購入 NFT 後,並以 14.15 ETH + 60,564 APE 獲利出場。
0x03:後果
根據 CoinMarketCap 的數據,在 3/18 ~ 3/20 [9] 期間,APE 的交易價格高於 10 美元,而當漏洞利用者購買 #1060 BAYC 時,ETH 的價格約為 2,760 美元。 因此,利潤為:
(($10 * 60564) – ($2,760 * (106–14.15))) = ~ $350k。
在我們內部區塊鏈數據分析平台的幫助下,截至 2022 年 3 月 21 日,我們確定了 1 萬個 BAYC 中的 8,647 個已用於領取 ApeCoin 空投。這意味著截至筆者撰寫本文時,人們仍然能透過類似方式收集一些無聊猿,以換取 ApeCoin 空投、賺取利潤。
關於 Amber Group
成立於 2017 年,業務遍及亞洲及歐美各大主要城市,現為 1,000 多家知名大型機構客戶提供加密金融服務,在 100 多個電子交易所中累計交易總額已超過 1 兆美元,資產管理規模超過 50 億美元,幫助客戶管理各種加密資產的風險,提供靈活化的投資、最大化的回報來優化長期價值
Amber Group官方網站: www.ambergroup.io
WhaleFin官方網站: www.whalefin.com
若有產品相關問題,請聯繫 Amber 客服團隊: service@ambergroup.io、service@whalefin.com
📍相關報導📍
新手|WhaleFin 「五大核心工具」教學,註冊免費領 25 鎂 BTC、再抽 1 ETH
DeFi乾貨 | 深入解析 Dexfolio 的重入漏洞事件 -Amber安全團隊
DeFi 乾貨|Dinosaur Eggs 的流動性池漏洞解析 – Amber 安全團隊
讓動區 Telegram 新聞頻道再次強大!!立即加入獲得第一手區塊鏈、加密貨幣新聞報導。
LINE 與 Messenger 不定期為大家服務