定义

setApprovalForAll(address operator, bool approved) 是 ERC-721 和 ERC-1155 标准里的标准函数。意思是:把这个 NFT 合约下你名下的所有 token 的转移权,授权给 operator 这个地址。

正常使用场景:你在 OpenSea 挂单第一个 NFT 时会触发一次,授权给 OpenSea 的合约 —— 之后你挂单 1000 个不用再签。问题是这个授权一签就是"全集合 + 永久",而 NFT 钓鱼站借的就是这一点。

钓鱼链路

典型场景:BAYC 假免费铸造页 / 假空投页 / 假退款页。点连接钱包,钓鱼站把签名内容简化为 Confirm 或 Claim。Metamask 弹窗里看到的函数名其实是 setApprovalForAll,参数是攻击者合约,approved=true。一旦确认,这个钱包里属于这个集合的所有 NFT 进入待清空状态。

清空动作往往不马上做 —— 攻击者会等几小时甚至几天,等你最贵的那张 NFT 进了钱包再一次性 Transfer。

识别要点

钱包弹窗里看到 setApprovalForAll 五个字基本只对应两种情况:你正在挂单某个 NFT 集合,或者你被钓鱼了。除此之外没有别的合理场景。

第二是看 operator 地址。OpenSea Seaport 合约、Blur 合约、X2Y2 合约都有公开地址,跟你看到的弹窗参数对照一下,对不上就是钓鱼。Metamask 新版会标注"已知操作员",没标注的就要警惕。

防御与撤销

事前:Metamask 启用「签名详情展开」让弹窗显示完整函数和参数;安装 Pocket Universe / Wallet Guard 之类的 Chrome 插件做合约白名单核对。

事后:去 Revoke.cash 撤销授权。这是一个必须养成的月度动作 —— 把所有不再用的 NFT 市场 / DApp / 不认识的合约从授权列表里清空。

同类陷阱不止 NFT 这一种 —— 同样原理在 ERC-20 上叫做 EIP-2612 Permit,更隐蔽。延伸阅读:MetaMask 安全使用钓鱼诈骗全图谱