CVE-2025-30147 - Besu 上子群检查的离奇案例

Besu Ethereum 客户端在处理椭圆曲线 alt_bn128 的 EIP-196/EIP-197 预编译合约时存在共识问题,版本 25.2.2 受此影响。攻击者可以构造一个点,该点位于正确的子群中但实际上并不在曲线上,从而绕过验证。该问题已在版本 25.3.0 中得到修复。

真正的 Slim Shady

CVE-2025-30147 - Besu 上子群检查的奇怪案例

感谢 Marius Van Der Wijden 创建测试用例和状态测试,并帮助 Besu 团队确认问题。此外,还要感谢 Besu 团队、EF 安全团队和 Kevaundray Wedderburn。另外,感谢 Justin Traglia、Marius Van Der Wijden、Benedikt Wagner 和 Kevaundray Wedderburn 进行校对。如果你有任何其他问题/意见,请在 Twitter @asanso 上找到我

tl;dr: Besu Ethereum 执行客户端 25.2.2 版本存在与椭圆曲线 alt_bn128(又名 bn254)的 EIP-196/ EIP-197 预编译合约处理相关的共识问题。该问题已在 25.3.0 版本中修复。这里是完整的 CVE 报告。

注意: 本文的某些部分需要一些关于椭圆曲线(密码学)的知识。

介绍

bn254 曲线(也称为 alt_bn128)是以太坊中用于密码学操作的椭圆曲线。它支持诸如椭圆曲线密码学之类的操作,这对于各种以太坊功能至关重要。在 EIP-2537 和最近的 Pectra 版本之前,bn254 是以太坊虚拟机(EVM)支持的唯一配对曲线。EIP-196EIP-197 定义了用于在此曲线上进行高效计算的预编译合约。有关 bn254 的更多详细信息,你可以在这里阅读。

椭圆曲线密码学中的一个重大安全漏洞是无效曲线攻击,首次在论文 “Differential fault attacks on elliptic curve cryptosystems” 中提出。此攻击的目标是使用不在正确椭圆曲线上的点,从而导致密码协议中潜在的安全问题。对于非素数阶曲线(例如基于配对的密码学和 bn254 的 G2G_2G2​ 中出现的曲线),尤其重要的是,该点位于正确的子群中。如果该点不属于正确的子群,则可以操纵密码学操作,从而可能损害依赖椭圆曲线密码学的系统的安全性。

要检查点 P 在椭圆曲线密码学中是否有效,必须验证该点是否位于曲线上并且属于正确的子群。当点 P 来自不受信任或潜在的恶意来源时,这一点尤其重要,因为无效或专门制作的点可能导致安全漏洞。以下是演示此过程的伪代码:

## 用于检查点 P 是否有效的伪代码
def is_valid_point(P):
    if not is_on_curve(P): # 如果不在曲线上
        return False
    if not is_in_subgroup(P): # 如果不在子群中
        return False
    return True

子群成员检查

如上所述,在使用任何来源不明的点时,除了确认该点位于正确的曲线上之外,至关重要的是要验证该点是否属于正确的子群。对于 bn254,这仅对于 G2G_2G2​ 是必需的,因为 G1G_1G1​ 是素数阶。测试 GGG 中成员资格的简单方法是将一个点乘以 rrr,其中 rrr 是曲线的 余因子,它是曲线的阶与基点阶之间的比率。

然而,由于素数 rrr 的大小,这种方法在实践中可能会非常昂贵,特别是对于 G2G_2G2​。在 2021 年,Scott 提出了一种使用易于计算的 自同态对 BLS12 曲线进行更快子群成员资格测试的方法,从而使不同组的速度提高了 2 倍、4 倍和 4 倍(此技术是在 EIP-2537 中指定的,用于快速子群检查,如 本文档 中所述)。 后来,Dai 等人。推广了 Scott 的技术,使其适用于更广泛的曲线,包括 BN 曲线,从而减少了子群成员资格检查所需的操作次数。在某些情况下,该过程几乎是免费的。Koshelev 还介绍了一种用于非配对友好曲线使用 Tate 配对的方法,该方法最终进一步推广到配对友好曲线。

真正的 Slim Shady

正如你从本文末尾的时间线中看到的那样,我们收到了一个关于影响 Besu 上的 Pectra EIP-2537 的错误报告,该报告是通过 Pectra 审计竞赛 提交的。如果原始报告者想要更详细地介绍该问题,我们仅在此处对其进行简要介绍。本文专门关注 BN254 EIP-196/ EIP-197 漏洞

原始报告者观察到,在 Besu 中,is_in_subgroup 检查是在 is_on_curve 检查之前执行的。以下是一个示例,说明它可能是什么样子:

## 用于检查点 P 是否有效的伪代码
def is_valid_point(P):
    if not is_in_subgroup(P): # 如果不在子群中
        if not is_on_curve(P): # 如果不在曲线上
            return False
        return False
    return True

