本文概述了Web3构建者、开发人员和安全团队在设计、开发和维护安全智能合约系统时必须考虑的核心安全基本原则。文章提出了一个框架,讨论了贯穿软件开发生命周期的八个核心安全考量类别,从威胁建模到应急响应准备,强调安全应该是成功开发的组成部分,而不是事后才考虑的附加组件。
许多 web3 项目遭受的黑客攻击,如果更加重视智能合约安全性,本可以避免。通常,攻击者会发现并利用软件开发供应链中的多个缺陷——这一系列步骤从设计到部署和维护,将新代码发布到世界中。如果适当的协议和最佳实践更容易获得,我们相信安全事件会大大减少。本文的目的是概述 web3 构建者、开发人员和安全团队在设计、开发和维护安全智能合约系统时必须考虑的核心安全基础。下面介绍的框架讨论了八个核心类别的安全考虑因素——从威胁建模到应急响应准备——这些应该在整个软件开发生命周期中实施。在深入研究智能合约安全考虑因素之前,重要的是要了解安全软件供应链的开发阶段,这可以用以下五个阶段来描述:
- A) 设计: 开发人员描述系统所需的特性和操作,包括重要的基准和不变属性。
- B) 开发: 开发人员编写系统的代码。
- C) 测试 & 审查: 开发人员将所有模块集中在一个测试环境中,并评估其正确性、规模和其他因素。
- D) 部署: 开发人员将系统投入生产。
- E) 运维: 开发人员评估和修改系统,以确保其执行预期的功能。
有了这个基本的生命周期基础,现在让我们深入研究影响每个步骤的智能合约安全考虑因素。下图将这些考虑因素映射到它们相关的开发阶段。请注意,供应链中的某些步骤有多个安全考虑因素:

