你在Revoke.cash上把授权撤了,结果资产还是被转走——这通常不是因为授权没撤干净,而是你漏掉了另一种签名:Permit2 链下签名。这类签名本身不上链,你撤销授权时根本看不到它,但它依然有效,黑客随时可以拿着它调用 Permit2 合约转走你的币。
步骤 1:理解"链上授权撤销"和"链下签名"是两套系统
【做什么】 区分你撤销的是哪种权限,以及它覆盖不了什么。
【怎么做】 对照 Permit2 的双层设计,找到你漏掉的那一层。Permit2 由两个核心合约组成:
AllowanceTransfer(链上授权层):这就是你在Revoke.cash上看到的"授权额度"。你把代币的无限额度批给了 Permit2 合约,撤销授权时取消的就是这一层,在链上会留下一笔交易记录。
SignatureTransfer(链下签名转账层):这一层完全绕过授权额度。你签署一个 EIP-712 格式的 Permit2 签名,把"立即转账"的权限交给某个
spender,签名本身不会上链。
Revoke.cash 只能撤销第一层(AllowanceTransfer)的授权,对第二层(SignatureTransfer)的签名完全无效。一旦签名被黑客拿到,只要签名没过期,他们就能直接调用permitTransferFrom转走你的币,完全不依赖那层你撤销掉的授权。
高危风险:Permit2 签名是链下签的,黑客拿到后可以存起来等几个月再用,而你完全不知道。Scam Sniffer 记录的案例中,有用户在签署钓鱼签名 34 天后,16.2 万美元资产才被转走。你撤销授权时,这笔签名可能早就躺在黑客的服务器里了。
常见失败原因:很多人看到Revoke.cash上没有授权记录,就以为安全了,根本没意识到还有"签名"这个维度。Permit2 的 SignatureTransfer 模式正是设计来"不需要挂起授权"的——这意味着签名用一次就废,但在被用掉之前,它就是一颗定时炸弹,而任何授权扫描工具都扫不到它。
步骤 2:检查你是否签署过 Permit2 钓鱼签名
【做什么】 判断你的钱包是否曾经对黑客的 Permit2 签名"点了确认"。
【怎么做】 Permit2 签名通常包含这五个字段:
Owner:你的钱包地址Spender:被授权方(如果这个地址你不认识,就是钓鱼)Value:授权数量(通常为uint256.max无限额)Nonce:签名计数器Deadline:有效期
如果你在某个"空投检查"、"免费领取"或陌生网站点过签名确认,且钱包弹出的是"Permit2"或"Permit"类签名请求,那么你就签过。
链上查不到你签过这笔签名,因为它是离线签的。只有在黑客提交签名执行转账后,你才能在区块链上看到一笔permitTransferFrom调用记录。在此之前,任何工具都查不到它的存在。
高危风险:攻击者只需要你签一个"看起来像登录"的消息,就能拿到你的 Permit2 签名。你甚至不需要在那个网站花钱,也不需要授权任何额度,只要点了一下签名确认,风险就产生了。很多用户是在"检查空投资格"时被钓的。
步骤 3:撤销 Permit2 签名(有补救办法)
【做什么】 虽然没有工具能直接"撤回"一个已签署的 Permit2 签名,但你仍然可以阻断它被使用。
【怎么做】 即使签名存在,黑客要使用它必须满足两个条件:签名没过期 + 你的钱包里还有足够的资产。你的防御思路是"让条件不成立":
紧急止损(如果资产还在):立即把你钱包里的全部资产转到另一个你控制的安全钱包。黑客拿着的签名只能转走旧地址的资产,你清空了旧地址,签名就废了。这是最有效的阻断方式。
检查授权并撤销旧授权:虽然签名绕过授权,但 Permit2 签名执行时仍检查 AllowanceTransfer 层的额度。如果你把 Permit2 合约的授权额度从无限改为 0,签名调用时会因为额度不足而失败。这一步通过Revoke.cash完成。
等待签名过期:如果
deadline字段设了时间,签名到期后自动作废。但你不知道有效期还有多长,不建议干等。
操作完成的校验方式:资产转出后,在区块浏览器中确认旧地址余额已清零,且新地址资产完整。之后在Revoke.cash上确认 Permit2 合约的授权额度已归零。如果你不确定自己是否签署过钓鱼签名,也建议按以上步骤清理——宁可多花几步,别赌。