对上面 BLS 曲线上的问题感兴趣,我们决定看一下 BN 曲线的 Besu 代码。令我非常惊讶的是,我们发现了一些像这样的东西](https://github.com/hyperledger/besu-native/blob/6a414b4d1299b2e4c89ba7c6c3585e14bea4e230/gnark/gnark-jni/gnark-eip-196.go#L301):

## 用于检查点 P 是否有效的伪代码
def is_valid_point(P):
    if not is_in_subgroup(P): # 如果不在子群中
        return False
    return True

等等,什么?is_on_curve 检查在哪里?没错——没有一个!!!

现在,要可能绕过 is_valid_point 函数,你只需提供一个位于正确的子群内但实际上不在曲线上的点

但是等等——这甚至可能吗?

嗯,是的——但仅适用于特定的、精心选择的曲线。具体来说,如果两条曲线是 同构的,则它们共享相同的群结构,这意味着你可以从同构曲线制作一个通过子群检查但不位于目标曲线上的点。

很狡猾,对吧?

你说同构?

如果你对细节不感兴趣,请随意跳过本节——我们将深入探讨数学。

令 Fq\mathbb{F}_qFq​ 是一个特征不同于 2 和 3 的有限域,这意味着 q=pfq = p^fq=pf 对于某个素数 p≥5p \geq 5p≥5 和整数 f≥1f \geq 1f≥1。我们考虑由短 Weierstraß 方程给出的 Fq\mathbb{F}_qFq​ 上的椭圆曲线 EEE:

y2=x3+Ax+By^2 = x^3 + A x + B y2=x3+Ax+B

其中 AAA 和 BBB 是满足 4A3+27B2≠04A^3 + 27B^2 \neq 04A3+27B2=0 的常数。^[此条件确保曲线是非奇异的;如果违反此条件,则该方程将定义一个奇异点,该点缺少明确定义的切线,从而无法执行有意义的自加。在这种情况下,该对象在技术上不是椭圆曲线。]

曲线同构

如果两个椭圆曲线可以通过仿射变量更改相关联,则认为它们是同构的 ^[为了利用此处描述的漏洞,我们真正想要的是同构曲线,而不仅仅是同源曲线。]。此类变换保留了群结构,并确保点加法保持一致。可以证明,短 Weierstraß 形式的两条曲线之间唯一可能的变换采用以下形式:

(x,y)↦(e2x,e3y)(x, y) \mapsto (e^2 x, e^3 y)(x,y)↦(e2x,e3y)

对于某个非零 e∈Fqe \in \mathbb{F}_qe∈Fq​。将此变换应用于曲线公式会得到:

y2=x3+Ae4x+Be6y^2 = x^3 + A e^{4} x + B e^{6}y2=x3+Ae4x+Be6

曲线的 jjj 不变量定义为:

j=17284A34A3+27B2j = 1728 \frac{4A^3}{4A^3 + 27B^2}j=17284A3+27B24A3​

Fq\mathbb{F}_qFq​ 的每个元素都可以是可能的 jjj 不变量。^[BLS 和 BN 曲线的 j 不变量都等于 0,这非常特殊。] 当两条椭圆曲线共享相同的 jjj 不变量时,它们要么是同构的(如上所述),要么是彼此的扭曲。^[我们在此处省略了有关扭曲的讨论,因为它们与此案例无关。]

可利用性

此时,剩下的就是在一个精心选择的曲线上制作一个合适的点,瞧——游戏结束了

你可以使用此链接尝试测试向量,并享受旅程。

结论

在本文中,我们探讨了 Besu 在椭圆曲线检查实现中的漏洞。如果利用此缺陷,攻击者可能会制造一个通过子群成员资格检查但不位于实际曲线上的点。Besu 团队自 25.3.0 版本以来已解决了此问题。虽然该问题仅限于 Besu,并不影响其他客户端,但像这样的差异引发了对像以太坊这样的多客户端生态系统的重要担忧。客户端之间密码学检查的不匹配可能导致不同的行为——一个客户端接受另一个客户端拒绝的交易或区块。这种不一致性可能会危及共识并破坏对网络统一性的信任,尤其是在细微的错误在不同实现中未被注意到的情况下。此事件突出了为什么严格的测试和强大的安全实践绝对是必不可少的——尤其是在区块链系统中,即使是很小的密码学失误也可能波及到主要的系统性漏洞中。像 Pectra 审计竞赛这样的举措在主动发现这些问题方面发挥着至关重要的作用,并在它们投入生产之前。通过鼓励不同的眼睛审查代码,这些努力加强了生态系统的整体弹性。

时间线

  • 2025-03-15 – 通过 Pectra 审计竞赛 报告了影响 Besu 上的 Pectra EIP-2537 的错误。
  • 2025-03-17 – 发现 EIP-196/EIP-197 问题并报告给 Besu 团队。
  • 2025-03-17 – Marius Van Der Wijden 创建了一个测试用例和状态测试来重现该问题。
  • 2025-03-17 – Besu 团队迅速承认并修复了该问题。

上一篇文章 下一篇文章

  • 原文链接: blog.ethereum.org/2025/0...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
以太坊中文
以太坊中文
以太坊中文, 用中文传播以太坊的最新进展