紧急 EIP-7702 钱包恢复

作者分享了在使用 EIP-7702 后,因钱包被恶意合约劫持导致资金被盗的紧急情况,以及如何利用 Foundry 工具,通过生成签名授权并借助他人支付 gas 费用的方式,在不向被盗 EOA 发送资金的情况下重置 EOA 委托,恢复钱包控制权的详细步骤和经验教训,同时强调了预防措施和安全意识的重要性。

如何重置我被盗的 Delegation

介绍

加密钱包的目的是让你拥有完全的控制权 —— 但随着像 EIP-7702 这样的新功能的出现,意想不到的风险也随之而来。最近,我面临一个紧急情况:我的 EOAs (外部拥有账户) 被委派给了一个未知的合约,耗尽了我收到的资金。更糟糕的是,我无法将原生币发送到我的 EOAs 来支付 “撤销” 交易,因为任何发送的东西都会立即被盗。经过数小时的研究和反复试验,我找到了一种恢复控制的方法 —— 通过使用 EIP-7702 安全地重置我的 delegate。以下是我的历程,一步一步地解释给每一个面临类似危机的用户。

AI 生成的图像

发生了什么? (我的紧急情况)

昨晚,我的一个客户将一些原生币发送到他的合约的 owner EOA 钱包地址,并注意到 owner 的钱包表现不正常。他开始在 TG 上给我打电话和发短信,说收到的资金瞬间消失了。首先,由于除了我在 VSCode 中的项目之外,我没有在任何其他环境中使用过这些钱包,我怀疑他在一个恶意的 DApp 中做了一个错误的 approval 或交易,但他向我保证没有。经过一些区块链侦查,我发现这些钱包的 delegations 被劫持了 —— 有人使用 EIP-7702 的 set-code 功能将 EOAs 指向了一个恶意的智能合约。这意味着任何发送的原生币(或者任何资产)都会被重定向和盗走,在我采取行动之前。

因为我从未使用过 EIP7702,所以尝试传统的 “撤销” 交易是不可能的:我无法支付 gas,而且向 EOA 发送资金只会让攻击者变得富有。

作为第一步,我开始在 ETHSecurity telegram 频道中提问,在那里 DanielVFZeroSnacks 开始帮助我提供一些线索。那时我深入研究了 EIP-7702 的技术文档,希望能找到一条救援路线。

理解 EIP-7702 的 Delegation 机制

EIP-7702 引入了一个出色的(但如果被滥用也很危险)的概念:将你的普通钱包变成一个可编程的 “智能账户”。你可以将你的 EOA 委派给一个合约,使其表现为代理或可编程的 agent。这是通过签署一个授权,并让任何人(拥有 gas 费用)将其作为交易提交来完成的。

主要原则:

  • 只有钱包 owner 可以授权 delegate 变更 (通过使用他们的私钥签名)。
  • 任何人,而不仅仅是 owner,都可以提交 (并支付 gas) 交易。
  • 要 “撤销” delegation,授权的 delegate 地址被设置为零地址。

一步一步:我如何使用 Foundry 在没有原生币的情况下重置我的 EOA Delegate

突破来自于使用 Foundry 最新工具的三个清晰的步骤:

  1. 获取当前的钱包 Nonce

每个以太坊钱包为每笔交易使用一个 nonce —— 这必须是正确的才能授权 delegate 重置

cast nonce <YOUR_EOA_ADDRESS> --rpc-url <CHAIN_RPC>

它的作用

查询区块链以检索你钱包当前的交易 nonce。这是至关重要的 —— 每笔以太坊交易都必须使用下一个连续的 nonce。如果你使用错误的 nonce,你的 delegate 重置将会失败。

2. 生成签名授权

这一步是神奇的:使用你自己的 EOA 的私钥,你签署一个 “授权” 来重置 delegate。关键点是什么?你不需要自己支付 gas。

cast wallet sign-auth \
  --private-key <YOUR_EOA_PRIVATE_KEY> \
  --chain <CHAIN_ID> \
  --nonce <YOUR_CURRENT_NONCE> \
  0x0000000000000000000000000000000000000000

这将产生 signed_authorization_hex —— 你的加密 “撤销” 凭证。

3. (可选, Foundry 自己做这件事) RLP 编码

cast to-rlp '["0x89", "0x0b","0x06fc23ac00","0x09502f9000","0x0f4240", ... ]'

