查看原文
其他

Polkadot 跨链信息 XCM v2 的审计简要概述

PolkaWorld 2022-04-06

The following article is from Polkadot 中文平台 Author Polkadot






Parity Tech 授权 Quarkslab 审计 XCM 版本2 (XCMv2),这是一种交叉共识通信机制。这种消息协议是 Polkadot 生态系统的基石,因为它支持网络链之间的通信。这篇博客文章总结了与这项技术及其实现机制的相关安全信息。完整的审计报告以 PDF 格式在本文末尾提供。



介绍


Parity Tech 正在积极开发与 Polkadot 生态系统相关的产品。Polkadot 最近启动了众贷进程,这是其长期规划目标的一部分,即创建一个通过中继链互连的区块链网络,以进行跨链交换。


在这种情况下,Parity 正在研究 XCM (交叉一致性消息传递),它提供了一种通用格式,使基于 Substrate 的区块链能够与中继链通信以及实现相互之间的通信。这个来自原始 Polkadot 设计的元件对于 Polkadot 实现多链网络是必不可少的。它支持可替代和不可替代的资产转移以及远程外部调用。


总体而言,网桥和跨链技术将在未来几个月或几年内发挥重要作用,将不一定使用相同技术或共识规则的区块链互联起来。其中包括 EVM 区块链的 Hop,将比特币连接到 Polkadot 的 Interlay 或旨在连接多种区块链技术的 Axelar Network。


XCM 遵循类似的目标,并致力于在未来达成共识。Polkadot 的创始人Gavin Wood 认为 XCM 目标是“共识系统之间交流思想的语言”。


在平行链获得 Polkadot 插槽之前,Quarkslab 会对 XCMv2 进行审核,因此在区块链的支持激活之前,另一家审计公司已经进行了额外的安保审计。


审计旨在发现任何跨链相关的安全问题,如两个链上不正确的锁定 / 解锁或铸造,或链之间出现的任何公平性问题。这还包括逻辑错误、拒绝服务和任何可能影响安全的错误配置 (默认设置)。


这篇博客文章旨在提供 XCM 事务内部工作的一瞥,尤其是基于 VM 的消息处理设计。它还强调了在激活平行链上的 XCM 之前要执行的关键安全性和健全性检查。



快速了解 XCM 虚拟机


Gavin Wood 在他的博客文章三部曲和 Shawn Tabrizi 的研讨会中详细描述了 XCM 的设计和两个主要用例——储备转移资产和传送资产。Moonbeam 还提供了关于 XCM 及其与XC-20代币使用的多种教育内容。


XCM 的用户应用程序已经被很好地描述了,让我们关注当在两个链之间转移资产时在引擎盖下发生了什么。核心组件是XCM 虚拟机 (XCVM)。事实上,交换的信息是按比例编码的指令操作码[6]。消息实质上是执行各种操作的指令列表,如从账户中提取资产、存款、启动转账等。


当接收到一个新消息时,一个新的 VM 在消息执行的生命周期内被实例化。一些指令会更新虚拟机的寄存器。这些登记簿包含来源 (执行操作的身份)、持有 (被操纵的资产)和处理重量成本、盈余和退款金额的交易者。VM 还包含一个指令指针,用于寻址要执行的当前消息指令。类似地,它包含指向错误处理程序和附录处理程序的寄存器。


让我们考虑从中继链到平行链的资产转移。在这种情况下,用户从其本地账户中提取资金,并将其转移到 XCVM,XCVM 最终会烧毁资产。然后,该链必须向远程链发送消息,以完成铸造并向用户在平行链上的账户中存入等量的资产。完整的初始消息如下:


Xcm(vec![    WithdrawAsset(assets),    InitiateTeleport {        assets: Wild(All),        dest,        Xcm(vec![            BuyExecution { fees, weight_limit },            DepositAsset { assets: Wild(All), max_assets, beneficiary },        ]);    }]);



在这种情况下,目的地链必须接受始发链作为传送者,即在它自己的 XCM 配置中,接收方可以相信发送方在传送资产之前正确地销毁了资产的来源。否则,在目标链上执行接收传送资产将拒绝该消息,因为源寄存器将不受信任。这就是为什么正确配置 XCM 是一项关键任务的原因之一。让我们继续讨论一下 XCM 配置的相关内容。



激活 XCM 前的验证清单


平行链开发人员不一定需要理解 XCM 执行器的深层复杂性,但是 Pallet 配置留下了许多应该小心处理的配置杠杆。事实上,正如报告中强调的那样,一些配置方面是相互依赖的。这里有一个快速备忘录,在激活 XCM 或接受与链交换信息之前要验证的事情。


在下面的列表中,XCM Pallet 和 XCM 执行人配置的元素被混合,事实上,XCM 执行人的配置被嵌套为 XCM Pallet 的配置元素。它们标有“Pallet”或“执行者”注释。


  过滤器(Pallet)


