DC空投核对台DROPCHECK
工具防骗自查空投教程链上科普关于注册 OKX

Permit2 与离线签名钓鱼:为什么“只是签个名”也能把币转走

Permit2 离线签名钓鱼示意:一个看似无害的签名弹窗,背后藏着 spender、额度与期限
“只是签个名,又不是转账”——很多人被掏空,就是从这句自我安慰开始的。

我见过太多这样的求助:“我明明没转账,就点了个签名,钱怎么就没了?”对方语气里全是不解——在他们的认知里,签名是无害的,转账才危险。这个误会,正是这几年最主流的一类钱包盗窃手法赖以生存的土壤。它的技术核心叫 Permit2,或者更广义地说,叫“离线签名授权”。今天我就把这件事从头到尾讲清楚:为什么一个不上链、不付 gas 的签名,能把你钱包里的币干干净净转走。

这篇属于防骗自查,不谈行情、不荐项目,只讲一件具体的事——认出并躲开借“签名”名义的授权钓鱼。它和我们之前那篇钱包签名的风险:授权、转账与盲签是最近的姊妹篇,那篇讲全景,这篇专挖 Permit2 这个最容易让人放松警惕的点。

授权交易 vs 离线签名,差在哪

要让别的合约(比如一个交易所、一个 DEX)动用你钱包里的代币,你得先“授权”。老办法叫 approve:这是一笔实实在在的上链交易,你要点“确认”,要付一笔 gas,钱包会弹出预估手续费,交易还会出现在区块浏览器的记录里。看得见、摸得着,出了事至少能追溯。

后来出现了一种更省事的方式:离线签名授权,也就是 Permit(对应标准 EIP-2612)和它的升级版 Permit2。它把“授权”这件事从“上链交易”变成了“链下签名”——你只需要签一个名,不上链、不付 gas、区块浏览器上当场看不到任何记录。设计初衷是好的:省一次交易、省一笔 gas、体验更顺。想了解这套标准的原始设计,可以看以太坊的官方提案(EIP-2612)。

说明

请记住一句话:“离线签名”省掉的是 gas 和上链这一步,省不掉“授权”这个本质。你签下去的那一刻,就已经把“允许某个地址动用你某种代币”这件事定下来了,剩下的只是有人拿这份签名去链上兑现而已。骗子最爱它,恰恰因为“不用付 gas、只是签个名”这句话,天然让人觉得安全。

一个签名为什么能把币转走

关键在于:你以为你在“签个名”,其实你在签一份结构化的授权数据。这条数据里写得清清楚楚——允许谁(spender,也就是被授权的地址)、能动用哪种代币、额度多大、有效期到什么时候(deadline)。你签名,等于给这份授权盖了章。

接下来的事和你没关系了,全由骗子完成。他拿到你的签名后,用自己的钱包、自己付 gas,去链上调用两步:先把你的签名连同授权数据一起提交上去(这一步叫 permit,等于替你把授权“激活”),紧接着调用 transferFrom,把你账户里的币按授权额度划到他自己名下。整个过程你的钱包不会再弹任何窗,因为你“同意”的动作,早在签名那一刻就完成了。

当心

这就是为什么“我没确认交易、没付 gas,所以我很安全”是个致命的错觉。gas 是骗子替你付的——因为对他来说,用几美元 gas 换走你几千甚至几万美元的资产,太划算了。你这边越是“无感”,他越是得手得干净。凡是弹出一个签名、内容你看不懂、却催你“快签一下就能领空投/完成验证”的,几乎都是奔着这一步来的。这类手法往往是钱包盗刮器(drainer)的标准配置,运作方式我们单独拆过(钱包盗刮器是怎么把币掏空的)。

弹窗里那串东西,到底该不该签?

与其事后追悔,不如养成签名前先过一遍的习惯。用这份清单把“谁被授权、额度多大、能不能撤销”逐项对照,看不懂就别签。

为什么用过 Uniswap 的人风险更高

先把话说明白:这里点名 Uniswap,不是说它不安全、更不是不推荐——它只是 Permit2 这套机制在市场上最主要的技术来源,用的人多,所以顺带把这个风险面铺得很广。Permit2 本是一个供多个应用共享的授权合约,很多主流 DApp 都接了它。