但是,上面线性排列的软件开发生命周期并不一定总是遵循线性路径:类别可能重叠或扩展到实践中的其他阶段。对于每个版本,步骤可能会重复。并且有些任务——例如测试和安全审查——可能需要在整个过程中执行。虽然上面描述的软件生命周期步骤和相应的安全考虑因素为提升智能合约安全性提供了一个有用的基础,但我们在下面更详细地检查它们。为了使理解、应用和分享这些最佳实践尽可能简单和具体,关键问题是 什么、为什么和如何。
设计阶段 (A) 的智能合约安全考虑因素
#1:考虑威胁建模和安全设计
- 什么: 从开发生命周期的最初阶段开始,实施识别和优先考虑系统潜在威胁的显式实践非常重要——智能合约开发人员应识别要在开发中实施的任何安全控制,以及应在测试、审计和监控中检查的任何威胁。所有安全假设,包括攻击者预期的复杂程度和经济手段,都应在设计阶段明确定义和阐述。
- 为什么: 虽然开发人员很容易只关注智能合约或协议的预期用途,但这种唯一的关注可能会让他们产生盲点,攻击者可以并且将会利用这些盲点。
- 如何: 遵循已知的威胁建模实践。如果开发团队没有内部安全专业知识,那么它应该在设计阶段早期与安全顾问接洽。在设计系统时,采用“攻击者”的心态,并假设任何个人、机器或服务都可能合理地受到损害。
开发阶段 (B) 的安全考虑因素
#2:考虑管理和访问控制
- 什么: 实施访问控制,以限制调用特殊函数的权限,这些函数执行管理任务——例如升级合约和设置特殊参数——给特权帐户和智能合约。遵循“最小权限原则”:每个参与者只应具有所需的最小访问权限。
- 为什么: 通过升级和治理流程维护协议,允许开发人员通过添加新功能、修补安全问题和解决不断变化的条件来改进协议。如果升级能力没有得到适当控制,这可能会构成关键的安全漏洞。
- 如何: 设置一个多重签名钱包 (multisig) 或 DAO 合约,它将代表社区以透明的方式管理更改。更改应经过彻底的审查流程,以及时间锁——故意延迟颁布并具有取消能力——以确保可以验证其正确性并在发生治理攻击时回滚。确保特权密钥安全地存储在自托管钱包或安全托管服务中并被访问。
#3:考虑可重用、经过实战考验的模板和集成
- 什么: 尽可能使用现有的智能合约标准(例如,OpenZeppelin 合约),并评估你可能需要与现有协议进行的协议集成的安全假设。
- 为什么: 使用现有的经过实战考验的、社区审计的标准和实现,可以大大降低安全风险。评估协议集成的风险有助于你开发安全检查,以防止攻击外部组件,例如预言机操纵。
- 如何: 导入已通过安全审计的受信任的合约库和接口;毕竟,加密和 web3 的全部意义在于开源使用、重用和可组合性!请务必在代码库中记录你的合约依赖项及其版本,并尽可能减少你的代码足迹;例如,导入大型项目的特定子模块,而不是所有内容。了解你的风险敞口,以便你可以监控供应链攻击。使用官方接口调用外部协议,并务必将潜在的集成风险考虑在内。监控你重用的合约的更新和安全披露。
测试 & 审查阶段 (C) 的安全考虑因素
#4:考虑测试和文档
- 什么: 创建清晰、全面的代码文档,并设置一个快速、彻底、易于运行的测试套件。在可能的情况下,在测试网上或通过主网模拟设置测试环境,以便进行更深入的实验。
- 为什么: 写出代码库预期行为的假设有助于确保威胁模型中的风险得到解决,并且用户和外部审计员了解开发团队的意图。为代码创建测试套件有助于证明——或反驳——开发假设,并鼓励更深入地思考威胁模型。此测试套件应包括对机制设计的测试,以检查极端市场情景下的项目的 token 经济学,以及单元测试和集成测试。
- 如何: 实施已知的测试框架和安全检查器——例如 Hardhat、Mythril、Slither、Truffle 等——它们提供不同的测试技术,例如模糊测试、属性检查,甚至形式验证。使用 NatSpec 注释广泛地记录你的代码 - 以指定预期的副作用、参数和返回值。使用文档生成工具生成实时文档,以及高级设计说明。
#5:考虑内部审查和安全审计
- 什么: 花时间通过内部和外部代码审查来查找错误。
- 为什么: 暂时停止功能开发以关注安全问题,使开发人员有时间查找潜在的隐蔽问题。外部审计在这方面特别有帮助,因为它们可以带来开发团队没有的外部视角和专业知识。
- 如何: 在项目开发的适当阶段,安排功能冻结,以便有时间进行内部审查,然后进行外部审计。这应在任何实时部署和升级之前进行。查看 ConsenSys、Nascent、OpenZeppelin 和 Trail of Bits 的指南,这些指南为开发人员提供了注意事项清单(包括时间安排),供任何准备进行审计的人员使用。另请务必查看部署事务,以确保它们使用经过审计的代码版本并具有适当的参数,尤其是在升级软件时。
部署 (D) & 维护 (E) 阶段的安全考虑因素
#6:考虑激励白帽社区参与
- 什么: 创建鼓励社区参与开源代码库安全改进的计划。一种方法是创建漏洞赏金。另一种方法是鼓励社区开发协议监控检测机器人。
- 为什么: 开发团队可以从利用更广泛的知识和经验中获益匪浅。(同样,这也是开源在加密货币中发挥作用的地方。)值得注意的是,此类计划可以帮助激发对项目的热情,从根本上将社区和白帽黑客变成传播者。它们还可以通过为黑客提供成为防御者的途径,帮助将潜在的攻击者转变为安全资产。
- 如何: 使用漏洞赏金平台(例如 Code4rena、HackenProof、Immunefi 或 Secureum)资助基于严重性的奖励的赏金系统,以激励熟练的黑客安全地披露漏洞。[完全披露,本文的一些合著者为 Forta 工作,该网络提供了一种代币化的激励结构,用于分散创建高质量的安全监控机器人。] 开发团队可以鼓励其协议的社区利用传统和 web3 原生方法来激励漏洞赏金,并让参与者通过增强安全性来潜在地获利,从而实现所有人的双赢。
#7:考虑实时监控
- 什么: 实施监控智能合约和关键操作组件(例如预言机和桥)的系统,并根据已知的威胁模型向开发团队和社区报告可疑活动。
- 为什么: 早期检测问题使团队能够快速响应漏洞和错误,从而可能阻止或减轻任何损害。这似乎很明显,但在计划中可能会被忽略。
- 如何: 使用监控平台或分布式节点运行机器人,以实时监控智能合约事件。根据需要为开发团队和更广泛的社区实施仪表板和警报通知。
#8:考虑事件和应急响应操作
- 什么: 使用能够立即响应任何安全问题的工具和流程。
- 为什么: 即使有最好的预部署保护措施,智能合约和关键组件(例如预言机和桥)仍然有可能出现实时问题。拥有专门的人员、明确的流程和适当的自动化措施可确保可以快速调查事件并尽快解决。
- 如何: 通过计划如何响应事件或紧急情况并尽可能实现响应能力自动化来为最坏的情况做好准备。这包括分配责任,由有能力的人员负责调查和响应,这些人员可以通过分布式安全邮件列表、代码存储库中的说明或智能合约注册表公开联系安全问题。根据协议的威胁模型,制定一套流程,其中可能包括情景演习和采取紧急行动的预期响应时间。考虑将自动化集成到事件响应中:例如,工具可以接收 Forta 机器人的事件并对其采取行动。
***安全考虑因素应该是成功开发不可或缺的一部分——而不仅仅是事后的想法或附加组件。虽然此框架为那些构建 web3 协议和应用程序以在整个开发过程中提升安全性提供了一些快速指导,但没有简短的概述可以提供有关智能合约安全的所有方面的详尽讨论。缺乏内部安全专业知识的团队应联系合格的 web3 安全专家,他们可以帮助他们将上述一般指导应用于他们的特定情况。但最重要的是,请记住,安全性绝不仅仅是在简单的清单中打勾以管理复杂性的简单问题;因此,它始终将是一套永无止境的、持续的最佳实践。我们仍处于建立这些最佳实践的初期阶段,因此现在是在所有级别为所有开发人员协作创建和分享这些实践的时候了。
编辑:Robert Hackett @rhhackett
Andy Beal 是 Forta 的生态系统负责人。此前,他曾帮助管理安永的区块链业务。
Nassim Eddequiouaq 是 a16z 加密货币的首席信息安全官。他之前曾在 Facebook、Anchorage 和 Docker 工作。
Riyaz Faizullabhoy 是 a16z 加密货币的首席技术官。他之前曾在 Facebook、Anchorage 和 Docker 工作。
Christian Seifert 是 Forta 的常驻研究员。此前,他曾在微软从事网络安全工作 14 年。