本文分析了以太坊 Pectra 升级中 EIP-7702 带来的新安全风险,重点关注了钓鱼合约的风险。同时,分析了 MetaMask 和 OKX 钱包对 EIP-7702 的支持,包括产品功能和源代码,特别是批量交易和 gas 赞助。最后,强调了 EIP-7702 在保护用户资产安全方面的重要性,并展望了其在用户体验方面的应用前景。
作者: GoPlus Security
Pectra 是以太坊的一次重大升级,集成了历史上最多的 EIP ——总共 11 个——极大地增强了验证者的灵活性、网络可扩展性和执行效率。随着以太坊主网 Pectra 硬分叉预计将于 2025 年 5 月 7 日激活,账户抽象的“终极形式”——EIP-7702——已正式可以使用!
引用 OKX 研究院的话:“如果任何基于 EVM 的 Web3 钱包不支持 EIP-7702,那么它实际上就放弃了整个以太坊生态系统及其用户。” 这充分说明了 EIP-7702 的重要性。
自从 5 月 7 日 Pectra 激活以来,出现了哪些新的安全风险,主流 Web3 钱包又实现了哪些与 EIP-7702 相关的功能?这些功能是如何工作的?让我们与 GoPlus 一起深入探讨。
根据 https://www.bundlebear.com/eip7702-authorized-contracts/all 的链上监控,数万个地址已经启用了智能账户功能。以下是前 10 名的 7702 Delegator:
然而,我们震惊地发现,在 ETH 上,授权排名靠前的Delegator地址——0x930fcc37d6042c79211ee18a02857cb1fd7f0d0b——是恶意的。
通过反编译合约代码,我们发现一旦用户授权了这个地址,任何转移到该地址的 ETH 都会自动重定向到欺诈地址:0x000085bad5b016e5448a530cb3d4840d2cfd15bc
重要安全提示:利用 EIP-7702 的炒作,创建恶意 Delegate 合约并通过网络钓鱼诱使用户授权的风险可能会首先激增。
GoPlus 提醒你:7702 授权通常发生在钱包应用或插件中。如果你被提示通过电子邮件或 URL 授权 7702,通常很危险——请谨慎操作。此外,在授权之前,你可以通过区块链浏览器检查合约是否开源。如果合约不是开源的,请格外警惕。
MetaMask 现在支持 EIP-7702。通过 MetaMask 发送 7702 交易有两种方式:
当你的钱包与 7702 支持的网络上的 DApp 交互时,MetaMask 会主动提示你切换到 7702 智能钱包。你也可以手动取消并恢复到非智能钱包状态。
重要安全提示:MetaMask 还提供了一个重要警告:MetaMask 只会在钱包内提示用户切换到智能账户。如果有人要求你通过电子邮件或 URL 在 MetaMask 之外签署任何协议以“升级”或“启用”智能账户功能,那绝对是网络钓鱼诈骗——不要相信!
合约地址 (EIP7702StatelessDeleGator): https://etherscan.io/address/0x63c0c19a282a1B52b07dD5a65b58948A07DAE32B#code
整个合约使用无状态设计编写,所有全局变量都声明为 constant 或 immutable,以解决同一地址使用不同 Delegator 时的潜在存储冲突。
该合约实现了批量交易功能,具有以下功能:
executeFromExecutor(ModeCode, bytes calldata): 此函数镜像 execute,但仅限于来自 DelegationManager 的调用。
这两个函数最终都会调用 ExecutionHelper.sol 合约中的 _execute 或 _tryExecute 来完成交易执行。
在 MetaMask Delegator 合约中,gas 赞助逻辑与 ERC-4337 向后兼容,主要包括 validateUserOp 和 _payPrefund 函数:
检查存款:用户检查 EntryPoint.balanceOf(账户地址) 以确认账户在 EntryPoint 中的存款是否足以支付预计的 gas 费用。
充值存款 (可选): 如果余额不足,用户可以调用 EntryPoint.depositTo 或 EIP7702DeleGatorCore.addDeposit 将 ETH 存入存款池。如果有 Paymaster 赞助,则可以跳过此步骤,因为 Paymaster 将在稍后处理充值。
构建和签署 UserOperation: 前端填写字段 (sender, callData, nonce, paymasterAndData 等),账户的离线签名逻辑 (_isValidSignature) 生成 userOp.signature。
广播 UserOperation: 完整的 UserOperation 通过 eth_sendUserOperation(userOp, entryPoint) 提交给任何 Bundler。
Bundler 打包并支付 Gas: Bundler 收集多个 UserOp 并调用 EntryPoint.handleOps(ops, beneficiary),预先支付链上 gas 费用。
EntryPoint 预检查和预付款:
计算 requiredPreFund → 确定 _missingAccountFunds。
调用账户的 validateUserOp():
验证签名 (_validateUserOpSignature)。
_payPrefund(_missingAccountFunds): 如果存款不足,账户会立即将差额转移到 EntryPoint。
如果 paymasterAndData 不为空,则调用 Paymaster 的 validatePaymasterUserOp() 进行赞助。
以上是 MetaMask 与 ERC-4337 兼容的 gas 赞助实现。如果不需要与 ERC-4337 向后兼容,则基于 EIP-7702 的 gas 赞助逻辑会更清晰、更简单,如下所示:
一般流程涉及“交易执行账户”离线签署交易,并将签名委托给“交易发送账户”。“交易发送账户”将交易内容和签名提交给 Delegator 合约,合约在链上验证签名。如果签名通过,则执行交易;否则,交易回滚。
源代码参考: https://book.getfoundry.sh/cheatcodes/sign-delegation
OKX 现在支持 EIP-7702。要通过 OKX 钱包发送 7702 交易,你可以使用最新版本的钱包插件或应用升级到 7702。点击“升级”将默认调用官方 OKX 钱包核心合约,函数选择器对应于 initialize() 函数。
源代码分析 合约地址 (WalletCore): https://etherscan.io/address/0x80296ff8d1ed46f8e3c7992664d13b833504c2bb#code
OKX 钱包核心为每个用户创建一个外部 Storage 合约来存储状态变量,从而解决同一地址使用不同 Delegator 时的潜在存储冲突。
该合约实现了批量交易功能,具有以下功能:
executeFromSelf: 只能由地址本身调用,不需要外部签名验证。
executeWithValidator: 只能由 Validator 合约调用,通过签名验证授权批量执行多笔交易。
executeFromExecutor: 根据会话机制授权执行,允许预先授权的 Session 执行者执行,支持在操作前后触发 Hook 插件。
以上所有函数最终都会调用 _batchCall 函数来执行交易。
EIP-7702 如何更好地保护用户资产安全
EIP-7702 升级赋予了地址更大的灵活性和业务能力。从我们对主流钱包源代码的分析中,我们看到批量交易和 gas 赞助现在得到了广泛支持。7702 与业务应用的集成才刚刚开始,未来将会出现更多的应用,这对于改善用户体验至关重要。
从用户安全的角度来看,EIP-7702 升级同样重要,为安全性提供了新的可能性。例如,当 Delegator 批量处理交易数据 (Excution[] calldata) 时,我们可以实施精确的风险控制规则,允许用户配置自定义授权管理、自定义黑名单/白名单,并设置交易期间转账的 token 类型和金额限制,从而实现强大的交易风险控制。
我们期待 EIP-7702 的采用和普及,使用户的资产能够更安全、更高效地流动!
- 原文链接: defihacklabs.substack.co...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!