超越私钥风险:构建成熟智能合约的访问控制策略

本文深入探讨智能合约安全设计中常被忽视的私钥泄露风险,提出四级成熟度模型,通过多签、时间锁、最小权限原则和去中心化设计构建抗私钥泄露的弹性系统。

超越私钥风险:智能合约的成熟之路

“找出所有漏洞!”这是大多数协议在部署前保护智能合约的主要口号。团队投入大量资源进行审计、竞赛、模糊测试和形式化验证,旨在检测每一个潜在漏洞。但如果我告诉你,去年加密货币黑客攻击的最大原因并非智能合约漏洞呢?

答案:私钥泄露!

私钥攻击(即滥用密钥材料窃取资产)是一种新兴攻击向量, narrowly scoped 的智能合约审计和竞赛可能会忽略这一点。协议对这些攻击的脆弱性取决于其设计,尤其是访问控制的成熟度。本文将演示如何通过多签、时间锁、最小权限原则以及最小化私钥使用的设计方法,设计能够安全容忍私钥泄露的协议。

私钥泄露已成为最成功的攻击方式

根据 Chainalysis 的 2024 年报告,通过黑客攻击窃取的资金中,惊人的 43.8% 源于密钥泄露——比其他已验证攻击类型高出五倍。私钥泄露是一个危险的新兴威胁,每个工程师在设计新智能合约和协议时都必须考虑。

设计决定风险,历史上很少有区块链协议将认证的智能合约访问视为重要风险向量。这种疏忽被区块链安全生态系统的运作方式强化:由区块链原生公司进行的审计很少将架构访问控制问题标记为正式发现,而竞赛平台 actively discourage 此类提交,偏向代码级漏洞。

这种 narrow focus 与其他行业 established 的安全实践形成对比,在这些行业中,特权升级和访问控制设计等架构风险是安全 engagement 过程早期解决的基本问题。

在 Trail of Bits,我们通过 Codebase Maturity Evaluation 标记架构访问控制问题。然而,大多数区块链协议只在软件开发生命周期的最后阶段寻求外部输入和审查,此时几乎没有时间和机会修复系统性访问控制问题。

这就是为什么我们需要在开发生命周期早期 shift the conversation。本文的目的是 bridge that gap,为开发人员提供所需的理解,以设计从第一天起就对私钥泄露更具弹性的系统。

案例研究:超额抵押借贷提供商

我们将使用一个 theoretical 超额抵押借贷提供商作为示例,说明不同级别的访问成熟度。对于不太熟悉借贷协议的人来说,以下功能通常需要某种级别的特权访问控制:

  • 列出/下架支持的资产(抵押品和可借资产)
  • 设置风险、利率参数和预言机来源
  • 收取协议费用/储备金
  • 在紧急情况下暂停/恢复协议功能
  • 升级合约

然而,这些访问控制机制的具体设计将 drastically change 整个系统对私钥攻击的脆弱性。

级别 1:高度暴露 - 单一 EOA 控制器

这是最不成熟、最基本的访问控制形式。在这种设置中,单个 EOA 持有借贷协议所有管理功能的 supreme authority。根据此密钥需要使用的频率,或在紧急情况下必须使用的速度,它可能必须存储在连接到互联网的计算机上的软件钱包中。这至少是不理想的。

成熟度级别 1:单点故障,一个 compromised EOA 意味着协议完全妥协

像这样的系统 compromise 风险巨大,compromise 的影响是 catastrophic and immediate。一旦私钥泄露,攻击者可以升级合约、窃取抵押品并摧毁协议。没有人能得到 Lambo。

如何改进到级别 2

缓解此单点故障的最直接步骤是过渡到使用多签名钱包,要求多个密钥持有者对任何行动达成共识。

请注意,虽然此操作降低了 compromise 风险,但如果您的私钥泄露,它不会改变潜在的损害范围。

级别 2:基本缓解 - 集中式多签

认识到单个 EOA 控制器的极端危险,成熟度的下一步涉及将管理权转移给多签名钱包,通常是 M-of-N Safe Wallet 或类似结构。

成熟度级别 2:集中式多签模型。需要多个签名者,但仍然存在单点控制

