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相关的任何投资建议。
喜欢
收藏
评论