Permit 签名漏洞(EIP-2612)|从离线签名到钓鱼防御完整解读
EIP-2612 Permit 是「ERC20 离线签名授权」——不上链不花 Gas 但效力等同 approve。本文按 6 个维度解读:Permit 工作原理、Permit2 与原版区别、为什么钓鱼者爱用、MetaMask 怎么显示、防御策略。
EIP-2612 Permit 漏洞是什么?直接答:Permit 是「ERC20 离线签名授权」标准——签名包含 owner、spender、value、deadline、v、r、s 七个参数。签名后任何人都能调 permit 函数把这个授权上链——不上链不花 Gas。漏洞核心:用户在不熟悉网站签 Permit 后,钓鱼者拿签名上链,直接调 transferFrom 转走资产。MetaMask 弹窗里 0xd505accf 是 Permit selector——看到立即警觉。
如果你识别完 Permit 钓鱼后想转资产到交易所,可顺路准备 币安官网 的实名账号,并用 币安官方App 看充币地址。下载入口在 下载页。
Permit 工作原理
A:Permit 把传统 approve 拆成「链下签名 + 链上调用 permit」两步。
| 步骤 | 链上 vs 链下 |
|---|---|
| 1. 用户对消息签名 | 链下 |
| 2. 把签名 + 消息内容发给对手方 | 链下(如发给 DEX 后端) |
| 3. 对手方调用 token 合约的 permit() 方法 | 链上(对手方付 Gas) |
| 4. permit() 验证签名后设置 allowance | 链上 |
| 5. 对手方立即调 transferFrom 转走资产 | 链上 |
A:Permit 设计初衷是「让用户不用付 Gas」——但被钓鱼者利用「不付 Gas 不上链 = 用户感觉只是签了个名」的心理。
Permit 签名结构
| 字段 | 含义 |
|---|---|
| owner | 你(要授权方) |
| spender | 接收授权方 |
| value | 授权额度 |
| deadline | 签名过期时间戳 |
| nonce | 防重放 |
| v, r, s | 签名分量 |
第 1 步:识别 MetaMask 弹窗里的 Permit
新版 MetaMask 显示「Sign Permit」字样——
| 显示 | 含义 |
|---|---|
| Sign Permit | EIP-2612 Permit |
| Sign Typed Data | EIP-712 结构化签名(可能是 Permit 也可能不是) |
| Sign Message | 普通消息签名 |
| Approve | 链上 approve(要花 Gas) |
calldata 4byte selector:
| selector | 方法 |
|---|---|
| 0xd505accf | permit |
| 0x36568abe | permit2 |
| 0x095ea7b3 | approve(链上) |
第 2 步:Permit 钓鱼的具体场景
| 场景 | 套路 |
|---|---|
| 假冒 OpenSea 客服 | Discord 私信「点这里验证 NFT」 |
| 仿冒空投网站 | 「领取 1000 USDT 空投」 |
| 仿冒 DEX | 与正版 DEX 域名相似 |
| 假 NFT 元数据链接 | NFT 卡片里的「点这里」链接 |
A:所有套路本质都是「让你签个看似无害的名」——而你以为是「登录」「验证」「领取」时实际是 Permit。
第 3 步:Permit2 与原版 Permit 的区别
Uniswap 团队推出的 Permit2:
| 维度 | EIP-2612 Permit | Permit2 |
|---|---|---|
| 适用 Token | 只有支持 EIP-2612 的(USDC 支持,USDT 不支持) | 任意 ERC20 |
| 中间合约 | 直接 ERC20 | Permit2 合约 |
| 必须先 approve 一次 | 否 | 是(给 Permit2 一次 Unlimited) |
| 后续 swap | 离线签 | 离线签 |
A:Permit2 用「先 approve Permit2 + 后续每次离线签」组合——一次链上 + 多次链下。风险集中在 Permit2 合约(已审计)。
第 4 步:哪些 Token 支持原版 Permit?
| Token | EIP-2612 支持 |
|---|---|
| USDC | 是 |
| DAI | 是(自定义版本) |
| USDT | 否(USDT 不支持 EIP-2612) |
| WETH | 否 |
| 大多数新 ERC20 | 是 |
A:USDT 钓鱼通常用「approve 链上签名」或「Permit2」——纯 EIP-2612 Permit 偷不走 USDT。
第 5 步:防御策略 5 条
| 策略 | 说明 |
|---|---|
| MetaMask 弹窗看 Method 字段 | 是 Sign Permit 立即警觉 |
| 不在不熟悉网站签任何 Typed Data | 永远不会损失 |
| 主钱包不连任何 DApp | 攻击面 = 0 |
| 用钱包扩展(Pocket Universe / Stelo / Wallet Guard) | 自动预警 Permit 钓鱼 |
| 硬件钱包 + 仔细看屏幕 | Ledger 屏幕显示完整 Permit 内容 |
第 6 步:被钓 Permit 后的紧急处置
A:Permit 一旦签了,攻击者有 deadline 时间窗能调用——最快立即撤销 + 转资产。
| 步骤 | 操作 | 时间 |
|---|---|---|
| 1 | 立即转所有可移资产到新钱包 | 5 分钟 |
| 2 | 在 Approval Checker 撤所有授权 | 视授权数 |
| 3 | 调用 increaseNonce 让原 Permit 失效(部分 Token 支持) | 1 笔 Gas |
| 4 | 等 deadline 过 | 视签的 deadline 而定 |
详见 Token approval 分类的钓鱼授权识别篇。
实战:拒绝 Permit 钓鱼的真实弹窗
例:你点了一个「免费 NFT mint」链接 → MetaMask 弹窗显示——
You are signing
This site is requesting access to your USDC
Method: Permit
Token: USDC
Spender: 0x... (陌生地址)
Value: 999999999999 (Unlimited)
Deadline: 1730000000 (远期)
A:任何一项不是预期的就立刻 Reject——Spender 是陌生地址 + Value 是 Unlimited + Deadline 远期 = 100% 钓鱼。
风险提示
Permit 是 EIP-2612 标准,未来会越来越普及——用户必须养成识别习惯。钱包警告功能能防一部分但不全——最终防线是用户自己慢一点签。
如果资产想出金,可借助 币安官网 走 C2C。
实操核对清单
- [ ] 已了解 Permit 离线签 + 链上调用机制
- [ ] 已记 0xd505accf selector
- [ ] MetaMask 弹窗 Method 字段每次看
- [ ] Spender 是陌生地址立即 Reject
- [ ] 装钱包安全扩展(Pocket Universe 等)
- [ ] 硬件钱包屏幕仔细看
一站式回顾
A:EIP-2612 Permit = ERC20 离线签名授权——便利但被钓鱼者爱用。核心 4 个识别:Method=Permit、Spender 看清楚、Value 看是不是 Unlimited、Deadline 看是不是合理。核心 1 个心法:不熟悉网站永远不签 Permit——因为损失等同 approve 链上签名。
如果想了解 ERC20 与 ERC721 授权机制差异,下一步建议看 ERC20 vs ERC721 授权机制篇。
常见问题
Permit 不上链不花 Gas,那钓鱼者怎么用?
A:钓鱼者拿到签名后自己付 Gas 上链调 permit + transferFrom——他们花一次 Gas 偷你的钱,划算。
我签了 Permit 但还没被攻击,能撤销吗?
A:部分 Token 可以。调用代币合约的 increaseNonce 或类似方法让旧签名 nonce 失效——新签名变得无效。或转走 Permit 涉及的 Token 让 transferFrom 失败。
Permit 比 approve 更危险吗?
A:钓鱼场景下更危险——因为「不上链不花 Gas」让用户感觉「只是签个名」。实际威力等同。
MetaMask 能识别 Permit 警告吗?
A:新版能。集成 Blockaid 等服务的 MetaMask 对已知钓鱼合约的 Permit 会显示红色警告。新出现的钓鱼可能滞后。
Permit2 比原版 Permit 安全吗?
A:差不多——Permit2 把风险集中在自身合约(已审计),原版 Permit 分散到每个 Token 合约。两者都依赖「用户细看签名」。
USDT 不支持 Permit,是不是安全?
A:USDT 不能被 Permit 钓鱼,但能被传统 approve / setApprovalForAll 钓鱼。安全程度不见得真的更高。
硬件钱包能防 Permit 吗?
A:能防一部分。Ledger / Trezor 屏幕显示完整 Permit 内容——用户能看清楚。但仍依赖用户自己审 Spender 是否预期。
文档发布于 2026-05-08,下次复测计划 2026-08-08(约每 90 天回访一次,确认 EIP-2612 Permit 标准、Permit2 普及与 USDC/USDT 支持状态未变)。