safeTransferFrom 真的安全嗎?

本文為機器翻譯
展示原文

ERC721 NFT合約提供了兩種NFT轉移選項: transferFromsafeTransferFrom 。您可能想知道safeTransferFrom是否比transferFrom更安全?答案是肯定和否定。讓我們來分解一下:

  • safeTransferFrom的安全性:此方法包括一項檢查,以確保接收者能夠正確處理 ERC721 NFT。這意味著,如果接收者是缺乏必要的 NFT 處理功能的合約,則 NFT 不太可能“陷入困境”。

  • 安全警告:雖然safeTransferFrom為 NFT 本身提供了保障,但它並不能保證合約的安全。事實上,它可能會引入重入攻擊的漏洞。這是因為如果接收者是另一個合約,它會觸發接收者合約中的函數。

讓我們深入研究一個現實世界的例子。 2024 年 1 月 25 日,攻擊者利用NBLGAME合約的reentrancy漏洞。被利用資金的估計總價值約為18萬美元。

概述

攻擊者: https ://optimistic.etherscan.io/address/0x1fd0a6a5e232eeba8020a40535ad07013ec4ef12 攻擊合約: https://optimistic.etherscan.io/address/0xe4d41bdd6459198b33cc795ff280cee02d91087b漏洞合約:https: //optimistic.etherscan .io/address/0x5499178919c79086fd580d6c5f332a4253244d91 攻擊發送: https://optimistic.etherscan.io/tx/0xf4fc3b638f1a377cf22b729199a9aeb27fc62fe2983a65c4d14b99ee5c5b2328

漏洞利用分析

被利用的漏洞源於withdrawNft函數中的重入漏洞,因為它在返回NFT時使用了safeTransferFrom

攻擊者首先存入NFT ,然後將NBL代幣質押到合約中。在withdrawNFT時,合約會先將NFT發回,然後再返回質押的代幣。由於safeTransferFrom觸發了攻擊者合約的onERC721Received函數,攻擊者就有了機會之窗。合約狀態不一致,因為質押的 NBL 金額尚未扣除。此時,質押的NBL數量已存儲在amount中,因此攻擊者利用onERC721Received發起可重入調用withdrawNFT ,有效地將 NFT 重新存入合約以再次調用withdrawNFT

第二次提現成功取回質押的NBL代幣。隨後,第一次提現也從之前存儲的amount中扣除了 NBL 代幣,由於重入,該金額仍然完好無損。漏洞利用成功,攻擊者收到了雙倍的質押代幣。

結論

在使用ERC721 NFT 智能合約時,請始終注意safeTransferFrom函數將觸發接收方的onERC721Received ,因此它們可能會形成重入漏洞。以下是降低這種風險的兩種有效方法:

  • 檢查-效果-交互模式此模式強調在進行任何外部調用之前更新合約的狀態變量。這可以防止攻擊者在外部調用期間操縱合約的狀態。

  • ReentrancyGuard :考慮在所有公共/外部函數中使用ReentrancyGuard機制。這添加了一個修飾符,可以防止在初始調用完成之前重新輸入函數。

為了獲得最大的安全性,建議儘可能在合同中應用這兩種方法。雖然ReentrancyGuard會產生少量的 Gas 成本,但它提供了針對重入攻擊的額外保護層。

感謝您閱讀 Verichains!免費訂閱以接收新帖子並支持我的工作。

來源
免責聲明:以上內容僅為作者觀點,不代表Followin的任何立場,不構成與Followin相關的任何投資建議。
喜歡
收藏
評論