根据 GitHub 上的一项拉取请求,以太坊的共识客户端之一已合并了一项修复,针对的是验证者公钥缓存投毒攻击。该补丁解决了围绕 Gloas 分叉的一个漏洞,该漏洞可能导致部分节点因全局公钥缓存中的缺陷而拒绝有效签名。
Gloas 是即将到来的 Glamsterdam 升级的共识层部分。
三笔存款,两条链
问题出在一种机制上,即客户端将验证者公钥及其索引存储在一个全局缓存中。
从技术上讲,已经最终确定的存款在每条链上都应产生相同的验证者,不过在分叉边界处情况则有所不同。

攻击者需要在分叉前刚好有 3 笔待处理的存款。第一笔是对现有验证者的一笔大额充值。另外两笔是新密钥:A 具有构建者凭证,B 具有常规验证者凭证。
在规范链上,这笔充值消耗了余额周转,因此 A 和 B 在分叉之后才被处理。A 成为构建者,B 获得下一个验证者索引。
在攻击者的侧链上,被充值的验证者在分叉前被罚没,其存款被跳过。这导致 A 被更早处理,实质上占用了 B 的索引。
有缺陷的缓存假设两条链会产生相同的验证者,并将 A 的密钥全局导入。
在分叉时,受影响的节点会拒绝规范链上来自 B 的所有有效签名并分叉出去。
实际上,这种攻击有些复杂,因为它需要在恰当的时机进行罚没并拥有一条侧链,因此不太可能偶然发生。
修复改变了什么?
根据该 PR,修复方案是仅当密钥的激活资格纪元被最终确定后,才将其添加到全局公钥缓存中。
一个新的 HeadPubkeys 结构还将头部状态和全局缓存中的密钥结合起来,这样即使链在没有新块的情况下最终确定,节点也不会遗漏密钥。
其他共识客户端是否存在类似问题尚待确认。换句话说,随着 Glamsterdam 越来越近,开发者需要捕获的围绕分叉边界的边缘情况也越来越多。






