Wormhole 安全 - 治理者

本文档介绍了Governor的设计,旨在限制特定漏洞的影响,通过赋予 Guardians 延迟来自已注册Token Bridge的Wormhole消息的选项来实现,特别是当其总名义价值非常大时,给守护者24小时的时间来删除通过软件错误创建的消息,而不是准确地表示原始链的状态,从而防止了漏洞利用。

Governor

目标

如果注册的 Token Bridge 的 Wormhole 消息的总名义价值非常大,则赋予 Guardian 延迟这些消息的选项,以此来限制某些漏洞利用的影响。

背景

如果没有任何额外的安全缓解措施,核心消息桥的单个完整性故障可能会对建立在 Wormhole 之上的 Token Bridge 的用户造成灾难性后果。例如,在 2022 年 2 月 2 日,Solana 核心智能合约中的一个漏洞被利用,以在 Solana 上恶意铸造 wETH,随后它被桥接回以太坊。

该桥有多种潜在的故障模式:

  • 在 Wormhole 安全计划范围内:
    • 智能合约中的错误
    • Guardian 软件中的错误
    • Guardian 密钥泄露
  • 不在 Wormhole 安全计划范围内:
    • 区块链智能合约运行时或 rpc 节点中的错误
    • 分叉

即使 Wormhole 的代码和操作是完美无缺的,如果存在源链的漏洞,它仍然可能产生“无效”消息:源链智能合约运行时中的“错误”导致了不希望的 Wormhole 消息,这些消息可以由社区修补,从而有效地导致分叉,从而还原这些 Wormhole 消息。rpc 节点中的错误可能导致 Guardian 无法准确查看链上状态。

如果 Token Bridge 的传输是无限且即时的,则单个连接链中的错误可能导致整个 Token Bridge 被耗尽。

目标

如果 Guardian 决定启用此功能:

  • 如果来自注册的 Token Bridge 的 Wormhole 消息的名义价值过大,则将其延迟 24 小时。
  • 这使 Guardian 有机会删除待处理的消息,如果这些消息是通过软件错误创建的,并且不能准确地代表源链的状态。
  • 防止女巫攻击,即即使攻击者试图通过将一个大型转账拆分成多个小型转账来使其看起来像是有机活动,此功能也应起作用。

非目标

  • 在 Guardian 之间同步状态。每个 Guardian 可能对网络有稍微不同的看法,包括 Governor 配置、Token Bridge 传输的排序和完整性等。Governor 是一个本地功能,它基于每个 Guardian 对网络的个人看法做出决策。
  • 防止服务质量下降攻击,其中一个不良行为者导致大多数传输被延迟。

高级设计

延迟决策逻辑

配置

  • 对于每个链,mainnet_chains.go 中指定了一个以基础货币(美元)计价的 单笔交易阈值 和一个 24 小时阈值
  • 一系列重要的 Token 在 manual_tokens.gogenerated_mainnet_tokens.go 中指定。Governor 不会跟踪未在此列表中的 Token。此列表是选择加入的,以防止交易量稀少的 Token 使用不可靠的价格 Feed 来计入阈值。

Governor 将基于 Token 的交易分为两类:小额交易和大额交易。

  • 小额交易:小于转账发起链的单笔交易阈值的交易被认为是小额交易。在任何 24 小时滑动窗口期间,Guardian 将签署总价值不超过 24 小时阈值的 Token Bridge 转账,而没有最终确定延迟。当小额交易超过此限制时,它们将被延迟,直到 24 小时滑动窗口中有足够的空间为止。交易要么符合条件,要么被延迟,它们不会被人为地拆分成多个交易。如果一笔小额交易被延迟超过 24 小时,它将立即被释放,并且不会计入 24 小时阈值。
  • 大额交易:大于转账发起链的单笔交易阈值的交易被认为是大型交易。所有大型交易在 Wormhole Guardian 签署之前都有 24 小时的强制最终确定延迟。这些交易不会影响 24 小时阈值计数器。

资产定价

由于阈值以基础货币计价,因此 Governor 必须知道以这种基础货币计价的转账的名义价值。为了确定 Token 的价格,它使用以下各项的 最大值

  1. 硬编码最低价格:此价格被硬编码到 Governor 中,并且基于一个固定的时间点(通常在 Wormhole Guardian 发布期间),该时间点轮询 CoinGecko 以获取已知的一组受管 Token。
  2. 动态价格:此价格以 5-10 分钟的间隔从 CoinGecko 动态轮询。

Token 配置位于 manual_tokens.gogenerated_mainnet_tokens.go 中。

如果 CoinGecko 为 Token 提供了错误的低价,则 Governor 会优先考虑安全,而改用硬编码的最低价格。

可见性