问题出在授权额度的默认值上。当你第一次通过这类应用做代币兑换、需要给 Permit2 授权时,常见的默认设置是接近“无限额度”——目的是让你以后再交易不用反复授权,体验更顺。代价是:只要你历史上给 Permit2 授过一次这种额度,这份授权就长期躺在链上,一直有效,除非你主动去撤销或调小它。

这意味着什么?意味着一旦骗子有办法诱导你签出一份针对 Permit2 的转移签名,或者利用你已存在的授权,暴露面就不是“这一次”,而是“这个钱包里所有你授过权的代币,长期都在射程内”。这也是为什么老玩家反而更该定期体检——用得越久,留在链上的“钥匙”越多。怎么系统地查和撤销这些授权,我写在了另一篇(授权检查与撤销)。

小提示

你可以随时用区块浏览器查自己的授权状况。在 Etherscan 上打开你的地址,找到 “Token Approvals” 板块,就能看到你对哪些合约、授了哪些代币、额度多大(etherscan.io 授权查询)。看到对 Permit2 的无限额度别慌,那是正常机制,但如果你近期不再用它,把额度撤掉更安心。

学会看懂一个签名请求

防住这一切的核心能力,其实就一条:看懂钱包弹出来的签名请求。危险的授权签名,多数走的是一个叫 eth_signTypedData 的方式(结构化数据签名)。它和“登录用的一句话签名”长得不一样,弹窗里通常能点开看到一组字段,你要盯的是这几个。

  • 域名/合约(domain):这份签名是发给谁的?是不是你正在用的那个应用、那个你认识的合约地址?对不上就是危险信号。
  • spender(被授权方):你把动用资产的权限交给了谁?如果是一个你完全不认识的陌生地址,坚决不签。
  • amount / allowed(额度):授权多少?出现一长串接近无限的数字,而你只是想做一笔小额操作,明显不对劲。
  • deadline(有效期):这份授权多久有效?期限特别长的,暴露窗口就特别大。

还要学会区分两类签名:一类是无害的登录签名,常见于交易所、社交类应用,内容是一段人能读懂的纯文字(比如“登录到某某应用”),里面没有金额、没有 spender,签了只用来证明“这地址是你”,不动任何资产;另一类就是上面说的授权划转签名,字段里带着 token、spender、金额、期限。一句话总结:签名里只要出现“钱的额度”和“被授权的地址”,就当危险签名对待。看不懂字段,就一律拒签——没有哪个正经操作,会因为你多看两眼、拒签一次而永久错过。MetaMask 官方也整理过怎么读这类签名请求(support.metamask.io)。

说明

把判断顺序记牢:先问“这个操作是不是我自己主动发起的”,再看“弹窗内容我看不看得懂”。两个都过关才签。如果是你点了个陌生链接、领个“空投”、做个“验证”,结果冷不丁弹出签名,哪怕它看起来人畜无害,也先关掉。安全机构的统计里,因授权与签名钓鱼造成的损失长期占据被盗资产的很大一块,而它们几乎都始于一次“随手一签”。

怎么防,中招了怎么办

先说防。没有一招管所有,但下面几条叠起来,能把风险压到很低。

  • 定期撤销授权。用 revoke.cash 连接钱包,定期查一遍,把不再使用的授权(尤其是对 Permit2 和陌生合约的)撤销掉(revoke.cash/zh)。这是性价比最高的一步。
  • 控制授权额度。能自定义额度时,别用默认的“无限”,按这次实际需要给个够用的数,用完了心里也踏实。
  • 用硬件钱包。硬件钱包会在设备小屏上再显示一次签名内容,多一道人工核对,能拦下不少盲签。
  • 钱包隔离。把大额资产放在一个几乎不参与交互的“金库”钱包里,日常撸空投、连陌生网站,只用一个装了小额资金的“隔离”钱包。就算隔离钱包被钓,损失也有限。

