答案先抛

三个原因叠加让 Permit 成为高风险签名:第一,签名是离链的,钱包弹窗只显示一段 JSON-like 的结构化数据,没有红色警告;第二,用户不需要付 gas,心理上认为"这不是交易";第三,链上没有任何记录,直到攻击者把它打包提交那一刻,你完全察觉不到。等你看到 Etherscan 上的转账,钱已经走了。

为什么

Permit 的初衷是好的。EIP-2612 在 2020 年提出,为了解决 ERC-20 授权要分两步(先 approve、再 transfer)、用户要付两次 gas 的问题。设计是:用户签一条离链消息授权 dApp 在某个时间之前替自己提交一次 transfer,dApp 帮用户付 gas、用户少签一次。USDC、DAI、UNI 这些主流代币都支持 Permit。

问题在于这条离链消息的可读性极差。钱包弹窗里你看到的是这种东西:

{
  "types": {
    "Permit": [
      {"name": "owner", "type": "address"},
      {"name": "spender", "type": "address"},
      {"name": "value", "type": "uint256"},
      {"name": "deadline", "type": "uint256"}
    ]
  },
  "domain": {"name": "USD Coin", "chainId": 1, ...},
  "message": {
    "owner": "0xYourAddress",
    "spender": "0xAttackerContract",
    "value": "115792089237316195423570985008687907853269984665640564039457584007913129639935",
    "deadline": 1799999999
  }
}

普通用户看到这种弹窗的反应是"看不懂但应该不是转账,先签"。实际上 spender 是攻击者地址、value 是 2^256-1(无限),deadline 是几年后。签完以后攻击者可以在几年之内的任意时刻提交一笔交易,把你钱包里所有 USDC 划走。

这种攻击在 2023 年到 2025 年间成为以太坊主网损失最大的一类钓鱼。Inferno Drainer、Pink Drainer 这些钓鱼服务商把 Permit 钓鱼做成了 SaaS。

常见误解

"没花 gas 就不算交易"。错。Permit 的本质是把交易拆成"签名"和"提交"两步,签名你做、提交攻击者做。从链上视角看依然是一笔标准 transfer,只是发起者不是你而已。

"我的 USDC 没被 approve 过应该安全"。错。这正是 Permit 危险的地方 —— 它不需要你先 approve,签名本身就是授权 + 转账的合体。Etherscan 上的 allowance 查询看不出你签过 Permit,普通的 Revoke.cash 也撤不掉一条还没被提交的 Permit 签名。

"硬件钱包能挡住"。一半。硬件钱包会要求物理按键确认,比软钱包多一道防线,但屏幕上显示的还是那段难懂的 JSON。如果你按下确认,硬件钱包不会拦你。真正的硬件防御是 Ledger 的"Clear Signing" 功能 —— 它会把 Permit 解码成"授权 X 代币给 Y 地址,金额 Z"的可读文字,但这功能需要每个代币单独适配,覆盖面有限。

延伸阅读

Permit 词条详解:EIP-2612 Permit。授权过期问题:钱包授权过期了会自动撤销吗?。完整的钓鱼图谱:钓鱼诈骗全图谱 · 2026 版