这种设置 definitely 比级别 1 有所改进,因为泄露单个签名者的密钥不再足以让攻击者接管协议。然而,如果足够多的签名者被泄露、串通或被操纵签署恶意交易,仍然存在 significant risks and potential impact:

  • 执行速度:一旦获得第 M 个签名,恶意行动可以立即执行,没有时间进行安全响应。
  • 单点控制:虽然故障点现在分布在 M 个密钥上,但控制点仍然是单一的。多签作为一个实体仍然持有对协议的 ultimate power,甚至 routine, low-risk 交易需要与协议升级相同的签名权限。一些利用高度保护的单点控制的黑客攻击示例包括 Bybit hack、WazirX 和 Radiant Capital。在这些黑客攻击中,攻击者能够 compromise 单一关键控制点(多签),尽管风险分布在多个故障点上。

如何改进到级别 3

如果您对级别 2 不印象深刻,我不怪您。从级别 2 移动到级别 3 是真正成熟之旅的开始。要达到下一个成熟度级别,需要实施两组控制:时间锁和最小权限原则(PoLP)。

时间锁是可以在行动批准和执行之间创建“延迟”的合约,允许时间进行审查和事件响应。

最小权限原则涉及逻辑上分离角色和职责,授予每个角色仅其特定功能所需的最低权限。这确保如果一个控制点被泄露,潜在损害被 contained,并且不会授予攻击者访问无关的关键系统功能的权限。

级别 3:增强控制 - 时间锁和角色分离

此级别通过解决级别 2 的核心弱点,在成熟度上实现了 significant leap:执行的即时性(使用时间锁解决)和控制的集中性(使用 PoLP 解决)。一些级别 3 协议的示例包括 Aave、Compound Finance 和 Lido。

成熟度级别 3:时间锁和角色分离为智能合约创建深度防御

当批准的行动可以立即在链上执行时,社区,更重要的是您的安全团队,没有时间响应。使用时间锁合约允许您创建一个新的、重叠的控制:取消已批准交易的能力。

当已批准交易在时间锁中等待时,团队可以使用 Tenderly 等链下工具监控它,并根据预期批准进行审查。如果签署了意外请求,时间锁给您的事件响应团队时间审查、取消它并启动事件响应过程。

适当监控和警报时间锁至关重要;没有它,控制就毫无价值,如 Beanstalk hack 所示,其中一天的时间锁未被监控,导致了可预防的黑客攻击。

通过遵循最小权限原则,我们可以识别系统中至少需要四个角色,将不同风险级别的职责 segregation 到不同的桶中:

  • 核心系统角色:此角色是系统中权限最高的,因此具有较大的多签阈值和时间锁延迟。由于此角色仅限于单一职责(升级合约),它不太可能经常使用,减少了多签钱包用于其他活动的操作风险。
  • 操作角色:此角色用于日常协议操作和配置。它使用中等长度的时间锁和中等多签阈值,以反映潜在泄露的较低影响。
  • 暂停守护角色:此角色负责在紧急情况下暂停协议。它不应 behind any kind of timelock,其多签阈值应相对较低,以允许在紧急情况下快速响应。
  • 取消守护角色:此角色可以取消在时间锁中挂起的已批准交易。您的安全团队应使用此角色取消未经授权的批准。根据您的事件响应过程设计,它可能是低阈值多签钱包或 EOA。

与级别 2 相比,级别 3 架构的风险 drastically reduced。我们已成功从一个控制点迁移到四个,并使用 PoLP 减少了由 compromised 控制点引起的影响。现在,您的事件响应团队实际上可以在多签泄露时停止事件。

然而,风险仍然存在:

  • 复杂性风险:引入多个角色、多个多签钱包和多个时间锁增加了系统复杂性,如果未仔细实施和彻底测试,会创建新的漏洞或错误配置途径。
  • 过度依赖暂停:暂停守护角色虽然对紧急情况必要,但不是万能药。攻击者变得更加 advanced,攻击通常在私有内存池中进行以防止主动识别。随着攻击者变得更加 advanced,暂停作为减少攻击影响的机制的效力可能会随着时间的推移而下降。

如何改进到级别 4

虽然大多数协议通常对级别 3 感到满意,但复杂性风险和紧急暂停效力的下降 necessitate 更高级别的访问成熟度。级别 4 代表任何成熟协议的 endgame,其中成熟度的特点是完全不需要强大行动,协议变得真正去中心化。

级别 4:终局:彻底不可变和用户主权

级别 4 代表访问控制设计成熟度的 pinnacle:完全消除管理行动的需要。这是协议可以做出的对去中心化和信任最小化的最极端承诺,并带来从协议威胁模型中 categorically eliminating 访问控制的好处。

