🔴 严重 | CVE-2026-54496 — ZEBRA is a Zcash node written entirely in Rust. Pr...
🔴 【深度分析】严重安全漏洞:CVE-2026-54496
CVSS 评分: 严重(9.3)🔴 状态: Deferred 发布时间: 2026-07-17
🔍 技术细节速览
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-54496 |
| CVSS 评分 | 9.3 🔴 |
| 严重程度 | 严重 |
| CVSS 向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L |
| CWE 分类 | CWE-345 |
| 发布时间 | 2026-07-17 |
| 最后更新 | 2026-07-17 |
| 状态 | Deferred |
| 数据来源 | security-advisories@github.com |
以下是根据您提供的 NVD 漏洞数据生成的深度安全分析文章。
⚠️ CVE-2026-54496:Zcash 零知识证明库中的完整性绕过漏洞(CVSS 9.3 严重)
CVSS 评分:9.3(严重)
CVSS 向量: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L
危害等级: 严重(可导致资金安全威胁)
漏洞概述
CVE-2026-54496 是 Zcash 生态中多个核心组件(包括 zebrad、halo2_gadgets、orchard、zcash_primitives 和 zcashd)中存在的一个 零知识证明电路约束缺失 漏洞。由于在 halo2_gadgets 的变量基标量乘法(Variable-base scalar multiplication) gadget 中未能对基点(base point)施加正确的 复制约束(copy constraint),恶意证明者可以构造一个绕过 diversified-address-integrity 检查的有效证明。该检查本应确保 pk_d、g_d、ivk、nullifier 和 spend validating key (ak) 与正在花费的 note 一致。一旦被利用,攻击者可以在不满足正确地址绑定的情况下伪造花费证明,可能导致 资金被盗或双花。
该漏洞影响所有基于 Halo2 证明系统的 Zcash 组件,需立即修复。
受影响组件与版本
| 组件 | 受影响的版本范围 | 修复版本 |
|---|---|---|
| zebrad(Zcash 节点 Rust 实现) | < 5.0.0 | 5.0.0 |
| halo2_gadgets(Halo2 证明系统电路库) | < 0.5.0 | 0.5.0 |
| orchard(Orchard 屏蔽池实现) | < 0.14.0 | 0.14.0 |
| zcash_primitives(Zcash 密码学原语) | < 0.28.0 | 0.28.0 |
| zcashd(Zcash 核心节点 C++ 实现) | < 6.20.0 | 6.20.0 |
所有使用上述库的应用程序或网络参与者(包括全节点、轻钱包、矿池)均受影响。
漏洞原理分析
背景:Orchard 屏蔽池与零知识证明
Zcash 的 Orchard 协议使用 Halo2 证明系统实现隐私交易。在花费一个 note 时,证明者需要生成一个 Orchard Action 证明,该证明包含一系列约束,其中之一是 diversified-address-integrity 检查:它强制证明者正确地绑定 pk_d(支付密钥)、g_d(多样化基点)、ivk(传入查看密钥)、nullifier(花费标记)和 ak(证明授权密钥)到同一个 note。该约束是防止伪造花费的关键。
漏洞根因:缺失复制约束
在 halo2_gadgets/src/ecc/chip/mul/incomplete.rs 中,实现了变量基标量乘法(用于计算 [sk] * B,其中 B 是基点)。为了电路效率,该模块使用了 assign_advice() 来分配基点(base point)的坐标值。然而,该分配没有通过复制约束(copy constraint)与电路外部实际输入的基点进行绑定。也就是说,证明者可以在证明中提供一个完全不同的基点值,而电路无法检测到该值与 witness 中声明的基点不一致。
具体而言,在零知识证明电路中,assign_advice() 仅将 witness 值放入建议列(advice column),但并未确保这个值必须等于某个固定公开输入或之前约束过的值。缺少 assign_fixed() 或通过 copy() 建立的约束链,使得攻击者可以在证明时自由选择基点。当 diversified-address-integrity 检查依赖该基点(g_d)时,攻击者可以构造一个恶意证明,使用伪造的基点使得检查通过,但实际上 spending key 与 note 并不匹配。
攻击向量
- 攻击前提:攻击者需要能够构造并提交恶意交易到 Zcash 网络(无需认证,CVSS 中 PR:N, UI:N)。
- 利用方式:攻击者在生成 Orchard Action 证明时,修改电路中基点的建议列值,使其与
g_d不一致,但同时调整其他 witness 值使得整个约束系统仍通过验证。 - 攻击复杂度:低(AC:L),因为漏洞本质上是缺少一个约束,无需复杂的密码学攻击。
- 影响范围:改变(S:C),攻击者可影响网络中其他用户的交易状态(例如双花他人的 note)。
影响评估
| 维度 | 评估 |
|---|---|
| 攻击向量(AV) | 网络(N):攻击者可通过远程提交恶意交易利用 |
| 攻击复杂度(AC) | 低(L):仅需修改电路 witness 值,无需哈希碰撞等计算 |
| 所需权限(PR) | 无(N):任何网络参与者均可构造交易 |
| 用户交互(UI) | 无(N):无需受害者操作 |
| 范围变更(S) | 是(C):攻击可影响其他用户的资产安全 |
| 机密性影响(C) | 无(N):不涉及信息泄露 |
| 完整性影响(I) | 高(H):可伪造花费证明,破坏交易完整性 |
| 可用性影响(A) | 低(L):可能间接导致网络拥堵或双花攻击,但非直接拒绝服务 |
实际威胁
- 资金盗窃:攻击者可构造花费任何一个 note 的证明,即使该 note 并不属于自己,从而窃取 ZEC。
- 双花攻击:在同一个 nullifier 下产生多个有效的证明。
- 全网共识分裂:若攻击者发布大量恶意交易,可能造成节点处理异常,但 Zcash 网络已采用交易共识规则,修补前节点会拒绝无效证明,故主要风险在于证明验证逻辑本身。
修复建议
立即更新至修复版本
所有运行 Zcash 节点或依赖上述库的应用应立即升级:
- zebrad: 升级至 5.0.0 或更高
- halo2_gadgets: 升级至 0.5.0 或更高
- orchard: 升级至 0.14.0 或更高
- zcash_primitives: 升级至 0.28.0 或更高
- zcashd: 升级至 6.20.0 或更高
临时缓解措施(若无法立即升级)
- 对于全节点运营者:可暂停接受未经验证的交易,或仅接受来自受信任来源的交易(但此缓解难以实现,因为交易来自网络)。
- 对于钱包开发者:在验证 Orchard Action 证明时,额外检查基点是否与 note 中的
g_d一致(虽然这不是电路级约束,但可作为热修复)。 - 对于矿工/提议者:避免打包任何不包含明确
g_d匹配声明的交易(需结合钱包实现)。
长期建议
- 在零知识电路设计中,对所有关键输入(特别是基点和公钥)必须使用复制约束或固定列(fixed column)以保证其值与公开预期一致。
- 建议审计所有 Halo2 电路中
assign_advice()的使用,确保没有遗漏复制约束。 - 安全公告已标记为“Deferred”,可能意味着官方正在评估最佳修复方式,但根据提供的信息,修复版本已经发布,建议优先应用。
参考资料
影响组件代码位置
halo2_gadgets/src/ecc/chip/mul/incomplete.rs中的assign_advice()使用CWE-345:数据真实性验证不足
https://cwe.mitre.org/data/definitions/345.html修复版本发布公告(假设存在于 GitHub Security Advisories)
- zebrad 5.0.0 发布说明
- halo2_gadgets 0.5.0 发布说明
- orchard 0.14.0 发布说明
- zcash_primitives 0.28.0 发布说明
- zcashd 6.20.0 发布说明
注:由于 NVD 数据未提供具体公告链接,以上为典型参考位置。实际公告请查阅 Zcash 官方 GitHub 仓库的 Releases 页面。
结论:CVE-2026-54496 是一个由零知识证明电路设计缺陷引起的严重漏洞,可导致完整性绕过和资金损失。所有 Zcash 网络参与者应立即升级至修复版本,并在后续开发中强化电路约束的审计流程。