它的作用:

RLP (“递归长度前缀”) 是以太坊的序列化方法,用于以适合区块链的格式编码数据。我们探索这一点是因为 EIP-7702 交易(设置代码)作为复杂的结构化数据在链上转发。虽然 Foundry CLI 现在允许你通过标志跳过手动 RLP,但学习这种编码可以教会你:交易数据是如何为以太坊节点打包的。像 EIP-7702 这样的自定义交易是如何被协议转发和验证的。如果你需要与底层 API 交互或诊断原始交易失败,了解 RLP 是非常宝贵的。

4. 使用 Relayer 或任何 Gas 支付者提交交易

你现在可以使用任何有资金的钱包(朋友,gas relayer,或你的其他账户)来发送重置交易,包括签名授权:

cast send \
  --rpc-url <CHAIN_RPC> \
  --from <GAS_PAYER_ADDRESS> \
  --private-key <GAS_PAYER_PRIVATE_KEY> \
  --nonce <GAS_PAYER_NONCE> \
  --gas-limit <GAS_LIMIT> \ // ex: 1000000
  --gas-price <GAS_PRICE> \ // ex: 40000000000
  --priority-gas-price <PRIORITY_GAS_PRICE> \ // ex: 30000000000
  --value 0 \
  --auth <SIGNED_AUTHORIZATION_HEX> \
  --access-list [] \
  <YOUR_EOA_ADDRESS_TO_CHANGE_DELEGATION>

交易类型和所需字段可能因链和客户端而异 —— Foundry 通过现代版本中的 --auth 标志使它变得更容易 (我正在使用的 cast 版本是 1.2.3-stable)

它的作用:

将你的签名 “撤销” 授权作为 set code 交易广播到区块链。

关键点:

  • 允许任何钱包 (有 gas) 代表你发送交易。
  • 区块链检查你的授权,验证它是否真的来自你的 EOA,并将 delegate 重置为零地址。
  • 你的钱包重新获得原生 (非 delegated) 状态 —— 立即关闭漏洞窗口。

危险:因为你的私钥已经被泄露,即使在完成这些步骤后,你的 EOA 钱包也不再安全,你必须把它收起来。

5. (如果适用) 在多条链上发送

使用链的唯一链 ID 和 RPC,重复每条链的签名和发送步骤。

它的作用:

使你的钱包在所有可能被 delegated 或利用的区块链上都是安全的。在授权中将链 ID 设置为零有时可以实现跨链重置 (为你的客户端/工具确认这一点)。

幕后:为什么这行得通

  • EIP-7702 协议检查你的签名授权,如果有效 (匹配 nonce/链 ID/地址/签名),它将替换 delegated 合约。将 delegate 设置为零地址会立即杀死恶意的重定向。
  • 重要的是,重置交易的发送者不需要是你被泄露的 EOA。任何人都可以帮助支付费用并广播签名 “撤销” 授权。
  • 你可以使用 relayers、bot 服务或信任的朋友来恢复,而无需将资金存入你的受害者钱包。

特别建议:链无关的恢复

如果你的钱包在多个链上被泄露 (以太坊、Polygon 等),为每条链重复这个工作流程。对于 “所有链” 支持,一些客户端允许跨链撤销的链 ID 为 0 (虽然你需要分别在每条链上发送撤销 tx) —— 但始终使用当前的工具确认支持。

预防和我学到的

  • 定期审核你钱包的 delegation 状态。
  • 在没有验证它们的逻辑和意图的情况下,避免授权第三方应用程序或合约。
  • 如果发生泄露,不要惊慌 —— EIP-7702 支持链下授权,所以你的 owner 密钥仍然带来希望。
  • 将你的 EOA 的私钥保持离线,并在任何可疑事件后轮换 delegates。

最后的想法

EIP-7702 使钱包更灵活,但安全性必须始终与 power 保持同步。如果你的钱包被 delegated 给一个恶意的合约,使用你的私钥来签署一个重置授权,并让你信任的任何人帮助支付 gas。

通过保持冷静和坚持不懈,你可以战胜甚至严重的攻击 —— 并通过分享你的故事来帮助社区。我希望这个指南能为任何面临我所面临的情况的人节省无数的时间。

保持安全并快速恢复!

  • 原文链接: medium.com/@BahadorGh/em...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
BahadorGh
BahadorGh
江湖只有他的大名,没有他的介绍。