XcmExecuteFilter、XcmTeleportFilter和 XcmReserveTransferFilter 这三个过滤器是首先要查看的配置类型。这些过滤器是一个断言机制,分别用于 execute、teleport 和 reserve _ transfer extrinsics (以及它们的极限加法)。这些类型实现了 Rust trait (或接口) Contains,它只需要一个简单的方法,如果这个方法“包含”输入值,就返回 true。两个基本实现 Everything 和 Nothing 分别返回 true 和 false,这以前被称为 AllowAll 和 DenyAll。这些过滤器是启用或禁用 XCM Pallet 的核心功能的简单方法,这些功能是最有用的外部设置,通过 teleport 和 reserve _ transfer extrinsics 的特权来执行或发送消息。


  原点转换器(Pallet)


ExecuteXcmOrigin 和 SendXcmOrigin 确保哪个源可以分别执行 execute 和 send extrinsics。它们必须实现EnsureOrigin特征。通常,在 Polkadot 或 Kusama 运行时,由许多转换器组成的 LocaloriginToLocation 元组将 Origin 转换为 MultiLocation,从而允许 Origin 或否定。例如,SignedToAccountId32 实现将带符号的原点转换为对应于链上特定帐户的 MultiLocation。注意,execute 只有一个过滤器和一个 XCM 原点转换器。


  障碍项(执行者)


执行器中需要查看和验证的设置之一是障碍项。这是执行者根据执行费用过滤消息的有效机制。可以实现复杂的逻辑来允许自由执行某些类型的消息,并要求为其他消息付费。屏障类型通常是实现 ShouldExecute 特征的多个结构的元组;元组实现的每个结构都被按顺序调用,直到一些返回 Ok() 或全部失败(参见元组实现)。在 xcm/xcm-builder/src/barriers . RS 文件中,可以找到许多通用实现,这些实现可以组合起来应用自定义定价策略。更多信息可在报告中找到,因为对平行链模板的障碍项的默认配置进行了审核。


  可信来源(执行者)


IsTeleporter 和 IsReserve 设置对于 XCM 执行者知道哪个起点可以被信任接受传送和储备传送是至关重要的。它们实现了 FilterAssetLocation 特征,并且可以合并成元组。它们用在 ReceiveTeleportedAsset 和 ReserveAssetDeposited 指令执行代码中,并用作在目标系统上执行资产创建之前的判定。这个创建过程就是为什么你必须确保你相信发送者已经在另一端保留或烧毁了资产,即正确地执行原始 XCM 指令。


  权重器(全部)


权重器适用于用于 XCM Pallet 和 XCM 执行器配置。例如,它们将被用于衡量执行器中新设置的错误或附录处理程序,或者调整 XCM Pallet 中传送或保留非本征调用的权重。它们实现了 WeightBounds特征。一个不符合要求的权重器会提供免费或廉价的执行信息,这也可能会被 XCM 消息所利用。XCM 生成器文件中的权重实现对大多数指令来说都很简单,它通过指令添加了一个恒定的基本权重,只有 Transact、SetErrorHandler 和 SetAppendix 稍微复杂一些,因为它们本身包含嵌套指令或可调度调用。


  发送器(Pallet)


最后要检查的是发送方或路由器。它必须实现 SendXcm 特征,这基本上是技术实现方法,接受目的地和 Xcm 消息。可以通过创建元组来组合多个发送者。审计过程中,在 Polkadot 运行时,唯一的发送方是 ChildParachainRouter,它通过将消息存放到适当的副链的向下消息传递(DMP) 队列中,将消息发送到平行链。



审计报告


审计由两名安全工程师进行,为期 50天。该测试分别在 Polkadot runtime v0.9.13 和 Cumulus v6.0.0 上进行,没有发现重要的安全问题。该报告讨论并描述了多个 XCM 组件的底层安全机制。因此,挖掘 XCM 的内部运作对任何人来说都可能是有趣的。


完整审计报告:https://blog.quarkslab.com/resources/2022-02-27-xcmv2-audit/21-12-908-REP.pdf



结论


配置 XCM 应该以一种非常保守的方式进行。然后,只有在自由选择的情况下,链才应该允许一些消息通过。大多数 XCM 资产转移的安全问题被归结为决定谁是值得信赖的储备或作为一个传送源。这需要小心进行,因为在接收资产时,目前没有机制来确保它们已经在原始链上被正确锁定/烧毁。在这种情况下,信任是共享的,两个链都假定另一个链表现良好。


跨链通信协议正在快速发展,就使用和潜在用例而言,大多数都处于起步阶段。在 Polkadot 中,XCMv2 已经部署在中继链上。此外,下一个版本 XCMv3 [8]已经在开发中,它将带来新的特性并改进当前版本。


感谢 Parity 使这一评估成为可能,并感谢他们在审计期间的响应。


原文链接:

https://blog.quarkslab.com/a-brief-overview-of-auditing-xcmv2.html



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存