每个 Guardian 都在 Wormhole Gossip 网络上发布其 Governor 配置和状态,任何人都可以通过 Guardian 侦察员(说明)订阅。一些 Guardian 还通过公共 API 提供 Governor 状态,该状态可以在 Wormhole Dashboard 上可视化。一个功能更丰富的 Wormhole Explorer 正在开发中,它将汇总所有 Guardian 的 Governor 状态。

安全考虑

  • Governor 只能减少漏洞利用的影响,但不能阻止它。
  • 过高的转账活动,即使是人为制造的而不是有机的,也会导致交易被延迟长达 24 小时。
  • 如果 CoinGecko 报告的 Token 价格过高,则 24 小时阈值将更快耗尽。
  • Guardian 需要在 24 小时的时间窗口内手动响应错误消息。预计所有 Guardian 都会对协议进行抵押品监控,同时考虑到 Governor 队列。在抵押不足的情况下,所有 Guardian 都应具有警报和事件响应程序。
  • 攻击者可以利用流动性池和其他桥来洗钱非法铸造的包装资产。

详细设计

Governor 被实现为一个额外的软件包,该软件包定义了 (1) 一个 ChainGovernor 对象,(2) mainnet_tokens.go,一个将被监控的 Token 的单个映射,以及 (3) mainnet_chains.go,一个由链 Governor 管理的链的映射。

mainnet_tokens.go 映射了一个 Token 列表,其中包含硬编码的 Token 最低价格和从 CoinGecko 读取的最新价格之间的最高价格。

如果启用了节点级别配置参数以指示已启用链 Governor,则所有 VAA 将传递给 ChainGovernor 以执行一系列额外的检查,以指示是否可以发布消息,或者是否不应发布消息并由处理器丢弃。

执行的检查包括:

  1. 消息的源链是否在 mainnet_chains.go 中列出?
  2. 消息是否从受管的 emitter 发送?
  3. 消息是否为已知的价值转移类型?
  4. 转移的 Token 是否在 mainnet_tokens.go 中列出?
  5. 交易是否为“大型”交易(即,大于或等于该链的 bigTransactionSize)?
  6. 交易是否为“小型”交易(即,小于该链的 bigTransactionSize)?

以上检查将产生 3 种可能的情况:

  • 非受管消息:如果消息未通过检查 (1-4),ChainGovernor 将指示可以发布该消息。
  • 受管消息(大型):如果消息是“大型”的,ChainGovernor 将等待 24 小时后再签署 VAA,并将消息放入队列中。
  • 受管消息(小型):如果消息是“小型”的,ChainGovernor 将确定其是否适合该链的 dailyLimit。如果适合,它将立即被签署。如果不适合,它将在队列中等待直到适合。如果它在 24 小时内不适合,它将从队列中释放。

当消息排队时,任何 Guardian 都有机会使用自己的欺诈检测流程来确定消息是否是欺诈性的。如果 Guardian 确定消息是欺诈性的,他们可以从自己独立管理的队列中删除该消息。如果超级少数派的 Guardian(19 个中的 7 个)从他们的队列中删除一条消息,则此欺诈性消息将被有效地审查,因为它无法再达到超级多数的法定人数。

在此设计中,有三种发布排队消息的机制:

  • 法定人数(19 个中的 13 个)的 Guardian 可以手动覆盖 Governor 并释放任何待处理的消息。
    • 通过此机制发布的消息不会被添加到已处理交易的列表中,以避免影响由滑动窗口维护的每日名义限制。
  • 随着滑动窗口和交易的名义价值的变化,Guardian 将定期检查是否可以在不超过每日名义限制的情况下发布消息。
    • 通过此机制发布的消息将被添加到已处理交易的列表中,因此将计入每日名义限制。
  • 消息将在最长时间限制后自动释放(此时间限制可以通过治理进行调整,目前设置为 24 小时)。
    • 通过此机制发布的消息不会被添加到已处理交易的列表中,以避免影响由滑动窗口维护的每日名义限制。

运营考虑

延长释放时间以有更多时间进行调查

Guardian 运营商可以使用 ChainGovernorResetReleaseTimer 管理 RPC 或 governor-reset-release-timer [VAA_ID] <num_days> 管理命令将延迟重置为指定的天数 (num_days),最多 7 天。省略参数默认为 1 天。

从 Governor 中删除消息

Guardian 运营商可以使用 ChainGovernorDropPendingVAA 管理 RPC 或 governor-drop-pending-vaa [VAA_ID] 管理命令从 Governor 队列中删除 VAA。请注意,在大多数情况下,这应与断开链或阻止某些消息一起完成,否则消息可能会通过自动观察请求重新观察到。

潜在的改进

目前,添加更多受管的 emitter 需要修改 Guardian 代码。将来,能够动态添加新的合约供 Guardian 节点观察将是理想的。

  • 原文链接: github.com/wormhole-foun...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
wormhole-foundation
wormhole-foundation
江湖只有他的大名,没有他的介绍。