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 池已经不接受新存入,池内剩余 ZEC 只会随用户提取逐渐减少。长期来看,Sprout 代码最终会从协议中完全移除,彻底消除这类风险。
用户需要做什么
如果你运行 zcashd 节点,请确保已升级到 v6.12.0 或更高版本。普通钱包用户(Zodl 钱包、YWallet 等)不受此漏洞影响,无需任何操作。