7702授权使用chain_id为0:风险有多大

 / 
4

你签了一个 EIP-7702 授权,以为只在当前这条链上生效。如果 chainId 填的是 0,这笔授权可能在所有 EVM 链上都能重放,你每条链上的资产都可能被一次性掏空。

欧易OKX交易所
全球领先的加密货币平台,适合新手与进阶交易者
新手福利:注册即享20% 交易手续费减免!

先搞懂:chain_id=0 意味着什么

EIP-7702 的授权元组(authorization tuple)里有一个 chain_id 字段,用来指定委托在哪条链上生效。

chain_id 是具体链编号(比如以太坊主网 1、Polygon 137)时,委托只在这条链上有效。你到别的链上查,你的 EOA 的 code 字段还是空的,和没委托过一样。

但当 chain_id = 0 时,情况完全不一样。EIP-7702 规范把 chain_id = 0 定义为"非链特定的授权",意味着这个委托在所有 EVM 兼容链上都可能生效。一篇对 EIP-7702 钓鱼攻击的同行评审研究明确指出,这种"链无关"模式"使单一钓鱼事件能够跨链扩散"。

风险提醒:慢雾安全团队在 Pectra 升级上线后发出警告,明确提醒钱包提供商"提醒用户注意使用 chainID 为 0 的委托签名所带来的风险,这种签名可能在不同的链上被重放"。如果你的委托地址在链 B 上是恶意合约,你在链 A 签的 chain_id=0 授权,可能在链 B 上自动生效,而攻击者根本不需要你在链 B 上再签一次。

攻击路径还原:chain_id=0 如何让风险放大

我拆解一个典型的攻击流程,你对照看看:

第一步:诱骗签名 骗子在 Telegram、Discord 或钓鱼网站上诱导你签署一个看起来像是"登录验证"、"领取空投"或"跨链操作"的消息。这条消息背后其实是 EIP-7702 授权签名,且 chain_id 被设成了 0

第二步:单链部署,多链扩散 骗子在一条链(比如以太坊主网)上提交这笔授权交易,把你的钱包委托给了恶意合约。因为 chain_id = 0骗子可以在任意 EVM 链上再次提交这笔签名,重复部署同样的委托

第三步:资产清空 一旦委托生效,攻击者可以在任意链上调用你钱包的 transfertransferFrom 方法,转走该链上的 ETH、所有 ERC-20 代币以及 NFT。而且这个委托是持久的,除非你手动清除,否则不会失效

正确做法对比

做法说明
错误做法在陌生网站上签署任何内容不明的"授权"或"验证"消息,以为只在当前链有效。
正确做法1. 任何要求签署 EIP-7702 授权的不明消息,直接拒绝。2. 如果确实需要签署,检查签名消息的 chain_id 字段,拒绝所有 chain_id = 0 的授权。3. 仅通过官方钱包界面操作,不要签署钱包无法解析的原始哈希值。

欧易OKX交易所
全球领先的加密货币平台,适合新手与进阶交易者
新手福利:注册即享20% 交易手续费减免!

举一反三的排查清单

如果你不确定自己是否签署过 chain_id = 0 的授权,按以下步骤检查:

[做什么]:在所有你使用过的 EVM 链上检查委托状态,确认没有被恶意委托。

[怎么做]

  1. 逐链检查委托状态:打开每条 EVM 链的区块浏览器(Ethereum 用 Etherscan,Polygon 用 Polygonscan,Arbitrum 用 Arbiscan),输入你的钱包地址,查看"More Info"或"其他信息"区域的 "Authorizations (EIP-7702)" 字段。

  2. 如果发现异常委托地址:立即发送一笔新的 EIP-7702 类型交易(0x04),将委托地址指向 0x0000000000000000000000000000000000000000(零地址),清除委托状态。每条链需要单独操作,且需要该链的原生代币作为 Gas。

  3. 确认清除:在每条链的区块浏览器上确认"Authorizations"字段已消失或显示为零地址。

[完成标准]:所有你使用过的 EVM 链上的区块浏览器都显示"Authorizations"字段为空或零地址。

操作完成的校验方式: 在 Etherscan、Polygonscan、Arbiscan 等区块浏览器上逐一输入你的钱包地址,确认"Authorizations (EIP-7702)"栏目中没有异常委托地址。如果任何一条链上显示非零地址,立刻按上述步骤清除。

下一步动作: 如果以前签署过任何"跨链授权"或"多链签名"类的消息,现在就去所有你用过的 EVM 链的区块浏览器上查一下委托状态。这个习惯比你等出事了再问别人管用得多。