在以太坊生态中,有两种签名方式:链上交易签名和链下消息签名。链下签名不需要广播到区块链上,也不消耗 Gas 费。它最初被设计用于优化用户体验(如 EIP-2612 permit 签名),但攻击者把它变成了最危险的攻击工具之一。

签名诈骗的核心逻辑:攻击者诱导你签署一个看似无害的链下消息,但这个消息实际上是一笔授权交易。你签了名之后,攻击者可以在未来任何时间用它来转移你的资产。

核心要点: 链下签名(off-chain signature)不需要 Gas 费,不需要广播交易,但它可以被攻击者在链上调用执行。一个签名就能授权攻击者转移你钱包里的所有代币。核心防御:不在不明网站签署任何消息,签名前仔细检查消息内容,尤其是 approvepermittransferFrom 等关键词。

变体一:假登录签名

最常见的签名诈骗。你打开一个钓鱼网站,它看起来跟正常的 DeFi 应用一样。你点击”连接钱包”,MetaMask 弹出签名请求。网站告诉你这是”登录验证”或”签名认证”。

但实际上,这个签名请求里包含的不是登录消息,而是一个 permit 类型的签名。签名之后,攻击者获得了你的代币授权。

这种诈骗的危险在于,签名请求的原始数据是十六进制编码的。很多用户看不懂 0x08c379a0... 这样的数据,直接就点了确认。

识别方法: 正常的登录签名(SIWE - Sign-In with Ethereum)会在签名消息的纯文本里显示域名和时间戳。如果你看到的签名请求不是纯文本格式,而是一堆十六进制数据,立即拒绝。如果你无法理解签名内容,就不要签名。

变体二:SetApprovalForAll 钓鱼

这种攻击主要针对 NFT 持有者。钓鱼网站以”免费铸造 NFT”或”领取空投”为诱饵,在你连接钱包后弹出 SetApprovalForAll 的签名请求。

SetApprovalForAllERC-721/ERC-1155 标准的函数,它的作用是将你某个合约的全部 NFT 操作权限授予指定地址。一旦签署,攻击者就可以转走你该系列的所有 NFT。

很多用户不知道 SetApprovalForAll 的含义,看到签名请求里显示的合约地址和 tokenId 信息就直接确认了。结果蓝筹 NFT 被清空。

识别方法: 如果你在做”铸造 NFT”或”领取空投”时看到 setApprovalForAllApprovalForAll 字样,立即停止。正常的 NFT 铸造只需要支付 Gas 费和铸造费,不需要授权。

变体三:Permit2 钓鱼

Permit2 是 Uniswap 推出的通用授权协议,它允许用户通过一个签名批量授权多个代币。攻击者利用 Permit2 的这种特性,只需用户签一个名,就能获得钱包里所有 ERC-20 代币的操作权限。

据公开报道,2024 年发生了多起利用 Permit2 的钓鱼攻击,受害者损失数百万美元的 WBTC 和 ETH。

识别方法: 如果签名请求中包含 Permit2SpendingCapPermitBatch 等字样,而且你不是在 Uniswap 等已知平台上进行操作,立即拒绝。Permit2 的签名请求应该在已知的、信任的应用中才出现。

变体四:ETH 签名钓鱼

一些攻击者利用 eth_sign(而非 personal_signsignTypedData_v4)来实施攻击。eth_sign 直接对原始哈希值签名,不显示任何人类可读内容。MetaMask 等钱包现在会对此类请求发出警告,但仍有用户忽视警告。

识别方法: 如果你的钱包弹出类似”警告:此请求可能不安全”的提示,绝对不要签名。钱包的安全警告不是装饰,是真正的防线。

变体五:转账签名伪装

攻击者把一笔转账交易的描述伪装成”领取奖励”或”验证钱包”。实际上,签名内容是你向攻击者地址转账代币的授权。你确认签名后,代币直接被转走。

这种变体在 2024 年下半年特别流行,攻击者利用 Gas 补偿机制让用户以为自己在领取空投。

识别方法: 每次签名前,看清楚交易摘要。如果摘要显示”Transfer [代币名称] to [地址]“,而你本意是”领取”东西,这就是攻击。

签名安全的核心原则

防范签名诈骗只有一条铁律:不在你无法 100% 信任的网站上签署任何消息。

补充几条实操建议:

看不懂就不签。 如果签名请求的内容你看不懂,特别是如果它显示的是十六进制数据而不是人类可读的文本,拒绝签名。宁可错过一个机会,也不要冒险。

检查钱包安全警告。 现代钱包会对高风险操作发出警告(如 MetaMask 的红色提示框)。这些警告是基于合约地址的黑名单/白名单检测,值得重视。

使用硬件钱包。 硬件钱包的屏幕会显示签名请求的原始内容,给你最后一个确认机会。在 Ledger 或 Trezor 的小屏幕上,你可以看到真实的合约调用数据。

定期检查和撤销授权。 使用 revoke.cash 或 Etherscan 的 Token Approval Checker 检查你的钱包有哪些授权,撤销不认识或不必要的。

签名的不可逆性是它最大的风险。一旦你签署了恶意消息,攻击者可以持有这个签名直到最佳时机才执行。你可能完全不知道自己已经签署了危险的东西,直到资产消失的那一刻。