本文深入探讨了零知识证明(ZKP)中可能出现漏洞的各个层次,包括电路层、前端层、后端层和集成层。重点介绍了用于检测电路漏洞的安全工具的现状,如静态分析、符号执行、动态分析、模糊测试和形式化验证等技术,并强调了在前端和后端层中发现漏洞的重要性,以及zkSecurity在开发相关安全工具上的努力。
零知识证明 (ZKP) 已经从提供隐私和可验证性的理论概念发展到具有实际的、现实世界的实现。一些最常见的用例包括区块链中的私有交易(例如,Zcash)、具有私有智能合约能力的区块链(例如,Aleo)、通过链下有效性证明实现可扩展性(例如,zk-rollups)、用于安全非托管身份验证的基础设施(例如,zkLogin)以及以隐私为中心的应用程序,如 ZKEmail。所有这些示例都构建在 SNARK 的基础上。
在过去的一年中,在 zkSecurity,我们一直在 审计 各式各样的使用 ZKP 的应用程序,甚至审计 ZKP 的实现。此外,我们一直在研究开发更安全的 用于编写电路的 DSL,并更好地理解 ZKP 中的安全问题 生态系统。最后,我们还 开发了工具,以帮助开发人员和审计人员在使用 ZKP 时。
在本文中,我们将简要讨论在使用 ZKP 时可能引入漏洞的地方,然后我们将讨论用于查找 ZKP 中漏洞的安全工具的现状。
在我们最近的一项工作中,我们 系统化了 SNARK 中安全漏洞的知识,我们为 SNARK 提供了一个具体的系统模型。该模型的一部分是将 SNARK 的实现和使用分解为多个层级。下图描述了主要的层级。
我们有以下几个层级。对于每一层,我们还提供了 Semaphore 协议 的相应组件/工具。
semaphore.circom
。circom
编译器。snarkjs
工具链。semaphore.sol
solidity 智能合约。需要注意的是,任何层级的漏洞都可能破坏 ZKP 提供的属性。此外,前端或后端层级的漏洞可能会破坏构建在其上的任何应用程序,即使电路是正确的。
SNARK 中的漏洞可能会破坏 ZKP 提供的主要属性:
最近,从业者和研究人员都投入了大量精力来开发用于查找电路层漏洞的工具。这是意料之中的,因为大多数报告的与 ZKP 相关的漏洞都在该层,而且大多数审计都是电路审计。该层中可能发生的主要漏洞是:
到目前为止,几乎所有形式的形式化方法都已用于检测电路漏洞。下面,我们将简要描述用于检测电路漏洞的主要技术。
静态分析涉及在不执行代码的情况下检查代码,以识别潜在的漏洞。此方法依赖于模式和启发式方法来检测可能导致漏洞的常见问题。例如,Circom 的 Circomspect 和 ZKAP 以及 Halo2 电路的 halo2-analyzer。当前的方法是有限的,因为它们只能检测非常特定的漏洞模式,并且只能分析用特定 DSL 或 eDSL 编写的程序。原则上,某些技术可以在多个 DSL 上工作。这些工具通常在开发期间或审计的初始阶段使用,以检测潜在的漏洞。与其他行业相比,我们仍处于开发 ZKP 静态分析工具的初步阶段。例如,智能合约的静态分析器已经变得非常复杂,能够有效地检测关键漏洞。
符号执行 是一种程序分析技术,它通过将输入视为符号变量而不是具体值来检查程序可能的执行路径。此技术系统地探索程序可以采用的所有潜在路径,通过分析不同的变量如何影响程序行为来查找错误和漏洞。用于查找错误的符号执行与形式验证不同,在这一领域中仍未得到充分利用。此方法对于检测电路中约束不足和约束过度的错误特别有用。尽管它具有潜力,但除了最初的一些形式验证工作(我们将在下面看到)之外,符号执行尚未被广泛用于检测电路漏洞。
动态分析涉及执行代码并实时观察其行为,以识别潜在的漏洞。模糊测试是动态分析的一个子集,它涉及向程序提供各种随机输入,以查看其如何处理意外或极端情况。用于动态分析的唯一现有工具是 SnarkProbe,这是一个用于 SNARK 的安全分析框架,可以分析基于 R1CS 的库和应用程序,以检测各种问题,例如边缘情况崩溃、密码操作错误和/或与协议描述不一致。此工具需要用户提供一些理想的功能文件,然后它尝试检测不一致之处。尽管 SnarkProbe 是一个有趣的初步方法,但在使用动态分析工具查找此空间中的错误方面,仍然存在错失的机会,类似于其他领域。请注意,已经进行了一些努力来应用传统的模糊器来检测 SNARK 中的问题,但通常这些工具会遇到困难,因为它们无法解决检测 SNARK 的重要漏洞所需的 oracle 问题,例如可能破坏应用程序可靠性的约束不足的错误。
形式验证涉及以数学方式证明系统符合某些属性。此技术通过严格检查形式规范或某些规则来提供关于系统正确性和安全性的保证。具体来说,形式验证是一个使用数学和逻辑推理来确保系统设计满足某些正确性属性的过程。与传统的测试方法不同,传统的测试方法只能检测到错误的存在,而形式验证可以证明不存在特定类型的错误。这使其成为确保系统安全的有用工具。但是,形式验证通常会带来重大挑战,因为它需要准确的形式规范,并且它可能难以有效地扩展,通常会导致超时。有关 ZKP 形式验证的全面概述,你可以参考这篇 文章。下面,我们将简要讨论电路形式验证的当前状态。
在 ZKP 电路的上下文中,形式验证确保电路正确地实现预期的逻辑,而不会引入漏洞。这涉及验证约束是否已正确实现,以及电路在所有可能的输入下是否按预期运行。
几个现有的开源端到端工具和电路形式验证技术包括:
尽管取得了这些进展,但仍然存在重大限制。依赖于 SMT 求解器的工具(如 Picus)面临着有限的支持和处理有限域算术的效率方面的挑战,从而导致性能瓶颈。这些工具虽然功能强大,但通常受到底层求解器能力的限制,这可能会限制它们对更复杂电路的适用性。Ozdemir 等人 最近的工作试图改进 ZKP 的 SMT 求解器。 证明助手语言,特别是对于密码协议,在表达性方面仍然面临限制。很少有工具能够直接证明关于密码协议的定理。已经进行了多次努力来克服这些障碍,但形式化验证 ZKP 电路仍然是一项具有挑战性的任务。尽管为 ZKP 形式验证做出了令人印象深刻的努力,但它应该伴随着整体安全方法来确保安全。端到端的形式验证是一项复杂的任务,并且通常依赖于用户输入和其他软件,这意味着在实践中很难确定是否存在错误。
此外,在电路开发过程中,我们发现了一个主要问题:缺乏强大的测试框架。开发人员通常在 eDSL 中使用来自宿主语言的测试框架,或者在使用 DSL 时创建自定义工具链。但是,对于有效地为电路编写单元测试和集成测试(特别是对于测试可靠性漏洞)的支持有限。基础设施中缺少的一个关键部分是基于属性的测试,类似于 QuickCheck 或 Foundry,这对于彻底的属性测试至关重要。
此外,在大多数 DSL 中调试电路是一项具有挑战性的任务,这是另一个需要改进的领域。为了解决这个问题,我们开发了 Circomscribe,这是一个用于调试 Circom 电路中约束的工具。展望未来,我们计划发布更多工具来帮助开发人员和审计人员测试和调试电路,从而增强整体开发过程并确保 ZKP 实现的更高安全性和可靠性。
在下表中,我们提供了现有开源工具的概述:
工具 | 技术 | UC | OC | CE |
---|---|---|---|---|
Circomspect | SA | ✓ | ✗ | ✗ |
ZKAP | SA | ✓ | ✗ | ✗ |
halo2-analyzer | SA | ✓ | ✓ | ✗ |
Coda | FV | ✓ | ✓ | ✓ |
Ecne | FV | ✓ | ✗ | ✗ |
Picus | FV | ✓ | ✗ | ✗ |
Aleo | FV | ✓ | ✓ | ✓ |
SnarkProbe | DA | ✓ | ✓ | ✗ |
CIVER | FV | ✓ | ✗ | ✗ |
GNARK/Lean | FV | ✓ | ✓ | ✓ |
UC:约束不足,OC:约束过度,CE:计算错误,SA:静态分析,FV:形式验证,DA:动态分析
基础设施层(包括 SNARK 系统的前端和后端)在很大程度上被安全研究人员所忽视。Ozdemir 等人 认识到 ZKP 编译器中的缺陷可能会破坏 ZKP 的完整性,并采取了初步措施,通过部分验证 CirC 编译器 中的关键编译器过程来减轻此类风险。SNARKProve 实施了一个模糊测试框架,可以使用自定义文件(即理想文件)进行配置,以测试后端和前端的特定密码属性。在其初始版本中,它已成功检测到后端 Setup 阶段中的问题。
一些初步工作 已经完成,用于验证验证器,即确保验证算法的实现是正确的。此外,从业者已使用 AFL 等模糊测试工具来识别这些层中的错误。但是,这些工具在范围上有些有限,通常只能检测到崩溃,并且可能会遗漏更微妙但关键的漏洞,例如错误编译。 检测这些层中的错误至关重要,因为任何可利用的错误都可能影响整个堆栈。例如,即使对电路进行形式化验证,前端漏洞也可能导致其部署不健全。因此,确保前端和后端层的安全性和正确性对于 ZKP 系统的整体完整性至关重要。
用于 ZKP 的安全工具正处于开发的早期阶段,但它们对未来充满希望。这些工具可以极大地帮助开发人员,并且理想情况下应成为开发生命周期的组成部分,在审计之前使用。审计仍然主要是一项手动工作,因为大多数使用 ZKP 的协议都需要领域专业知识来理解它们的逻辑和实现。
在 zkSecurity,我们致力于开发和公开共享工具,以帮助审计人员和开发人员。像 Circomspect 这样的工具是我们改进 ZKP 电路调试工作的一部分。我们还致力于对 ZK 漏洞进行分类,并提供见解以改进和开发新的工具来检测它们。查看我们关于 回旋镖漏洞 的博客文章和我们 关于分析 SNARK 漏洞的论文以获取更多信息。
如果你对零知识证明和安全充满热情,请考虑加入我们这个激动人心的旅程。你可以通过参加我们的 zkBank 挑战 这里 来申请!对于那些对 ZKP 安全工具感兴趣并正在寻找实习机会来解决有趣问题的人,请考虑 这里 申请。
- 原文链接: blog.zksecurity.xyz/post...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!