2026 年签名钓鱼五大模式,以及怎么一眼识破
我反复说一句话:2026 年钱包被抽干,主因不是私钥泄露,是签名钓鱼。在过去十二个月的复盘里,凡是涉及上万美元以上的钱包损失,离线签名钓鱼几乎都占到一半以上。
但「签名钓鱼」其实不是一种攻击,是一类攻击。它们用不同的协议字段、不同的合约入口、不同的钱包提示,把同一件事——让你授权别人转走资产——实现出来。这篇我把目前最高频的五种模式拆开,并把每一种的视觉识别点列出来。
先说一个共同特征
所有签名钓鱼有一个共同前提:它都不要你的私钥。它要你做的事情,是用你私钥签一段数据。一旦签完,对手就拥有了在合约或链下系统里调用「转账」「卖出」「跨链桥接」的合法凭据。
也就是说:
- 你看不到这笔交易在链上「发起」。
- 你的钱包余额会在某个时点突然消失。
- 你以为自己什么都没做。
这是为什么签名钓鱼比 transfer 钓鱼可怕得多。

模式一:setApprovalForAll(NFT 类)
setApprovalForAll(operator, true) 是 ERC-721 / ERC-1155 标准里允许一个地址替你转走你所有 NFT 的开关。一旦把它给了攻击合约,攻击者随时可以把你这条链上的整套 NFT 资产组合扫光。
识别要点:
- 钱包弹窗里出现
setApprovalForAll字样,operator 是一个你不认识的合约地址。 - 上下文是「免费 mint」「领空投」「快照领取」类操作。
- 对方诱导你「先签一笔免费操作」,但这一笔的内容并不是 mint。
我自己只允许在两个我严格信任的市场(且每次还是看完 calldata)出现这个调用。其他场景一律拒。
模式二:ERC-20 approve 无限额度
这是 setApprovalForAll 的 ERC-20 版本:你给一个合约**approve(spender, type(uint256).max)**,相当于授权它转走你所有该代币。
识别要点:
- 弹窗的金额字段显示一个异常巨大的数字或
unlimited / 无限。 - 合约名字与你正在做的事情不匹配——例如你想换 1 USDC,却被要求 approve 一个看起来像 router 但实际不是的合约。
- 钱包提示**「会有一笔后续转账」**但其实你的初衷不是这样。
防御也只有一条:任何 unlimited 类授权都不签,宁可多花一次 Gas 给特定金额。
模式三:Permit / EIP-2612 离线签名
这一类是 2026 年最危险的。Permit 允许你不发链上交易,仅通过一次 EIP-712 离线签名,把代币授权交给攻击者。
它危险在哪里?
- 它没有 Gas 痕迹——你在区块浏览器上看不到任何「approve」记录。
- 它绕过普通钱包提示——很多钱包对 EIP-712 类型化数据可视化不够。
- 它可立即生效——攻击者拿到签名后随时调用 permit,完成授权与转账两步。
识别要点:
- 弹窗内容里出现
Permit、spender、deadline、value等字段。 - 网站让你「先签一个无 Gas 的东西」就能继续——这就是关键信号。
- 钱包提示 「Sign Typed Data」 或 「EIP-712」。
我的规则:任何无法用人话读懂的结构化签名,一律不签。
签名钓鱼频发的更大背景,可以同时参考 Safe Labs 5000 个 Drainer 地址 与 1 月 3.11 亿钓鱼复盘,里面都把 Permit 列为头号原因之一。
模式四:Seaport / Permit2 类聚合签名
OpenSea 的 Seaport 和 Uniswap 的 Permit2 把多笔授权打包到一次签名里,本意是提升 UX,但也给攻击者提供了新的签名钓鱼模板。
伪装版本看起来非常正常:一个聚合 DEX 或 NFT 市场要求你「签一个授权」,弹窗里出现 Seaport / Permit2 关键词,你看着像是「我熟悉这个东西」,就签了。其实内容包含:
- 把 USDC、USDT、WETH 三种主流稳定币的额度一次性发给攻击合约。
- 把多张 NFT 的转移权限一并交出。
识别要点:
- 弹窗里同一个签名涉及多个代币 / 多个合约。
- 你当前只想做一件事(比如换一种代币),但签名里给出的授权范围远超必要。
- 签名签发地不是你正在交互的官方域名(鼠标悬停 spender 字段查看)。
我对这一类的处理:任何聚合签名,先看 spender 与 token list 是否符合最小必要原则。

模式五:跨链桥 / 元交易类签名
最后一种比较新:攻击者把签名包装成「跨链桥指令」或「元交易(meta-transaction)」。你以为自己签的是某条链的转账意图,对手却拿这个签名在另一条链或另一个合约调用代理执行。
识别要点:
- 弹窗里出现
bridge、relayer、forwarder、executeMetaTransaction等字样。 - 签名涉及多个链 ID 或一个奇怪的 chainId。
- 你想做的事在 UI 上看起来是 A 链转账,但底层数据指向 B 链。
普通用户基本无法在弹窗里完全解析这种签名,所以对元交易、跨链桥保持「官方桥+小额测试」原则最稳妥。
把五种模式做成一张速查表
| 模式 | 高频字段 | 一眼信号 |
|---|---|---|
| setApprovalForAll | operator, approved=true | NFT 场景 + 不认识的 operator |
| approve unlimited | spender, value=uint256.max | 巨额数字或「unlimited」 |
| Permit / EIP-2612 | spender, deadline, value | 「无 Gas 签个名就能继续」 |
| Seaport / Permit2 | 多 token / 多 amount | 一次签名覆盖多笔授权 |
| 跨链桥 / 元交易 | bridge, relayer, chainId | 涉及多链或代理执行 |
把这张表存在你常用的笔记里,比记任何一篇长文都实用。
一眼识破的三件小事
读完五种模式,落到日常操作上其实只有三件事:
- 永远在硬件钱包上看完 calldata,再点确认。即使读不懂,也至少能看出「金额异常」「合约名不熟」。
- 关闭盲签(blind signing)。任何要求开启盲签的网站,先标红再说。
- 任何**「先免费签个名」的话术都先怀疑**。免费签名也是签名。
钱包安全是个习惯问题,不是工具问题。我也写过 基础加密安全习惯,那篇是入口;这篇是把签名层面的细节单独拆出来。
把这套识别变成肌肉记忆
我自己的方法是:每次签名前给自己 5 秒钟。这 5 秒钟里大脑做三件事:
- 我此刻想做什么?
- 弹窗里出现的字段,是不是和我想做的事一一对应?
- spender 和金额,是不是最小必要范围?
5 秒钟不够防御所有钓鱼,但它能挡住绝大多数「冲动签」。绝大多数被抽干的钱包,都是因为没给自己留这 5 秒。
签名层面的攻击会继续升级,但这套自我提问的结构是稳的。把它装进肌肉记忆里,你就把自己从「2026 钓鱼受害人池」里搬走了一大半。
本文仅作科普,不构成投资建议。加密资产波动大、风险高——永远只投入你亏得起的钱。