作者分享了在使用 EIP-7702 后,因钱包被恶意合约劫持导致资金被盗的紧急情况,以及如何利用 Foundry 工具,通过生成签名授权并借助他人支付 gas 费用的方式,在不向被盗 EOA 发送资金的情况下重置 EOA 委托,恢复钱包控制权的详细步骤和经验教训,同时强调了预防措施和安全意识的重要性。
加密钱包的目的是让你拥有完全的控制权 —— 但随着像 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 频道中提问,在那里 DanielVF 和 ZeroSnacks 开始帮助我提供一些线索。那时我深入研究了 EIP-7702 的技术文档,希望能找到一条救援路线。
EIP-7702 引入了一个出色的(但如果被滥用也很危险)的概念:将你的普通钱包变成一个可编程的 “智能账户”。你可以将你的 EOA 委派给一个合约,使其表现为代理或可编程的 agent。这是通过签署一个授权,并让任何人(拥有 gas 费用)将其作为交易提交来完成的。
主要原则:
突破来自于使用 Foundry 最新工具的三个清晰的步骤:
每个以太坊钱包为每笔交易使用一个 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 交易广播到区块链。
关键点:
危险:因为你的私钥已经被泄露,即使在完成这些步骤后,你的 EOA 钱包也不再安全,你必须把它收起来。
5. (如果适用) 在多条链上发送
使用链的唯一链 ID 和 RPC,重复每条链的签名和发送步骤。
它的作用:
使你的钱包在所有可能被 delegated 或利用的区块链上都是安全的。在授权中将链 ID 设置为零有时可以实现跨链重置 (为你的客户端/工具确认这一点)。
如果你的钱包在多个链上被泄露 (以太坊、Polygon 等),为每条链重复这个工作流程。对于 “所有链” 支持,一些客户端允许跨链撤销的链 ID 为 0 (虽然你需要分别在每条链上发送撤销 tx) —— 但始终使用当前的工具确认支持。
EIP-7702 使钱包更灵活,但安全性必须始终与 power 保持同步。如果你的钱包被 delegated 给一个恶意的合约,使用你的私钥来签署一个重置授权,并让你信任的任何人帮助支付 gas。
通过保持冷静和坚持不懈,你可以战胜甚至严重的攻击 —— 并通过分享你的故事来帮助社区。我希望这个指南能为任何面临我所面临的情况的人节省无数的时间。
保持安全并快速恢复!
- 原文链接: medium.com/@BahadorGh/em...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!