Zcash Zebra 区块验证器低估 Coinbase 和 P2SH 签名数漏洞 漏洞概述 Zebra 的区块验证器低估了针对 20000 签名限制( )的透明签名操作,允许接受 因 而拒绝的区块。生产此类区块的矿工可以分裂网络:Zebra 节点遵循违规链,而 节点不遵循。 存在两种低估情况: 1. Coinbase 隐藏遗留签名: 的 包含 coinbase 输入的 。Zebra 的 impl 跳过了 coinbase 输入,因此最多 98 个签名(100 字节 coinbase 脚本长度限制,减去前缀)可以隐藏在 coinbase 中而不计入区块限制。 2. 聚合 P2SH 签名: 的 解析每个 P2SH 输入的赎回脚本( )并将这些签名加到区块总签名中。检查是逐块而非逐交易,并且该限制适用于所有矿工,无论其是否包含违规交易——矿工只需包含足够的 P2SH 花费交易,其赎回脚本的签名总数超过 20000 个。Zebra 仅在内存接受路径(用于 ZIP-317 权重)上计算 P2SH 签名,并且未在区块验证期间累积它们。一个聚合赎回脚本签名超过 20000 的区块(例如,1334 个 P2SH 花费 × 15 个签名 = 20010)将被 Zebra 接受并被 拒绝。 影响范围 受影响版本:< 4.4.0 修复版本:4.4.0 严重程度:Critical CVE ID:CVE-2026-44498 修复方案 在 Zebra 的下一个版本中修复。 建议依赖 Zebra 进行共识的用户升级。 参考链接 常量从 Bitcoin 继承自 Zcash 协议规范 §7.6 catch-all "其他规则从 Bitcoin 继承",在 中跟踪以进行显式文档记录。 :https://github.com/zcash/zcash/blob/v4.1.0/src/main.cpp#L826-L838 :https://github.com/zcash/zcash/blob/v4.1.0/src/main.cpp#L840-L852 聚合每个交易的签名并与 进行比较。