成熟度级别 4:系统不可变,控制点很少(如果有的话)

实现级别 4 需要 drastically different 设计方法 than any other level thus far,大多数针对级别 4 的协议不是“纯”级别 4 协议。Uniswap 和 Liquity 是一些 strive for 级别 4 的最佳示例:它们不需要任何管理员管理来促进操作,但确实有一些极其有限的管理控制来允许费用/激励分配。

不要将级别 4 的哲学与 simply delegating control to a DAO or other bureaucratic entity 混淆;级别 4 协议不需要任何类型的托管控制来成功操作。

对于许多用例来说,级别 3 和级别 4 之间的设计转变 nearly insurmountable。考虑一个中心化交易所冷钱包:除非整个交易所成为去中心化协议,否则必须对钱包有某种级别的管理访问以将资金转移给用户。

对于完全链上协议,级别 4 是可能的但仍然 daunting;对于我们的超额抵押借贷系统,我们需要 fundamentally refactor 系统的设计。对于每个先前需要管理管理的组件,我们必须设计一个不需要任何管理的替代方案:

  • 可升级性。在级别 3 及以下,系统的智能合约可以升级以修复错误或添加新功能。在级别 4 协议中,系统的智能合约完全不可变。要向协议添加新功能,必须部署一套全新的合约,用户必须手动将资金转移到新系统。由于升级无法修复安全错误,系统的合约必须简单、简洁、经过 extremely well tested, verified, and reviewed。
  • 列出/下架资产。在大多数超额抵押借贷协议中,列出和下架资产是管理行动,因为如果添加抵押品是无许可的,恶意代币可能被利用来窃取抵押品。对于实现级别 4 的借贷协议,它可能支持自包含市场部署。在此系统中,要添加对新资产的支持,必须部署一个全新的、独立的借贷协议版本,并 explicitly 为该新资产或资产集配置。用户然后必须选择与此单独部署或具有不同资产的另一个部署交互。
  • 风险参数代表另一个通常由管理员管理的配置。在级别 4 借贷协议中,这些参数要么在新资产部署时永久设置,要么永久设置为遵循某种算法参数。由于这些值将永久设置,通过 rigorous modeling, testing, and verification 充分表征其行为至关重要。

设计级别 4 协议有 significant tradeoffs:紧急干预不可能;系统一旦部署就不灵活;并且有巨大的初始负担来验证设计的安全正确性和经济稳健性。

尽管有这些 tradeoffs,这种设计范式 categorically eliminates 访问控制风险,并且级别 4 协议中使用的许多设计模式可以改进系统安全性的其他方面。

级别 4 体现了去中心化赛博朋克精神的纯粹主义愿景,优先考虑不可变性和用户主权 above 管理灵活性。

为弹性设计,不仅仅是反应

当我们遍历访问控制成熟度的级别,从单个 EOA 控制器的 degen simplicity 到级别 4 的 radical cyberpunk immutability,一个单一的真相变得清晰:您设计协议的方式 fundamentally dictates 其对私钥泄露的脆弱性。

随着 2024 年 43.8% 的被盗资金源于私钥泄露,忽略架构访问控制不再可接受。虽然传统的漏洞狩猎仍然 essential,但这些设计决策必须在开发早期做出才能有效。

以下是一些您可以今天采取的主动步骤:

  • 根据成熟度框架评估您的协议。诚实地看待您所处的位置。大多数项目从级别 1 或 2 开始。
  • 为您的最高风险管理功能实施时间锁合约。即使此单一更改也 significantly improves 您的安全状况。确保这些时间锁合约得到充分监控,以确保您可以在未批准交易排队时响应。
  • 映射您协议的特权功能,并根据最小权限原则将它们 segregation 到逻辑角色中。
  • 考虑您系统的哪些组件可以从级别 4 不可变模式中受益,即使您的整体设计需要管理控制。

在 Trail of Bits,我们 champion 这种整体安全观。这就是为什么我们提供设计审查和设计阶段咨询等服务,专门针对开发生命周期早期的项目。这些服务允许团队接收专家指导和建议,以 proactively 解决这些基本问题,补充后来关注实现漏洞的传统代码审计。

最终,构建安全去中心化系统需要的不仅仅是狩猎漏洞。它要求承诺从第一天起为操作弹性设计。通过理解成熟度模型并有意识地选择最小化信任和限制泄露潜在影响的设计模式,您可以构建不仅创新而且真正 robust 对抗去中心化世界 evolving threats 的协议。

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