本文强调了形式化验证(FV)在Web3和DeFi安全中的重要性,指出传统测试方法不足以应对Web3的安全挑战。FV通过数学证明确保代码按预期运行,能预防高危漏洞,并已在多个知名DeFi项目中应用,同时建议将FV尽早集成到开发生命周期中,以提升代码质量和安全性。
唯一一种能够一次又一次成功保护安全关键型应用的技术是形式化验证¹。DeFi 应用是安全关键型的 —— 这些应用中的漏洞可能被利用,造成灾难性的后果,不幸的是,现实世界不乏 демонстрирующий 这一点的事例。因此,形式化验证对 DeFi 的重要性怎么强调都不为过。DeFi 领域的杰出领导者,如 Vitalik Buterin 和 Anatoly Yakovenko,认识到 这一点。形式化验证对于所有 Web3 层都应该是强制性的,包括 DeFi 应用、共识协议的实现以及与 DeFi 应用交互的用户界面。
形式化验证(FV)是一种为软件和硬件系统提供安全保证的技术。它补充了诸如测试和模糊测试之类的技术,这些技术只能有时基于预定义的属性检测到错误。同样,最佳编码实践和审计可以提高对程序无错误状态的信心,但它们不能提供任何正确性保证,即代码中的某些错误对于所有输入都是不可能的。
相比之下,FV 产生了一个数学证明,证明该程序在所有执行过程中都按照规范运行。此外,它可以防止由于硬件和软件系统中的极端情况而导致的罕见错误在生产之前发生。一个经典的 现实世界的例子 是著名的奔腾硬件,其中硬件电路包含一个非常罕见的错误,该错误通过各种测试机制潜伏下来。事实上,这个错误导致了 FV 方法在硬件行业的广泛采用。
FV 依赖于一个规范,该规范正式声明了一个系统必须满足的安全属性。一个好的、可重复使用的规范应该是通用的——它应该表达系统的预期行为,而不会过于陷入实现的细节。例如,一个系统可能要求某个用户 Alice 不要双重花费一定数量的 Ether。一个更通用的规范会说,在执行过程中,任何用户都不能双重花费任何代币。FV 的一个额外好处是,人们在识别和编写所需属性的过程中,可以更好地理解系统。
对于大多数软件系统,测试、质量控制、模糊测试(使用随机输入来查找错误)和静态分析就足够了 —— 它们中的大多数在出现罕见错误时表现良好,并且失败通常不会造成严重的后果。运行时监控工具通常也很擅长检测生产中的错误,从而使开发人员可以快速修复问题,而不会造成重大损失。
然而,Web3 与其他领域不同,在这种情况下,FV 是必不可少的,原因如下:
开发人员和安全研究人员可以并且应该尽早使用 FV,用于 SDLC 中的错误检测,如下图所示。 这不仅会带来更可靠的软件,还会带来更简单的设计,从而更容易扩展和维护。
我们建议将形式化验证集成到 CI 中,就像编译器、模糊器、静态分析器和代码检查器一样。 像 Aave 这样的公司已将形式化验证集成到他们的常规 CI 管道中,每次代码更改后都会调用 Certora Prover。 例如,自 2022 年 3 月以来,Aave V3 已将 Certora Prover 集成到其 CI 系统中,并且每次代码更改都会自动检查。
FV 提供了一个数学证明,证明该程序的行为符合规范,该规范充当“单一的事实来源”。如果规范本身不能准确地编码程序的预期行为,那么 FV 结果就不可信。同样,如果规范没有涵盖某些属性,那么 FV 就无法保证系统不会因为违反该属性而出现错误。
错误也可能由于外部事件而发生,例如定价或对其他未经过形式化验证的库和基础设施代码的依赖。
最后,FV 工具本身可能存在错误。一些 FV 工具通过最小化必须信任的部分(称为可信计算基础或 TCB)来降低了这种情况的可能性。一些工作已经展示了如何形式化验证 和 差异化测试 形式化验证工具本身。
协议可能在 FV 之后被黑客入侵。最可能的原因是缺少规范、对外部事件(如定价)的依赖中的错误,以及在验证范围之外甚至在代码之外的错误。尽管如此,FV 极大地提高了 Web2 和 Web3 中代码的安全性。
答:不,FV 在许多方面补充了模糊测试和审计。例如,审计规范可以提高对 FV 结果的信心。相反,当 FV 发现违规时,它通常会生成一个触发该错误的具体输入(称为“反例”)。此输入可用作测试用例或模糊器的种子,以使其更有效。最后,不变性测试 是 FV 的一个良好的起点。
对于任何给定的规范,形式化验证都提供完整的路径覆盖。例如,规范可能声明只能在 ERC20 合同中铸造有限数量的代币。形式化验证要么保证规则在所有路径和所有输入上都成立,要么生成一个测试输入来演示规则违规。
答:任何对理解协议和代码感到好奇,并且具有编程和逻辑基础知识的人,包括开发人员和安全研究人员。FV 可以提高程序员的技能。
答:应该尽早且经常地使用 FV,最好甚至在编写代码之前的设计阶段就使用。 “FV 思维”会带来更简单、模块化的设计,从而使 FV 更易于应用。
答:不,FV 应该是系统 CI 的一部分,以便在任何代码更改后运行。
答:FV 结果的质量仅与规范一样好。因此,必须检查规范是否存在诸如空洞性之类的问题。还应使用合成故障注入和 mutation 测试 以确保规范能够捕获错误。强烈建议审查和审计规范。
2023 年 3 月,智能合约中的一个未经检查的错误导致 1.8 亿美元的用户资金被盗。 像这样的事件不是异常现象,它们是社区必须认真对待的警告。 智能合约审计、模糊测试和测试当然有帮助,但它们并不够。
自图灵在 1950 年代首次提出以来,形式化验证 (FV) 已经取得了长足的进步。 现在有许多强大的 FV 证明工具,包括 SMT 求解器,如 Z3、Yices 和 CVC5,以及交互式定理证明器,如 Lean2、K、Coq 和 Isabelle。
[对于构建 DeFi 协议、治理合约或任何具有经济风险的关键任务应用程序的团队来说,FV 是必不可少的,鉴于存在大量可用于 FV 的优秀工具,根本没有理由不使用它。
https://dl.acm.org/doi/10.1145/780822.781149
https://link.springer.com/chapter/10.1007/978-3-319-41540-6\_2
https://www.absint.com/astree/index.htm
https://dl.acm.org/doi/10.1145/2737924.2737958
https://dl.acm.org/doi/10.1145/3051092
https://github.com/starkware-libs/formal-proofs
- 原文链接: certora.com/blog/formal-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!