本文揭露了一种针对MEV relay的新型解绑攻击,该攻击利用了RPC绕过gossip duplicate filter,并利用fork choice机制中的“latest block wins”特性。Lighthouse v4.1.0版本通过修改RPC区块的处理方式缓解了此问题。文章还讨论了更全面的解决方案,包括修改fork choice规范,以及client多样性的重要性。
这篇文章揭露了一种针对 MEV relay 的新型解包攻击,该攻击已通过 Lighthouse 最新版本 (v4.1.0) 的更改得到缓解。
解包攻击因 2023 年 4 月 2 日发生的一起备受瞩目的漏洞利用事件而备受关注,该事件为攻击者带来了超过 2000 万美元的收益。在阅读本文之前,我们建议读者熟悉 Flashbots 的原始披露 以及 Francesco D'Amato 和 Mike Neuder 的文章。
与其他解包攻击一样,RPC 解包攻击依赖于区块提议者愿意含糊其辞并被罚没。只有当这样做带来的利润机会超过罚没惩罚(通常约为 1 ETH)时,这才是合理的。正如我们在第一次解包攻击中所看到的那样,抢先交易夹层交易提供了这样的机会。
攻击者需要有一个活跃的验证者被提名称为一个区块。攻击按如下步骤进行:
攻击的关键是攻击者能够通过使用 RPC 绕过 gossip 重复项过滤器。一旦绕过此过滤器,他们就可以利用分叉选择的“最新区块获胜”行为,否则无法通过 gossip 到达该行为。
在某些方面,RPC 解包攻击不如 4 月 2 日执行的原始攻击那么严重。它需要几个巧合以及大量的基础设施投资。即:
P(aggregator|proposer)=1−(1−(1/32×16/274))n 要超过 50% 的概率,攻击者将需要 n=380 个验证者。
这些要求高于原始攻击的要求,但肯定并非遥不可及。尤其是具有讽刺意味的是,撰写本文时所需的 380 个验证者的成本约为 2250 万美元,非常接近攻击者在第一次攻击中提取的金额 😳。
值得庆幸的是,有一些力量在与攻击者作斗争,包括客户端多样性。
在步骤 (6) 中,我掩盖了共识客户端处理未知区块证明方式的差异。不同客户端的行为如下所示,其中 🔴 表示启用攻击的行为,🟢 表示缓解攻击的行为。
鉴于 Prysm 约占网络的 35%,这为攻击者达到将 block1 作为规范所需的 50% 证明权重提供了实质性障碍。
还有另一种特定于客户端的行为有所帮助——发送证明的时间点。这取决于所使用的验证者客户端:
如果我们假设大多数运行 Teku BN 的用户也运行 Teku VC(或 Vouch),那么这将是另外 10-17% 的验证者不支持攻击者的区块。乐观地看,与 Prysm 和其他 Vouch 验证者一起,这 >50% 的验证者集,并且可能足以使攻击非常困难,如果不是不可能的话。
即使我们认为在当前的客户端组成下攻击不太可能,但修复潜在的问题并提供更强的保证仍然是有益的。
从某种意义上说,攻击利用了当前共识规范中的两个含糊不清之处:
[IGNORE] 投票的区块 (aggregate.data.beacon_block_root) 已被看到(通过 gossip 和非 gossip 来源)(客户端可以对聚合进行排队以在检索到区块后进行处理)。
这句话中的_"MAY"_意味着所有客户端实现的现有行为都符合规范。这可以说是件好事,因为它让客户端可以自由选择适合他们的架构,并围绕该架构进行优化。
虽然可以通过指定导入 RPC 区块的规则来修补 RPC 解包漏洞(稍后会详细介绍),但这些规则感觉非常临时且随意。因此,我们认为在规范中强制执行这样的修复过于规范。
在我们看来,更有趣的含糊不清之处在于分叉选择中对含糊不清的处理。如攻击序列的步骤 (8) 中所述,攻击者的区块能够覆盖来自 slot 的原始提议,因为它到达得较晚。on_block 的相关部分如下所示:
## 如果区块及时,则添加提议者分数提升
if get_current_slot(store) == block.slot and is_before_attesting_interval:
store.proposer_boost_root = hash_tree_root(block)
只要区块来自当前 slot 并在证明间隔(4 秒)之前到达,它就有资格获得提升。没有检查同一 slot 的现有区块是否已经具有提升,也没有任何机制可以将提升奖励给多个区块。
在这种情况下,规范对于几个含糊不清的区块中的哪个成为 head 有些矛盾。从网络健康的角度来看,这并不重要,只要恶意提议者被罚没(他们会的)。只有在考虑下游效应时,才希望“选择一个获胜者”,即选择 relay 的区块而不是攻击者的区块。
这类似于编译器设计中的 未定义行为,其中规范中的差距与实现细节相结合可能会导致令人惊讶且有时会造成损害的结果。
我们认为修改分叉选择规范可能是有益的,以便只有在给定 slot 中处理的第一个区块才有资格获得提议者提升。首选第一个区块是很直观的,与积极的证明策略一致,并且可以最终修复 RPC 解包漏洞。解包将减少到传播竞赛,目前的想法表明这是我们所能期望的最好的结果。
对规范的单行更改将是:
## 如果区块及时,则添加提议者分数提升
if store.proposer_boost_root == Root() and get_current_slot(store) == block.slot and is_before_attesting_interval:
store.proposer_boost_root = hash_tree_root(block)
我们计划通过此更改向共识规范打开一个 pull request,以便可以对其进行讨论,并可能在没有硬分叉的情况下推出(有待进一步分析)。
或者,可以通过 Francesco 和 Mike 的文章 中描述的headlock 协议来缓解攻击以及其他解包攻击。还有关于减少含糊不清区块的权重的讨论,以便重新组织它们并确保跳过该 slot。
修改分叉选择是一个微妙的过程,我们不希望仓促进行。因此,在 4 月 6 日发现漏洞后的几天里,我们设计了一种基于 RPC 区块处理的临时缓解措施,并在 Lighthouse 中实现了它。
缓解措施改变了下载后 RPC 区块的处理方式。Lighthouse 首先检查以下两个附加条件,而不是立即应用它们:
如果这两个问题的答案都是是,那么 Lighthouse 会对该区块进行排队并在 4 秒后重新处理它。这确保了通过 RPC 到达的含糊不清的区块永远不会获得提议者提升。
我们与其他易受攻击的客户端(Teku 和 Nimbus)讨论了这个补丁,并共同决定不值得在 Lighthouse 之外实现它。首先,因为修补 Lighthouse 已经覆盖了很大一部分验证器集(约 35%)。其次,因为一些验证者客户端已经缓解了该漏洞。我们希望 Teku 和 Nimbus 将通过更全面的分叉选择修复进行修补。与此同时,他们的当前行为不会对任一客户端或 MEV relay/搜索器的用户构成风险。
我们已经披露了一种解包攻击的变体,该攻击利用了通过 RPC 接收的含糊不清的区块的处理。此漏洞已在 Prysm、Teku 和最新版本的 Lighthouse 中得到缓解,并且不再可在主网上利用。
我们计划通过对分叉选择进行微小更改来寻求更全面的缓解措施,希望可以在 Deneb 之前推出。
感谢 Potuz、Mike Neuder、DappLion、Jimmy Chen 和 Paul Hauner 审查此帖子,以及 Jim McDonald 提供有关 Vouch 行为的建议。感谢 Age Manning 提供有关通过 RPC 执行攻击的可能性以及其他客户端团队的及时关注的建议。
- 原文链接: blog.sigmaprime.io/mev-u...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!