Girault知识证明中的Frozen Heart漏洞:零知识证明系统的致命缺陷

本文深入分析了Girault知识证明协议中存在的Frozen Heart漏洞,该漏洞源于Fiat-Shamir变换的不安全实现,允许攻击者伪造随机声明的证明。文章详细解释了漏洞原理、利用方法及其对应用安全的影响。

Girault知识证明中的Frozen Heart漏洞

在本系列的第一部分中,我们披露了破坏多个零知识证明系统实现健全性的关键漏洞。这类被我们称为Frozen Heart的漏洞,是由Fiat-Shamir变换的不安全实现引起的,它允许恶意用户为随机声明伪造证明。该漏洞具有普遍性,可应用于任何不安全实现Fiat-Shamir变换的证明系统。在本文中,我将展示如何利用Girault知识证明中的Frozen Heart漏洞。

零知识证明与Fiat-Shamir变换

本文假设您对零知识证明有一定了解。如果您想了解更多相关信息,可以参考Matt Green的入门文章等有用的博客文章和视频。要深入了解Fiat-Shamir变换,请查看我写的详细解释博客文章。您还可以访问ZKDocs获取关于这两个主题的更多信息。

Girault的知识证明

在Girault的知识证明协议中,证明者证明他知道某个值在复合模数下的离散对数。换句话说,证明者使验证者相信他知道某个秘密值x,使得h = g⁻ˣ mod N,其中g是高阶生成元,N是某个复合模数(例如,N = p * q,其中p和q是两个素数)。要了解更多关于该协议的信息,请查看我们在ZKDocs上的描述。如果您熟悉Schnorr证明,可以将Girault的知识证明视为在复合模数而非素数模数上进行的Schnorr证明。

该协议默认是交互式的,但可以使用Fiat-Shamir变换使其变为非交互式:

Girault知识证明的交互式和非交互式版本

简而言之,证明首先生成一个随机值r,并计算承诺u = gʳ。然后,证明者获取随机挑战值e(在交互式版本中来自验证者,在非交互式版本中通过Fiat-Shamir变换自行计算),并计算最终证明值z = r + x * e。只要无法在所用群上计算离散对数且Fiat-Shamir挑战计算正确,该协议就被证明是安全的。

Girault知识证明中的Frozen Heart漏洞

但是,如果我们没有正确计算Fiat-Shamir挑战会发生什么?让我们看一个例子。在ZenGo的Girault知识证明实现(在修补之前)中,e是通过哈希g、N和u计算的,但没有包括h(在此实现中,h由statement.ni表示)。在本系列的第一部分中,我们介绍了一条安全实现Fiat-Shamir变换的经验法则:Fiat-Shamir哈希计算必须包括零知识证明语句中的所有公共值以及证明中计算的所有公共值(即所有随机"承诺"值)。因此,未在此计算中包含h会引入Frozen Heart漏洞,允许恶意证明者为随机h值伪造证明,即使他们不知道其离散对数。

让我们逐步了解如何利用此Frozen Heart漏洞。我们首先为u和z选择随机值。由于h未包含在Fiat-Shamir实现中,我们现在可以计算e = Hash(g, N, u)。接下来,我们需要找到一个能通过验证检查的h值:u = gᶻhᵉ mod N。除了h之外,我们已经知道所有值:我们生成了u和z,计算了e,而g和N都是公共的。因此,我们可以求解h:

u = gᶻhᵉ mod N
hᵉ = ug⁻ᶻ mod N
e_inv = e⁻¹ mod phi(N)
h = (ug⁻ᶻ)^(e_inv) mod N

如果我们代入此h值,我们知道第二个验证检查将通过,因为我们选择h specifically是为了通过此检查。执行的唯一其他检查是挑战值e的检查,但此检查也将通过,因为我们以相同方式计算了此值。请记住,我们只是随机选择了u。这意味着我们实际上并不知道u的离散对数(即,找到满足gᵗ = u mod N的值t是不可行的)。由于我们不知道u的离散对数,我们也不知道h的离散对数。然而,我们欺骗了验证者认为此证明有效,即使不知道此离散对数,这意味着我们成功伪造了证明。

注意:为了计算e_inv,恶意证明者需要能够计算phi(N),这需要知道N的质因数。

Frozen Heart对Girault知识证明的影响

Frozen Heart漏洞在Girault知识证明中至关重要,因为它们允许攻击者伪造证明。但是,此漏洞对使用此证明系统的应用程序的影响完全取决于证明系统的使用方式。如果Girault的知识证明仅用于独立的公钥(即不作为某些更大协议的一部分使用的密钥),那么Frozen Heart漏洞可能不那么严重。

原因是,对于Girault的方案,Frozen Heart漏洞使得伪造随机h值成为可能。但这并不比生成随机x并计算h = g⁻ˣ更强大,后者会产生我们可以为其构造证明的随机h。然而,如果此证明系统用于更大、更复杂的协议中——例如需要证明不可伪造的阈值签名方案——那么Frozen Heart漏洞可能非常严重。

尽管在某些上下文中,Frozen Heart漏洞对Girault的方案(以及出于相同原因的Schnorr方案)可能不关键,但对于更复杂的证明系统而言,情况并非如此。要更详细地了解这一点,请查看本系列即将发布的第3部分,其中我们探讨了Bulletproofs证明系统中的Frozen Heart漏洞。

如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News

页面内容 零知识证明与Fiat-Shamir变换 Girault的知识证明 Girault知识证明中的Frozen Heart漏洞 Frozen Heart对Girault知识证明的影响 最近文章 非传统创新者奖学金 劫持您的PajaMAS中的多代理系统 我们构建了MCP一直需要的安全层 利用废弃硬件中的零日漏洞 Inside EthCC[8]:成为智能合约审计员 © 2025 Trail of Bits. 使用Hugo和Mainroad主题生成。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计