非托管 · 只读

Permit 与 Permit2 钓鱼

一个 Permit 签名不花 gas,也从不显示为一笔交易,这恰恰让它成为钓鱼世界里布下盗刷局的最爱手段。下面讲讲它如何运作,以及如何加以防范。

免费扫描你的钱包 在 Telegram 上 24/7 全天候守护

仅需公开地址。无需连接钱包。无需任何签名。

Permit 签名是什么

EIP-2612 的 Permit 让你可以用一份链下签名来授权某个被授权方的代币额度,而不必发送一笔链上 approve 交易,被授权方稍后提交你的签名来激活它。Permit2 是一个被许多 dapp 共用的共享额度合约,在更大范围内做着同样的事,并覆盖那些本身不支持 Permit 的代币。

为什么它是钓鱼的绝佳切入点

签名不花 gas,在你签下的那一刻也不产生链上交易,所以它绝不会像一次 approve() 调用那样落进你钱包的活动记录里。它是一个 signTypedData 请求,而许多钱包至今仍把它显示为一条朴素、看着陌生的提示,很容易就点了过去,却没意识到自己正在授予什么。

钓鱼者如何收割它们

一个虚假的领取、mint 或空投页面,会要求你通过签名来“验证”或“领取”,而那其实是一份 Permit 或 Permit2 授权。因为在攻击者选择兑现它之前,链上不会有任何可见的事情发生,所以受害者可以今天签下,几天甚至几周后才被盗刷,这打破了人们在签名后立刻去查“刚刚是不是发生了什么?”的本能。

真正有效的防御

在签名之前,像读一笔交易那样,读清每一条 signTypedData 提示中的 Permit 或 Permit2 域(domain)和被授权方。Veriql 的 Guardian 会解码这些负载,并在一份对未经验证被授权方的无限额度 Permit2 签名上,在你批准之前抛出警告。因为一份签好的 permit 可能会潜伏不动,所以事后也要扫描你的地址,一个已激活的 Permit2 额度会像一个普通授权一样显示出来,并可以用同样的方式撤销。

常见问题

签一个 Permit 要花 gas 吗?

不要:签名本身是免费的。只有被授权方之后为兑现签名而进行的那次链上调用才花 gas,而那通常由提交它的人支付,未必是你。

我怎么知道自己是否已经签过一个?

扫描你的地址:一旦一个 Permit 或 Permit2 签名在链上被兑现,它就会变成代币存储里的一个普通额度,并会在扫描中像其他任何授权一样显示出来,无论是不是无限的。

相关内容