Bulletproofs 中的 Frozen Heart 漏洞:零知识证明系统的致命缺陷
Bulletproofs 中的 Frozen Heart 漏洞
零知识证明与 Fiat-Shamir 变换
本文假设读者已具备零知识证明的基础知识。如需深入了解,可参考 Matt Green 的入门指南等资源。关于 Fiat-Shamir 变换的详细解释,可查阅作者先前撰写的博客文章。ZKDocs 也提供了相关主题的更多信息。
Bulletproofs 技术原理
Bulletproofs 是一种高效复杂的零知识范围证明协议,允许证明者在不泄露具体数值的情况下,证明某个秘密值处于预定范围内(如[0, 2³²))。
该协议基于 Pedersen 承诺密码学原语:承诺值计算为 comm = (gˣ)(hᵞ),其中 g 和 h 是有限群的不同生成元,h 相对于 g 的离散对数未知。Pedersen 承诺不会泄露任何关于 x 的信息,且无法对承诺进行 equivocation(即无法找到产生相同承诺的不同 x'和γ'值)。
Frozen Heart 漏洞技术分析
Bulletproofs 存在多个 Fiat-Shamir 变换点(具体数量取决于参数配置),可能以不同方式被滥用。原始 Bulletproofs 论文作者推荐的不安全 Fiat-Shamir 实现方式导致了该漏洞,影响 ING Bank 的 zkrp、SECBIT Labs 的 ckb-zkp 以及 Adjoint, Inc.的 bulletproofs 等多个实现。
漏洞核心问题
根据 Fiat-Shamir 安全实现准则:哈希计算必须包含零知识证明语句中的所有公共值(g, h, V, n)以及证明过程中生成的所有随机承诺值。但原始论文建议的挑战值计算方式:
y = Hash(A,S)
z = Hash(A,S,y)
x = Hash(A,S,y,z,T₁,T₂)未包含语句关键公共值 V,构成 Frozen Heart 漏洞。
漏洞利用步骤
设置 v 为范围内任意值(如 v=3),选择随机γ
按协议生成 aₗ, aᴿ, A, S
计算 t₁和 t₂后,随机生成 t₁'和 t₂'替换实际值计算 T₁和 T₂
按协议计算其他值(l, r, t̂, τₓ, μ)
构造恶意 V 值:v' = 3 + (t₁ - t₁')(x/z²) + (t₂ - t₂')(x²/z²)
通过调整随机值可使 v'以极高概率落在范围外
数学验证
验证方程(65)的左右两边通过恶意 V 值的构造实现平衡:
左边:g 指数包含 t₀ + t₁·x + t₂·x²
右边:g 指数包含 3z² + δ(y,z) + t₁·x + t₂·x²
根据 t₀定义(t₀ = ⟨aₗ, aᴿ·yⁿ⟩),两边数学等价
漏洞影响范围
Frozen Heart 漏洞允许攻击者为随机值伪造证明,其实际影响取决于具体应用场景。由于群阶通常远大于预定范围(如 2²⁵⁶ vs 2³²),攻击者能轻易生成范围外值的有效证明。在大多数 Bulletproofs 应用场景中,这都是严重的安全威胁。
系列最终篇将探讨更复杂证明系统 PlonK 中的 Frozen Heart 漏洞。更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)公众号二维码
办公AI智能小助手
评论