以太坊(ETH)重要漏洞或已修复

ETH
公钥缓存投毒验证者安全漏洞修复共识客户端GlamsterdamGloas分叉以太坊
16 小时前来源: u.today
以太坊(ETH)重要漏洞或已修复

根据 GitHub 上的一项拉取请求,以太坊的共识客户端之一已合并了一项修复,针对的是验证者公钥缓存投毒攻击。该补丁解决了围绕 Gloas 分叉的一个漏洞,该漏洞可能导致部分节点因全局公钥缓存中的缺陷而拒绝有效签名。

Gloas 是即将到来的 Glamsterdam 升级的共识层部分。

三笔存款,两条链

问题出在一种机制上,即客户端将验证者公钥及其索引存储在一个全局缓存中。

从技术上讲,已经最终确定的存款在每条链上都应产生相同的验证者,不过在分叉边界处情况则有所不同。

文章图片
来源:Github

攻击者需要在分叉前刚好有 3 笔待处理的存款。第一笔是对现有验证者的一笔大额充值。另外两笔是新密钥:A 具有构建者凭证,B 具有常规验证者凭证。

在规范链上,这笔充值消耗了余额周转,因此 A 和 B 在分叉之后才被处理。A 成为构建者,B 获得下一个验证者索引。

在攻击者的侧链上,被充值的验证者在分叉前被罚没,其存款被跳过。这导致 A 被更早处理,实质上占用了 B 的索引。

有缺陷的缓存假设两条链会产生相同的验证者,并将 A 的密钥全局导入。

在分叉时,受影响的节点会拒绝规范链上来自 B 的所有有效签名并分叉出去。

实际上,这种攻击有些复杂,因为它需要在恰当的时机进行罚没并拥有一条侧链,因此不太可能偶然发生。

修复改变了什么?

根据该 PR,修复方案是仅当密钥的激活资格纪元被最终确定后,才将其添加到全局公钥缓存中。

一个新的 HeadPubkeys 结构还将头部状态和全局缓存中的密钥结合起来,这样即使链在没有新块的情况下最终确定,节点也不会遗漏密钥。

其他共识客户端是否存在类似问题尚待确认。换句话说,随着 Glamsterdam 越来越近,开发者需要捕获的围绕分叉边界的边缘情况也越来越多。