跳到主要内容

Zcash Sprout 漏洞修复:6 年隐患的发现和解决

2026 年 3 月,安全研究员 Alex "Scalar" Sol 发现 zcashd 节点在处理 Sprout 池交易时跳过了证明验证——这个问题从 v3.1.0 起存在了将近 6 年。漏洞已在 v6.12.0 版本中修复,Sprout 池内约 25,424 枚 ZEC(当时价值约 650 万美元)未遭受任何损失。

漏洞的技术细节

Sprout 是 Zcash 2016 年上线时的第一代屏蔽池。虽然 2022 年 Orchard 上线后已停止接受新存入,但池内仍保留着约 25,424 枚 ZEC。

问题出在 zcashd 的区块验证逻辑上。从 v3.1.0 版本起,当节点连接新区块时,涉及 Sprout 池的交易会跳过零知识证明验证。也就是说,如果有矿工构造一笔假的 Sprout 交易放进区块,网络节点不会检查这笔交易的证明是否合法。

攻击者理论上可以利用这一点伪造 Sprout 交易,凭空提取池内的 ZEC。不过实际利用并不简单——攻击者需要控制挖矿算力来把恶意区块打包上链。

发现和修复过程

时间事件
3 月 23 日Alex Sol 发现漏洞并向开发团队报告
3 月 24 日ZODL 工程师 Jack "str4d" Grigg 编写补丁
3 月 25 日zcashd v6.12.0 发布,Luxor 矿池率先部署
3 月 26 日F2Pool、ViaBTC、AntPool 完成部署

从报告到主要矿池全部更新,前后不到 72 小时。Alex Sol 获得了 200 ZEC 的漏洞赏金(约 51,000 美元)。

为什么 6 年没被发现?

这个问题值得思考。Sprout 池早在 2022 年就停止接收新资金,日常交易量几乎为零。开发团队和审计人员的注意力集中在活跃的 Orchard 和 Sapling 协议上,Sprout 的验证代码成了一个被遗忘的角落。

代码审计有天然的盲区:越是"已废弃"的模块,越容易被忽略——但只要里面还有资金,安全风险就不会消失。

对 Zcash 安全性的意义

这次事件有两面性。

好的一面: 漏洞被白帽研究员发现并负责任地披露,修复速度很快,没有造成实际损失。矿池的响应速度也值得肯定——72 小时内覆盖了大部分算力。

需要反思的一面: 一个影响 650 万美元资产安全的漏洞存在了 6 年才被发现。这暴露了审计流程对遗留代码覆盖不足的问题。ZODL 和 Zcash Foundation 后续可能需要对 zcashd 中其他历史模块做一轮全面检查。

Sprout 池的未来

Sprout 池已经不接受新存入,池内剩余 ZEC 只会随用户提取逐渐减少。长期来看,Sprout 代码最终会从协议中完全移除,彻底消除这类风险。

用户需要做什么

如果你运行 zcashd 节点,请确保已升级到 v6.12.0 或更高版本。普通钱包用户(Zodl 钱包、YWallet 等)不受此漏洞影响,无需任何操作。

相关资源