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

By [GWEI Reseach](https://paragraph.com/@gwei-reseach) · 2022-10-09

---

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

![（注：配图由无界版图 AI 工具生成）](https://storage.googleapis.com/papyrus_images/3f309f1a547fab519b40b9f0d6a4acb62de73ecf7da7b6cbb40681246d8f5ece.png)

（注：配图由无界版图 AI 工具生成）

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

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

![](https://storage.googleapis.com/papyrus_images/57657e8dff761f20c4244c9773e4b1aec3bf2d1b9266b2ff5f880911c2c6bd1c.png)

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

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

[https://github.com/cosmos/cosmos-sdk/blob/main/SECURITY.md](https://github.com/cosmos/cosmos-sdk/blob/main/SECURITY.md)

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

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

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

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

[https://github.com/cosmos/iavl/blob/master/POEM](https://github.com/cosmos/iavl/blob/master/POEM)

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

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](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。](https://github.com/cosmos/cosmos-sdk/blob/main/SECURITY.md%E3%80%82)

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

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

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

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

**【关注DeFi之道】**

[_网站_](https://www.defidaonews.com/) _|_ [_推特_](https://twitter.com/8BTC_OFFICIAL) _|_ [_电报资讯_](https://t.me/Mute_8btc) _|_ [_电报荐读_](https://t.me/defizhidao) _|_ [_电报社区_](https://t.me/news_8btc) _|_ [_Discord_](https://discord.gg/defidao)

---

*Originally published on [GWEI Reseach](https://paragraph.com/@gwei-reseach/cosmos-3)*
