本文讨论了Kusama网络中Karura链发生的一次安全事件,攻击者利用了XCM协议的配置错误和旧版代码的漏洞,导致Karura链上的KSM代币被盗。文中详细描述了事件的经过、措施以及从中汲取的教训,强调了在引入未审计代码时进行仔细验证的重要性,以及如何通过引入更加严格的代码审查和应对机制来增强系统安全性。
Kusama网络是未经审计的、预生产代码的实验温床,作为Polkadot的狂野表亲和有些轻率的开拓者,该网络充分体现了其“期待混乱”的口号,并经历了另一场冒险。Kusama以其“价值承载测试网”的目的,激励安全分析师在代码投入生产使用之前找到并展示漏洞。恰巧在攻击者的账户中剩下了1 KSM,这也可以看作是发现者费用(如果在攻击发生前几个星期该漏洞没有被修复,结果可能会更多)。
Karura团队(Kusama的一个平行链)发现,Kusama Relay链上Karura平行链持有的KSM代币余额与Karura代币托盘中记录的KSM总数不匹配。具体来说,Karura平行链账户持有的KSM比可以解释的少11,000.00 KSM。该团队识别出若干可疑的XCM交易,这些交易将KSM代币从Karura平行链账户转出:
然后,他们采取了三项行动。他们通知了中心化的生态系统基础设施提供商有关包含被盗资金的账户;他们协助Karura治理机构调用了一个特别的应急计划托盘,以立即禁用发送原始XCM交易的能力;他们请求Kusama Relay链的去中心化治理机构帮助恢复资金。
作为后者的结果,动议373被理事会提出来以恢复转移的资金(包括10,000 KSM),随后是技术委员会关于快速审议的提案及该提案本身。Kusama治理机构故意将审议和执行的时间保持在最小,以最大限度地提高恢复被盗资金的机会,如果攻击者在投票期间转移了资金,则无法生效:
强制转移的公投获得批准并执行,9,999.00 KSM被转回到Karura平行链账户。注意:此动议因为之前两次(公投141和142)由于错误使用图像注册外部程序而未能执行,因实施周期过短。
剩余的1,000 KSM被攻击者烧毁,我们预计会有提案提交给Kusama理事会,要求将这缺失的KSM重新铸回Karura主权账户。
在问题的性质变得清晰后,所有平行链团队都收到了明确的说明,提供补救步骤的指示。虽然Statemine并不易受同样的漏洞攻击,但是它立即进行了bug修复:
自那以后,所有连接到Kusama网络的平行链都根据需要进行了补丁和代码升级,并且没有检测到其他成功或失败的攻击。
这次事件是由于Karura链上三个因素的叠加:
这些因素的结合导致攻击者能够执行一条消息,并从Relay链上的Karura储备账户中进行提款。
尽管XCM v2在Kusama Relay链上使用并接近审计完成且未发现重大问题,但XCM v0和v1是早期修订版,未经审计且不适用于生产。虽然Kusama是一个未经审计的预生产网络,但由于XCM的攻击面很大,用户有效地执行手工制作的XCM消息的能力被故意禁用。
这可以在Kusama运行时代码中看到:
impl pallet_xcm::Config for Runtime {
// ...但它们必须匹配我们的过滤器,过滤器拒绝所有内容。
type XcmExecuteFilter = Nothing;
}
以及在原始Statemine代码中:
/// 本链上的本地来源不允许调度 XCM
/// 发送/执行。
pub type LocalOriginToLocation = ();
不幸的是,当相应的代码部分被引入到Karura时,注释保持不变但其底层代码却有了相当大的不同:
/// 本链上的本地来源不允许调度 XCM
/// 发送/执行。
pub type LocalOriginToLocation = (
SignedToAccountId32<Origin, AccountId, RelayNetwork>,
);
这移除了护栏,使任何人(包括我们的攻击者)都能在Karura上执行任何XCM消息,打开了XCM v0/v1的庞大攻击面。
Kusama已经升级到XCM v2,这是期待通过审计并进入Polkadot Relay链的第一个XCM版本,但Karura(和Statemine)尚未升级到XCM v2。结果发现,XCM v1中存在一个问题,使得发生有限特权提升成为可能。通过重写大部分代码,XCM v2便不再包含这种故障。
攻击者利用该配置错误来访问旧版XCM中的漏洞。他们提交了一个交易以执行包含𝙸𝚗𝚒𝚝𝚒𝚊𝚝𝚎𝚁𝚎𝚜𝚎𝚛𝚜𝚆𝚒𝚝𝚑𝚍𝚛𝚊𝚝的XCM消息,该消息随后发送了一条𝚆𝚒𝚝𝚑𝚍𝚛𝚊𝚝𝙰𝚜𝚜𝚎𝚝消息到Relay链,将Karura的KSM转移到他们控制的账户。在XCM v2中,这将(正确地)失败,但以前版本的XCM中包含一个 bug,导致其成功。
攻击者无法利用相同漏洞攻击Statemine,因为它作为公共资产平行链,在Relay链上没有KSM储备账户。没有放弃,他们在大约一天后(10月13日中欧时间1600)尝试了一些其他攻击,但均没有成功,主要是由于Kusama Relay链此时已经升级到XCM v2。
Polkadot上任何非平凡的代码必须首先经过第三方安全审计,通常由SR Labs的团队完成。由于XCM尚未完全审计,因此这里涉及的任何代码都不在Polkadot上,或曾经存在于Polkadot上。
- 原文链接: medium.com/kusama-networ...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!