By:九九@慢霧安全團隊

2022 年03 月27 日,據慢霧區消息,Revest Finance 的Revest 合約遭到黑客攻擊,黑客盜取了近770 萬枚ECO、579 枚LYXe、近7.15 億枚BLOCKS 以及超35 萬枚RENA。慢霧安全團隊第一時間介入分析,並將結果分享如下:

相關信息

Revest Finance 提出了一種新協議,用於將可替代的ERC-20 代幣作為不可替代的代幣化金融工具進行打包、轉移和存儲,利用ERC-1155 非可替代代幣(NFT)標準來簡化訪問和商業通用性。使用該產品,資產的所有權可以以不影響資產價值的方式進行交易,從而形成一個新的商業模式。通過有針對性的用例發現該協議的機制、治理和貨幣化。

以下是本次攻擊涉及的相關地址:

攻擊者地址:

https://etherscan.io/address/0xef967ece5322c0d7d26dab41778acb55ce5bd58b

攻擊合約:

https://etherscan.io/address/0xb480ac726528d1c195cd3bb32f19c92e8d928519

被攻擊合約:

https://etherscan.io/address/0x2320a28f52334d62622cc2eafa15de55f9987ed9#code

攻擊交易:

https://etherscan.io/tx/0xe0b0c2672b760bef4e2851e91c69c8c0ad135c6987bbf1f43f5846d89e691428

https://etherscan.io/tx/0x613b2de3bb9043884a219296eeb1ada8c47b5a0262b9c68ca06ffd2de3a5d9f5

https://etherscan.io/tx/0x0251c2b8012a61567ec5855010d29618ada066642e4a2866755d58337c2866d9

https://etherscan.io/tx/0x19b10c6d38f0b911fdc0e722d681a70a56699d70559eefef3d4d6fe88276c813

攻擊核心點

在被攻擊的Revest 合約中,用戶調用mintAddressLock 函數來將一定數量的ERC-20 代幣存入Revest Smart Vault 時,就會創建FNFT。該NFT 代表了用戶擁有的代幣資產數額,後續可以調用withdrawFNFT 函數將代幣贖回。

攻擊核心點就在於攻擊者利用ERC1155 標準鑄造NFT 時會調用接受者地址的onERC1155Received 函數,因此攻擊者利用該點回調重入了Revest 合約中的depositAdditionalToFNFT 函數,該函數會鑄造一個新的NFT,接著會調用tokenVault 合約的handleMultipleDeposits 函數記錄新的NFT 的信息,而handleMultipleDeposits 函數中缺少了對該新鑄造的NFT 是否存在的判斷,故此攻擊者利用重入修改了已經鑄造過的NFT 的信息,而用戶鑄造NFT打入ERC20 資產代幣的流程是在重入操作之前的,故此用戶無需打入ERC20 代幣就成功鑄造了代表自己具有360001 枚ERC20 代幣資產的NFT。

具體細節分析

此處拿獲取RENA 代幣的攻擊進行分析,其他幾個攻擊手法一致,不做過多贅述。

1. 攻擊者首先從uniswap 池子中閃電貸借出2 枚RENA 代幣

2. 接著調用Revest 合約中的mintAddressLock 函數,傳入quantities 為2,該函數進行加鎖操作後會調用doMint 函數來鑄造NFT

在doMint 函數中,會調用tokenVault 合約的createFNFT 函數記錄所鑄造的NFT 函數信息,接著用戶給tokenVault 合約轉賬相應的ERC20 代幣,最後調用FNFTHandler 合約中的mint 函數來發放NFT

所鑄造的NFT 的fnftId 為1027, 所記錄的該NFT 相關信息如下:

因為depositAmount 為0,故此NFT 代表用戶擁有的ERC20 代幣資產為0,故無需轉相關資產代幣給合約

3. 再次調用Revest 合約中的mintAddressLock 函數,傳入quantities 為360000,與上面相同的步驟調用doMint 進行鑄造NFT,所鑄造的NFT 的fnftId 為1028,記錄的NFT 信息如下:

因為depositAmount 為0,故仍然無需轉賬代幣資產給tokenVault,但是與之前不同的是,這一次鑄造NFT 的操作中,因為在調用FNFTHandler 合約的mint 函數時會調用_doSafeTransferAcceptanceCheck 函數

該函數會調用攻擊合約的onERC1155Received 函數,故此攻擊者利用攻擊合約中的重寫的onERC1155Received 函數回調重入了Revest 合約的depositAdditionalToFNFT 函數

在depositAdditionalToFNFT 函數需要傳入指定的fnftId(此處是1027)、NFT 數量quantity(此處是1)與單個NFT 中需要存款的資產數額amount(此處是1),該函數會burn 掉傳入的fnftId 的指定數量的NFT,接著用戶轉入指定數量的ERC20 代幣資產並mint 新的NFT,需要轉賬的數量是quantity * amount 為1,最後調用tokenVault 合約中的handleMultipleDeposits記錄新的NFT 的存款數量為上面傳入指定fnftId 的NFT 的depositAmount 值+ 傳入的amount 的值

而在handleMultipleDeposits 函數mint 新的NFT 時沒有判斷該NFT 的信息是否在tokenVault 合約中存在,故此攻擊者利用該問題直接修改了1028 號NFT 的信息,使得該NFT 雖然在doMint 操作時第一次記錄的depositAmount 為0,但是在重入後卻修改成了1

4. 最後調用withdrawFNFT 函數進行提取NFT 中所代表的ERC20 代幣資產

該函數燃燒掉指定的NFT 後,會調用tokenVault 合約中的withdrawToken 函數進行提款

因為depositAmount 在回調後被修改了為了1,故此最後提款的RENA 數量計算出來約為360000 枚

5. 攻擊者歸還閃電貸後獲利離場

總結

本次攻擊事件是由於在tokenVault 合約中的handleMultipleDeposits 函數中沒有判斷該新鑄造的NFT 是否存在,故此攻擊者利用該點直接修改了已經鑄造過的NFT 的信息,並且在Revest 合約中關鍵的函數沒有做重入鎖的限制,導致了被回調利用。慢霧安全團隊建議在進行鑄造NFT 等敏感操作時需增加對NFT 是否已經存在的判斷,且在合約關鍵函數中必須添加重入鎖的限制,避免再次出現此類問題。

往期回顧

往期回顧

智能合約安全審計入門篇—— 訪問私有數據

慢霧:OneRing Finance 被黑分析

鏈上追踪:洗幣手法科普之Tornado.Cash

故技重施—— Hundred Finance 被黑分析

大意失荊州—— Paraluni 被黑分析

智能合約安全審計入門篇—— 訪問私有數據慢霧:OneRing Finance 被黑分析鏈上追踪:洗幣手法科普之Tornado.Cash故技重施—— Hundred Finance 被黑分析大意失荊州—— Paraluni 被黑分析

慢霧導航

慢霧科技官網

https://www.slowmist.com/

慢霧區官網

https://slowmist.io/

慢霧GitHub

https://github.com/slowmist

Telegram

https://t.me/slowmistteam

Twitter

https://twitter.com/@slowmist_team

Medium

https://medium.com/@slowmist

知識星球

https://t.zsxq.com/Q3zNvvF