SnarkPack v2:Filecoin 证明聚合器的新版本

在最近的Filecoin Network v16 Skyr Upgrade中,发布了新版本的 SnarkPack 证明聚合库。这个版本没有引入任何新功能,而是强化了加密协议本身。这篇文章详细介绍了对 SnarkPack 库进行检查的动机、我们发现的问题,以及它们是如何被解决并传送到 Filecoin 网络中的。

什么是 SnarkPack?

Filecoin 协议的核心是一组加密证明,称为复制证明(PoReps)。这些 PoRep 使 Filecoin 网络的核心承诺成为可能:去中心化、可验证的存储。

SnarkPack 是一种加密协议,可以有效地同时聚合和验证多个证明。Filecoin 协议在复制证明上使用 SnarkPark 库,允许更快地将存储载入网络。有关 SnarkPack 库的更多信息,请参阅Financial Crypto '22 上的演示文稿,并阅读相应的论文或相关的博客文章。

SnarkPark 依赖的众多加密技术包括 Fiat-Shamir 转换。非正式地说,Fiat-Shamir 转换是一种加密技术,它消除了证明的验证者与相关陈述的证明者进行通信的需要。由于这些转换是通过 SnarkPack 生成的聚合证明的基础,因此 Fiat-Shamir 转换的任何问题都会危及 SnarkPack 本身的正确性。

冰冻的心脏漏洞

2022 年 4 月 13 日,Trail of Bits宣布披露破坏各种证明系统健全性的漏洞。这些漏洞被 Trail of Bits 团队称为“Frozen Heart”漏洞,主要针对 Fiat-Shamir 转换的不安全实现,恶意代理可以利用这些漏洞“证明”不正确的陈述。由于 Frozen Heart 漏洞可用于攻击已经在生产中的协议,因此首先将它们披露给各个受影响的项目,以便可以安全地修复它们。

该公告促使 Filecoin 加密团队针对相同的漏洞审核 SnarkPack 实施。该检查揭示了与 Frozen Heart 漏洞类似的问题,同样基于 Fiat-Shamir 转换的不安全实现。然而,与上述披露不同的是,研究 Filecoin 的密码学团队没有发现对 Filecoin 协议的直接攻击,这些攻击可能会因这些问题而引发。尽管如此,该团队还是决定解决这些问题,以遵守安全最佳实践,并确保对 Filecoin 安全至关重要的证明的最大可能健全性。

SnarkPack v1 中的问题

为了了解 SnarkPack v1 实施的错误方面,我们需要更深入地研究 Fiat-Shamir 转换的工作原理。如前所述,这些转换将涉及证明验证者与证明者通信的交互式证明系统转换为非交互式那些。被替换的所谓“交互”步骤通常是验证者向证明者传达一个随机值作为挑战。Fiat-Shamir 转换允许用所谓的“随机预言机”替换交互来生成挑战。在实践中,随机预言机被一个安全的散列函数所取代,因此证明者可以简单地将公开信息和部分输出散列到该步骤,并将散列的结果作为必要的随机值(所谓的“挑战”)。证明者向哈希中提供尽可能多的信息是很重要的;特别是,证明者应该输入验证者在交互式版本中可以访问的所有值。

虽然概念简单,但 Fiat-Shamir 转换的实现需要小心谨慎,因为任何未包含在散列步骤中的公共信息都会扩大攻击的表面积。恶意代理可以修改任何未散列的公共信息以产生虚假证明。

在 SnarkPack 中,当聚合 N 个证明时,需要执行 log2(N) 个 Fiat-Shamir 转换,进而需要执行 log2(N) 个哈希。每个哈希计算必须将证明者在证明过程中已经生成的所有元素作为输入。这可以用伪代码模拟如下:

rand = H(...)

……

for i in 0…log2(n):

A <- generate_proof_step(i)

rand <- H(rand, A)

B <- generate_post_randomness_step(rand)

一旦这个过程完成(即,一旦循环在 log2(N) 步后终止),就需要计算最后一个哈希值——即要计算最后一个随机性。然后将这种随机性输入到 SnarkPack 协议的其余部分。在伪代码中,这很简单:

KZG_proof(final_randomness, …)

final_randomness = H(B)

问题

CryptoNet的审计揭示了 SnarkPack v1 实施此过程的两个主要问题:

跳过循环中的第一个哈希生成:当 i=0 时,代码跳过对哈希函数的调用,而是重用第一行中先前生成的随机性。后果是证明者可以更改第一个证明元素 A,而无需更改第一个随机性。

跳过最后的随机生成:这意味着 KZG_proof 不会与前面的证明步骤正确“链接”。

这些问题是相对良性的,因为循环中的其他随机值仍然可以正确计算。因此,假设的攻击者需要找到与其他计算值匹配的输入,以便伪造有意义的证明。然而,为了遵循安全最佳实践,并鉴于最近对 Fiat-Shamir 实施漏洞的关注,我们决定在下一次 Filecoin 网络升级中采用必要的修复。

将 SnarkPack v2 引入网络

Filecoin Crypto团队在 Bellperson 存储库中对上述两个问题进行了修复,可以在此处找到实现修复的拉取请求。对于希望查看更正代码的读者,我们共享指向问题 A(证明者、验证者)相关小节的链接。问题 B(证明者,验证者)。

为了正确应用修复程序,同时保持向后兼容性,更新了 API 以添加 AggregateVersion 枚举。此版本用作一个标志来指示我们是使用新的、更安全的代码路径 (SnarkPack v2) 还是旧代码路径 (SnarkPack v1)。在 Skyr 网络升级之前落地的聚合证明预计为 v1,而在升级时期之后落地的聚合证明预计为 v2。可以在此处找到在证明实现中实现此版本控制的拉取请求,并在版本 11.1.0 中发布。

Lotus团队在核心开发会议上帮助与其他Filecoin核心开发人员分享了这些问题。核心开发者达成共识,应尽快将修复程序引入 Filecoin 网络,因此将 SnarkPack v2 引入 Filecoin 网络的范围被纳入 Skyr 升级。支持 SnarkPack v2 的 builtin-actors 实现可以在这里找到,它被所有客户端实现使用;参考客户端实现可以在他找到。

Filecoin 网络中的安全性

SnarkPack 已经过PLEngRes团队中的密码学家和其他专家的审计。尽管如此,鉴于协议的复杂性,错误可能仍然存在!Trail of Bits 博客文章系列一发布,我们就决定重新审视 SnarkPack 的实施,以确保为 Filecoin 网络提供动力的证明不会受到同类问题的影响。我们希望维护 Filecoin 网络的最高安全标准,包括跟上最新的安全发展和加密漏洞。Filecoin 还邀请所有安全和密码学研究人员与我们一起维护和管理 Filecoin 网络的安全性;在此处了解有关Bug 赏金计划的更多信息。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章