这篇博文披露了从合并到 Dencun 硬分叉期间一直存在的针对以太坊网络的威胁。
背景
在合并之前,为 RPC 通信设置了不同的消息大小限制,以保护客户端免受拒绝服务 (DOS) 攻击。这些限制适用于通过 HTTP 端点接收的消息,并被转移到引擎 API,该 API 在块生产期间连接执行层和共识层客户端方面发挥着至关重要的作用。由于引擎 API 参与区块生产,生产的区块有可能超出某些客户端的 RPC 大小限制,但仍保持在其他客户端可接受的范围内。
如果攻击者创建的消息超出了客户端最低设置的大小限制,同时仍遵守 Gas 限制要求,然后等待生成块,则可能会导致某些客户端认为该块的情况有效,而其他人则拒绝它,并发出 HTTP 错误代码“413:内容太大”。
影响
能够制作这些消息的攻击者将能够迫使大多数节点(=geth)拒绝少数节点会接受的块。这些区块将被分叉,提议者将错过奖励。
一开始我们认为只能使用构建器或客户端的修改版本来创建这些块。 Geth 对交易有 128KB 的内置限制,这意味着像正在讨论的交易这样的大交易不会最终出现在任何 geth 节点的交易池中。然而,仍然可以通过让具有更高限制的客户端提出该块以及请求验证该提议的更大块的 CL 来触发该限制。
我们提出了一个解决方案,暂时将所有客户端的 RPC 限制降低到最低值(5MB)。这将使该块无效,并且攻击者在网络中造成的混乱将非常有限,因为大多数节点都会拒绝他们的块。
然而,在 2 月 7 日,我们发现可以通过低于 128KB 限制且不超过 3000 万个 Gas 的一堆交易来创建一个达到 5MB 限制的区块。
这是一个更大的问题,因为我们意识到攻击者可以创建一堆高额交易并将其发送到网络。由于他支付的费用超过内存池中的其他所有人,因此每个节点(甚至 geth 节点)都会将攻击交易包含在其区块中,从而创建一个不会被大多数网络接受的区块,从而导致大量分叉(所有都被视为少数节点有效)并且链不断重组。
2 月 7 日晚些时候,我们得出结论:每个人提高 RPC 限制将是更安全的选择。
时间轴
- 2024-02-06 13:00:Toni (EF)、Pari (EF) 和 Justin (Besu) 尝试向网络提交特定研磨的交易。当进行快速压缩时,该事务最多可贡献 2.7 MB 的块。
- 2024-02-06 13:25:Pari 从本地 Geth 节点收到错误,尽管交易应该有效。
- 2024-02-06 15:14:Justin 成功将交易放入区块中并通过 Besu 客户端提交。
- 2024-02-06 20:46:Sam(EF)提醒 Pari(特别感谢 神秘龙神 在 X)上,Toni 和 Alex 关于某些 Sepolia 节点的挣扎。
- 2024-02-06 21:05:团队与 Geth 的 Marius 进行了仔细检查并确认了该错误。
- 2024-02-06 21:10:大家聚在一起调试
- 2024-02-07 23:40:我们决定将所有客户端的 RPC 请求限制限制为 5MB
- 2024-02-07 6:40:我们发现可能存在更大的问题,并且可以使用小于128KB大小的交易来执行攻击。
- 2024-02-07 10:00:我们决定为所有客户端增加 RPC 请求限制。
- 2024-02-07 21:00:修复已合并到 geth 中。
- 2024-02-09:Geth 发布
虽然 Geth 是唯一受此错误影响的客户端,但其他客户端也更新了其默认设置,以确保即使 Gas 限制增加,也能免受此攻击。客户端团队表示以下更新具有安全 RPC 限制:
Geth:v1.13.12
虚空思维:v1.25.4
相信:24.1.2
埃里贡:v2.58.0
雷斯:v0.1.0-alpha.18