超越私钥风险:智能合约的成熟之路
“找出所有漏洞!”这是大多数协议在部署前保护智能合约的主要方法。团队大量投资于审计、竞赛、模糊测试和形式验证,旨在检测每一个漏洞。但去年加密货币黑客攻击的最大原因并不是智能合约漏洞。
答案:是私钥泄露!
私钥攻击是一种新兴的攻击向量, narrowly scoped 的智能合约审计和竞赛可能会忽略这些攻击。协议对这些攻击的敏感程度取决于其设计,特别是访问控制的成熟度。在本博客中,我们将演示如何设计能够安全容忍私钥泄露的协议,使用多签、时间锁、最小权限原则以及最小化私钥使用的设计方法。
私钥泄露已成为最成功的攻击方式
根据 Chainalysis 的 2024 年报告,通过黑客攻击窃取的资金中有惊人的 43.8% 源于私钥泄露 - 比其他已验证的攻击类型高出五倍。私钥泄露是一个危险新兴威胁的明显例子,每个工程师在设计新智能合约和协议时都必须考虑。
设计决定风险,历史上很少有区块链协议认真将经过身份验证的智能合约访问视为重要的风险向量。这种 oversight 得到了区块链安全生态系统运作方式的强化:由区块链原生公司进行的审计很少将架构访问控制问题标记为正式发现,而竞赛平台 actively 阻止此类提交,以 favor 代码级漏洞。
这种 narrow focus 与其他行业 established 安全实践形成对比,在其他行业中,像权限提升和访问控制设计这样的架构风险是在安全参与过程早期解决的基本问题。
在 Trail of Bits,我们使用我们的 Codebase Maturity Evaluation 来标记架构访问控制问题。然而,大多数区块链协议只在软件开发生命周期的最后阶段寻求外部输入和审查,此时几乎没有时间和机会来修复系统性访问控制问题。
这就是为什么我们需要在开发生命周期的早期转变对话。本博客的目的是弥合这一差距,为开发人员提供所需的理解,以设计从第一天起就对私钥泄露更具弹性的系统。
案例研究:一个超额抵押贷款提供商
我们将使用一个理论上的超额抵押贷款提供商作为例子来说明不同级别的访问成熟度。对于那些不太熟悉贷款协议的人,以下功能通常需要某种级别的特权访问控制:
- 列出/取消列出的支持资产(抵押品和可借资产)
- 设置风险、利率参数和预言机来源
- 收取协议费用/储备金
- 在紧急情况下暂停/取消暂停协议功能
- 升级合约
然而,这些访问控制机制的具体设计将 drastically 改变整个系统对私钥攻击的脆弱性。
级别 1:高度暴露 - 单一 EOA 控制器
这是最不成熟、最基本的访问控制形式。在这种设置中,一个单一的 EOA 持有对贷款协议所有管理功能的最高权限。根据该密钥需要使用的频率,或在紧急情况下必须使用的速度,它可能必须存在于连接到互联网的计算机上的软件钱包中。至少可以说,这并不理想。
成熟度级别 1:单点故障,一个受损的 EOA 意味着完全的协议妥协
像这样的系统的泄露风险是巨大的,而泄露的影响是灾难性的和 immediate 的。一旦私钥被泄露,攻击者可以升级合约、窃取抵押品并摧毁协议。没有人能得到兰博基尼。
如何改进到级别 2
缓解这种单点故障的最直接步骤是过渡到使用多签名钱包,要求任何行动都需要多个密钥持有者的共识。
请注意,虽然此操作降低了泄露风险,但如果您的私钥被泄露,它不会改变潜在的损害范围。
级别 2:基本缓解 - 集中式多签
认识到单一 EOA 控制器的极端危险,成熟度的下一步涉及将管理权限转移到一个多签名钱包,通常是一个 M-of-N Safe Wallet 或类似结构。
成熟度级别 2:集中式多签模型。需要多个签名者,但仍然存在单点控制
这种设置肯定比级别 1 有所改进,因为泄露单个签名者的密钥不再足以让攻击者接管协议。然而,如果有足够的签名者被泄露、串通或被操纵签署恶意交易,仍然存在重大风险和潜在影响:
- 执行速度:一旦获得第 M 个签名,恶意行动可以立即执行,没有时间进行安全响应。
- 单点控制:虽然故障点现在分布在 M 个密钥上,但控制点仍然是单一的。多签作为一个实体仍然持有对协议的最终权力,即使是常规的、低风险交易也需要与协议升级相同的签名权限。一些利用高度保护的单点控制的黑客攻击例子包括 Bybit hack、WazirX 和 Radiant Capital。在这些黑客攻击中,攻击者能够 compromise 单一关键控制点(多签),尽管风险分布在多个故障点上。
如何改进到级别 3
如果你对级别 2 不感兴趣,我不怪你。从级别 2 移动到级别 3 是真正成熟之旅的开始。要达到下一个成熟度级别,需要实施两组控制:时间锁和最小权限原则(PoLP)。
时间锁是可以在行动批准和执行之间创建“延迟”的合约,允许时间进行审查和事件响应。
最小权限原则涉及逻辑上分离角色和职责,授予每个角色仅其特定功能所需的最低权限。这确保如果一个控制点被泄露,潜在损害被遏制,并且不会授予攻击者访问无关的关键系统功能的权限。
级别 3:增强控制 - 时间锁和角色分离
这个级别通过解决级别 2 的核心弱点,在成熟度上实现了 significant leap:执行的即时性,通过使用时间锁解决;以及控制的集中性,通过使用 PoLP 解决。一些级别 3 协议的例子包括 Aave、Compound Finance 和 Lido。
成熟度级别 3:时间锁和角色分离为智能合约创建深度防御
当一个批准的行动可以立即在链上执行时,社区,更重要的是,您的安全团队,没有时间响应。使用时间锁合约允许您创建一个新的、重叠的控制:取消已批准交易的能力。
当一个已批准的交易在时间锁中等待时,团队可以使用像 Tenderly 这样的链下工具来监控它,并根据预期批准进行审查。如果签署了意外请求,时间锁给您的事件响应团队时间进行审查、取消它,并启动事件响应过程。
适当监控和警报时间锁是关键的;没有它,控制是毫无价值的,正如在 Beanstalk hack 中所见,那里的一日时间锁未被监控,导致了可预防的黑客攻击。
通过遵循最小权限原则,我们可以识别系统中至少需要四个角色,将不同风险级别的职责分离到不同的桶中:
- 核心系统角色:此角色是系统中最特权的,因此,具有较大的多签阈值和时间锁延迟。由于此角色仅限于单一职责(升级合约),它不太可能经常使用,减少了多签钱包用于其他活动的操作风险。
- 操作角色:此角色旨在用于日常协议操作和配置。它使用中等长度的时间锁和中等多签阈值,以反映潜在泄露的较低影响。
- 暂停守护者角色:此角色负责在紧急情况下暂停协议。它不应 behind 任何类型的时间锁,其多签阈值应相对较低,以允许在紧急情况下快速响应。
- 取消守护者角色:此角色可以取消在时间锁中挂起的已批准交易。您的安全团队应使用此角色取消未经授权的批准。根据您的事件响应过程设计,它可能是一个低阈值多签钱包或一个 EOA。
与级别 2 相比,级别 3 架构的风险 drastically reduced。我们已成功从一个控制点迁移到四个,并使用 PoLP 减少了由受损控制点引起的影响。现在,您的事件响应团队实际上可以在多签泄露的情况下停止事件。
然而,风险仍然存在:
- 复杂性风险:引入多个角色、多个多签钱包和多个时间锁增加了系统复杂性,如果不仔细实施和彻底测试,会为错误或错误配置创造新途径。
- 过度依赖暂停:暂停守护者角色,虽然是紧急情况所必需的,但不是万能药。攻击者已变得更加先进,攻击通常在私有内存池中进行,以防止主动识别。随着攻击者变得更加先进,暂停作为减少攻击影响的机制的效力可能会随着时间的推移而下降。
如何改进到级别 4
虽然大多数协议通常对级别 3 感到满意,但复杂性风险和紧急暂停效果的 decreasing necessitates 一个更高水平的访问成熟度。级别 4 代表了任何成熟协议的最终目标,其成熟度的特点是完全移除对强大行动的需求,协议变得真正去中心化。
级别 4:最终目标:激进不可变性和用户主权
级别 4 代表了访问控制设计中的成熟度 pinnacle:完全消除管理行动的需求。这是协议可以做出的对去中心化和信任最小化的最极端承诺,并且它具有从协议威胁模型中 categorically 消除访问控制的好处。
成熟度级别 4:系统是不可变的,控制点很少,如果有的话
实现级别 4 需要一种 drastically 不同的设计方法,比迄今为止的任何其他级别都要不同,大多数针对级别 4 的协议不是“纯”级别 4 协议。Uniswap 和 Liquity 是一些 strive for 级别 4 的最佳例子:它们不需要任何管理员管理来促进操作,但确实有一些极其有限的管理控制来允许费用/激励分配。
不要将级别 4 的哲学与简单地将控制委托给 DAO 或其他官僚实体混淆;级别 4 协议不需要任何类型的管理控制来成功运作。
对于许多用例来说,级别 3 和级别 4 之间的设计转变几乎是 insurmountable 的。考虑一个集中式交易所冷钱包:除非整个交易所成为一个去中心化协议,否则必须对钱包有某种级别的管理访问权限才能将资金转移给用户。
对于完全链上协议,级别 4 是可能的,但仍然 daunting;对于我们的超额抵押贷款系统,我们需要 fundamentally 重构系统的设计。对于每个以前需要管理管理的组件,我们必须设计一个不需要任何管理的替代方案:
- 可升级性。在级别 3 及以下,系统的智能合约可能会被升级以修复错误或添加新功能。在级别 4 协议中,系统的智能合约是完全不可变的。要向协议添加新功能,必须部署一套全新的合约,用户必须手动将资金转移到新系统。由于升级无法修复安全错误,系统的合约必须简单、简洁、经过 extremely well 测试、验证和审查。
- 列出/取消列出资产。在大多数超额抵押贷款协议中,列出和取消列出资产是管理行动,因为如果添加抵押品是无许可的,恶意代币可能会被利用来窃取抵押品。对于贷款协议要实现级别 4,它可能支持自包含的市场部署。在这个系统中,要添加对新资产的支持,必须部署一个全新的、独立的贷款协议版本,并明确配置用于该新资产或资产集。然后用户必须选择与此独立部署或具有不同资产的另一个部署进行交互。
- 风险参数 代表另一个通常由管理员管理的配置。在级别 4 贷款协议中,这些参数要么在新资产部署时永久设置,要么永久设置为遵循某种算法参数。由于这些值将被永久设置,通过 rigorous 建模、测试和验证来 well-characterized 它们的行为是 critically important 的。
设计级别 4 协议有 significant tradeoffs:紧急干预是不可能的;系统一旦部署就不灵活;并且在验证设计的安全正确性和经济稳健性方面存在巨大的初始负担。
尽管有这些 tradeoffs,这种设计范式 categorically 消除了访问控制风险,并且级别 4 协议中使用的许多设计模式可以改进系统安全的其他方面。
级别 4 体现了一种纯粹主义者对去中心化赛博朋克精神的愿景,优先考虑不可变性和用户主权,而不是管理灵活性。
为弹性设计,不仅仅是反应
当我们遍历访问控制成熟度的各个级别,从单一 EOA 控制器的 degen 简单性到级别 4 的激进赛博朋克不可变性时,一个单一的真相变得清晰:您设计协议的方式 fundamentally 决定了其对私钥泄露的脆弱性。
随着 2024 年 43.8% 的被盗资金源于私钥泄露,忽略架构访问控制不再可接受。虽然传统的漏洞搜寻仍然是 essential 的,但这些设计决策必须在开发过程中更早做出才能有效。
以下是一些您可以立即采取的主动步骤:
- 根据成熟度框架评估您的协议。诚实地面对自己的现状。大多数项目从级别 1 或 2 开始。
- 为您的最高风险管理功能实施时间锁合约。即使是这一单一更改也能 significantly 改善您的安全状况。确保这些时间锁合约得到充分监控,以确保您可以在未批准交易排队时响应。
- 映射您协议的特权功能,并根据最小权限原则将它们分离到逻辑角色中。
- 考虑您系统的哪些组件可以从级别 4 不可变性模式中受益,即使您的整体设计需要管理控制。
在 Trail of Bits,我们 champion 这种整体安全观。这就是为什么我们提供像设计审查和设计阶段咨询这样的服务,专门为处于开发生命周期早期的项目量身定制。这些服务允许团队接收专家指导和建议,以主动解决这些基本问题, complementing 传统代码审计,后者 later on 关注实现漏洞。
最终,构建安全的去中心化系统需要的不仅仅是搜寻漏洞。它要求承诺从第一天起就为操作弹性而设计。通过理解成熟度模型并有意识地选择最小化信任和限制泄露潜在影响的设计模式,您可以构建不仅创新而且真正 robust 对抗去中心化世界 evolving 威胁的协议。