Cosmos 联合创始人:一个密码学漏洞引发的币安跨链桥攻击

原文作者:Cosmos 联合创始人 Ethan Buchman,由 DeFi 之道翻译编辑。

(注:配图由无界版图 AI 工具生成)
(注:配图由无界版图 AI 工具生成)

关于币安黑客事件的一些想法。 Binance 是 Cosmos 软件的最大用户,他们运营着一个价值数百亿美元的平台,但没有对核心软件做出有意义的贡献或参与。 从这里发生的事情中,我们可以学到很多。

你可能看到了 samczsun 的优秀推文贴展示了这个问题。https://twitter.com/samczsun/status/1578167198203289600 让我们尝试补充一些有关情况的详细信息。

一个官方防御补丁已发布在这里:https://forum.cosmos.network/t/cosmos-sdk-security-advisory-dragonfruit/7614

友情提醒:如果你发现 Cosmos 软件存在潜在漏洞,请遵循我们负责任的披露流程:

问题的症结在于黑客能够伪造一个默克尔证明(merkle proof),这不应该是可实现的 - 默克尔证明应该是高度安全的。 区块链轻客户端(以及 IBC)建立在默克尔证明(merkle proof)之上,因此正确处理它们很重要。

默克尔证明是数据存储中存在某些键值对的密码学证明, 我们可以称之为“包含证明”。 很多区块链将其数据存储在一棵默克尔树(merkle tree)中,以便可以生成证明某些数据包含在树中的证明。

默克尔证明在 IBC 中被大量使用,例如,一个区块链可以证明它有一个指向另一个区块链的数据包。当然,如果你可以证明某些数据在树中,但实际上并没有,那将是一个大问题。而这就是在 Binance 身上发生的事。

Cosmos 链使用一种称为 IAVL 的默克尔树,它位于 IAVL 存储库中。它附有一首关于默克尔树有多棒的诗。 IAVL 是一个自定义的默克尔化平衡二叉搜索树,它类似于以太坊的帕特里夏树(patricia trie)。

每个区块链开发人员在接触这些结构的架构和算法时,都不得不陷入默克尔树的疯狂之中。

IAVL 存储库公开了一个 API,用于使用一个“RangeProof”对象构建和验证证明。 一个范围证明(Range Proof)用于证明某些范围的 key 在默克尔树中并列存在。

一个范围证明还可用于证明单个键值对(范围大小为 1),或证明某个键不在树中(范围大小为 2)。

IAVL 存储库将 RangeProof 对象用于所有三种证明(包含、不存在、范围内的键)。 但事实证明 RangeProof 的内部工作存在一个严重漏洞。

一个证明应该由一个子叶节点和一系列内部节点组成,这些节点勾勒出从子叶到根的路径,并具有足够的信息来计算树的 merkle 根哈希并验证子叶实际上是树的一部分。

由于这是一棵二叉树,所以每个内部节点都可以有一个左分支和右分支。 但是在证明中,你是在树中跟踪路径,因此内部节点应该只包含其左分支或右分支哈希。 另一个是由证明中其他节点的哈希构造的。

这就是 IAVL RangeProof 的代码遇到问题的地方。 IAVL RangeProof 允许填充 InnerNode 中的 Left 和 Right 字段。 而这不应该发生。

攻击者基本上利用了将信息粘贴到 Right 字段中的优势,它们从未经过验证,也从未影响哈希计算,从而使验证者相信某些子叶是树的一部分。 因此,他们成功地伪造了一个默克尔证明。

值得注意的是,这个问题取决于攻击者能否将子叶添加到单个证明中,因为 RangeProof 允许你一次证明多个子叶。 因此,即使你的协议只希望一次证明一个 key,使用 RangeProof 也会为攻击者打开攻击面。

所以使用 RangeProof 并不是一个好主意。 但是我们也可以提出一个简单的防御措施——如果任何内部节点同时填充了 Left 和 Right 字段,则预先拒绝证明。 这样做应该可以解决这个问题。

虽然 RangeProof 是一个核心 Cosmos 存储库 (IAVL) 的一部分,但它实际上并未用于 Cosmos 堆栈内的区块链协议中。IAVL 树本身被所有 Cosmos SDK 链使用,但 RangeProofs 并没有。这是理解的关键!

相反,对于 IBC 中的默克尔证明,开发者按照 IBC 标准设定的更严格的流程开发了一个新规范。 该规范称为 「ICS23」,它位于 IBC 规范存储库中: https://github.com/cosmos/ibc 中。

那什么是 ICS23? 这是支持多种默克尔树的默克尔证明的通用标准(包括 IAVL 树)。 ICS23 定义了一种用于序列化和验证默克尔证明的通用格式。

IBC 没有使用 IAVL 树的内置 RangeProof 系统,而是使用 ICS23 标准来生成和验证 IAVL 树的默克尔证明。而 ICS23 代码中并没有这个漏洞。

这不仅仅是使用不同的代码,并因此侥幸躲过一劫的问题。 这代表了一种根本不同的软件工程方法。

ICS23 遵循更严格的设计流程,旨在最大限度地减少攻击面,同时仍然是通用的,这是一项艰巨的任务!作为其中的一部分,它明确地拒绝了 range proofs,ICS23 中并没有 range proofs。

因此,该漏洞本身在 ICS23 规范中是不可接受的,这是好的,IBC 的目标是使跨链通信更加安全。

当然,IBC 规范和协议可能并不完善,并将继续改进。作为一个复杂的协议和软件实现,它(IBC)甚至可能存在我们社区必须应对的尚未被发现的漏洞,安全需要一个社区。

我们都必须认真对待安全。 如果发现潜在漏洞,请负责任地披露:https://github.com/cosmos/cosmos-sdk/blob/main/SECURITY.md。

如果你可以为改进软件和协议做出贡献,我们邀请您这样做!

总的来说,这次事件是一个机会,它提醒了大家在软件开发生命周期中加强安全实践的重要性,传播一些关于 IBC 是什么及其工作方式的一些认识,并邀请整个生态来帮助改进 IBC。

跨链桥黑客对我们的行业来说是一个真正的问题,如果不认真致力于更高的安全性和标准流程,它们(跨链桥)就不会变得更好。让 IBC 成为一个光辉的例子。

这里还有一个关于使用开源软件的重要教训:遵循最佳实践,保持最新状态,并向上游贡献资源! 很高兴看到 binance 成为更负责任和协作的生态参与者!

【关注DeFi之道】

网站 | 推特 | 电报资讯 | 电报荐读 | 电报社区 | Discord

Subscribe to GWEI Reseach
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.