再说万一已经签了、发现不对。别停在原地纠结,按顺序做。

  • 第一步,立刻撤销授权。马上去 revoke.cash 撤销可疑授权,尤其是对 Permit2 和刚交互过的陌生合约,切断对方继续划转的通道。撤销要付一点 gas,别舍不得。
  • 第二步,转移剩余资产。把这个钱包里还没被转走的币,尽快转到一个全新的、干净的钱包。原钱包视作已污染,别再往里充值。
  • 第三步,绝不信“代追回”。事发后一定会有人私信你,说能帮你追回被盗资产、只要付点“解锁费”或再签个名——这全是二次诈骗,一分钱都别付,一个名都别再签。
当心

被盗后最危险的往往不是那次损失本身,而是接下来那波“救援”骗局。他们精准地利用你的慌乱,让你在补救的错觉里把剩下的也搭进去。真正能做的补救,只有你自己动手撤销授权、转移资产这两件,没有任何第三方能替你“找回”已经转走的链上资产。领空投、做验证时怎么从源头辨别真假入口,可以顺手看这篇(防假空投与授权钓鱼)与这篇(怎么辨别官方渠道)。行业里也有专门监测这类钓鱼签名的公开资料可作交叉参考(ScamSniffer),而钱包、交易所的官方帮助中心对可疑授权也有处置说明(okx.com/help)。

把这三件事变成肌肉记忆

撤销授权、辨认假空投、守住助记词——这三样做到位,绝大多数钱包盗窃都进不了门。花几分钟自查,比事后追悔强得多。

说到底,Permit2 本身是个中性的技术,方便了很多正经操作。真正把它变成凶器的,是“签名很安全”这个根深蒂固的错觉。你只要守住一条底线——不是自己主动发起的、内容看不懂的签名,一概不签——就等于把最主流的这类盗窃手法挡在了门外。想更全面地理解各种签名的风险,回头再读一遍那篇姊妹篇(钱包签名的风险:授权、转账与盲签),会有更深的体会。想从底层补一补钱包与授权的基础概念,以太坊基金会的中文文档也讲得干净(以太坊安全)。

陈默
空投核对台编辑组 · 编辑(笔名)

自己撸过空投也踩过假空投的坑,现在专门把“怎么安全参与”写清楚。文章只讲方法、不荐项目、不预测价格。

常见问题

我只是签了个名,没点确认交易,也没付 gas,为什么币还是没了?

因为 Permit、Permit2 这类“离线签名”本身就是一份授权。你签的那条数据里写着允许谁(spender)、能划走多少、到什么时候为止。骗子拿到这份签名后,用自己的钱包去链上调用,替你把授权“提交”上去,再一笔 transferFrom 就把币转走了。gas 是骗子付的,所以你这边看起来只是“签了个名”,没有任何上链动作,币却真的能被转走。

怎么区分“登录用的无害签名”和“会被转走币的危险签名”?

登录类签名(常见于交易所、社交应用)通常是一段人类能读懂的纯文字,里面没有金额、没有 spender、没有 deadline,签了只用来证明“这个地址是你”,不动任何资产。危险签名多是 eth_signTypedData 结构化数据,字段里出现 token、spender、amount 或 allowed、deadline、nonce 这些词,尤其点开能看到一个陌生合约地址和一个很大的数额。看不懂字段,就一律不签。

我用过 Uniswap,是不是已经暴露了?现在要做什么?

用过 Uniswap 不等于已被盗,但你很可能给 Permit2 合约留了一笔额度,而且常见默认是接近无限的额度,这笔额度会长期存在。建议去 revoke.cash 连接钱包,专门查一下对 Permit2 的授权,把不用的额度撤销或调小;同时养成习惯:只在自己主动发起交易、且弹窗内容看得懂时才签,其余一律拒绝。

已经签了钓鱼签名,钱还在,我该先做哪一步?

先别慌也别停在原地。第一步立刻去 revoke.cash 撤销可疑授权,尤其是对 Permit2 和刚交互过的陌生合约的授权,切断对方继续划转的通道;第二步把这个钱包里还没被转走的资产尽快转到一个全新的、干净的钱包。撤销要付一点 gas,别舍不得。最后记住:任何私信你“能帮你追回被盗资产”的,都是二次诈骗,绝不要再签任何东西或付任何“解锁费”。