本文分析了Cronos区块链Ethermint客户端中的一个漏洞,该漏洞允许攻击者通过构造特定的交易,在不支付交易费用的情况下获得“gas退款”,甚至窃取区块中的交易费用。白帽zb3发现了此漏洞并及时报告,Cronos团队迅速修复并奖励了zb3。文章详细解释了漏洞的原理,以及Cronos团队是如何修复这个漏洞的。
区块链中的交易就像声音在空气中传播。我们通过交易与他人交流;我们宣布我们正在做什么,以及我们要把消息发送给谁。我们为提交的每笔交易支付费用,这使得它能够传播给其他人。
但是,如果我们能够构建一笔不需要支付费用的交易呢?此外,如果我们创建一笔能够窃取当前区块费用的交易呢?白帽 zb3 (https://github.com/zb3) 在 Cronos 区块链的 Ethermint 客户端中发现了一种可以做到这一点的办法,并在任何恶意方能够利用它之前报告了它,从而为所有人带来了积极的结果。
通过提交一个 cosmos 签名的 MsgEthereumTx
(带有一个有效的以太坊签名),但不带 ExtensionOptionsEthereumTx
和一个很高的 GasLimit
,攻击者会收到一个“gas 退款”,即使 gas 费用一开始就没有被收取。
zb3 于 12 月 12 日向 Immunefi 提交了这个漏洞。由于被归类为“收益盗窃”——影响了用户奖励但没有耗尽资金,因此被报告为一个高危漏洞。zb3 因此从 Cronos 团队获得了 4 万美元的赏金,随后该团队迅速修复了这个漏洞。
我们将解释这个漏洞是如何产生的,但首先,我们将解释 Cronos、Ethermint 和一般的交易。
我们可以从 Cronos 的 Medium 上读到:
“Cronos 构建在 Cosmos SDK 之上,同时与以太坊虚拟机 (EVM) 兼容,因此具有独特的优势,可以将 EVM 链和 Cosmos 生态系统连接起来,从而在多链世界中实现无缝的加密资产和 dApp 的互操作性。”
Ethermint 是 Cronos 构建的基础技术。Ethermint 是一个高吞吐量、可扩展的权益证明 (PoS) 区块链,与以太坊完全兼容。Cosmos SDK 在 Tendermint Core 共识引擎之上运行,被用于创建它。
Ethermint 的独特之处在于,它支持将原生的以太坊用作 Cosmos 特定的应用区块链。它使开发者可以访问以太坊所有理想的功能,同时还可以使用 Tendermint 的 PoS 实现。
由于 Ethermint 与基于 EVM 的链和 Cosmos 特定的区块链兼容,这也意味着交易可以在两条链之间进行桥接和传播。客户端需要解析和处理为 EVM 和 Cosmos hub 路由的交易。
根据 Ethermint 的文档:
“我们试图通过模仿 Geth 的交易结构,并将其视为一种独特的 Cosmos SDK 消息类型来实现这一点(作者注:交易路由)。以太坊交易是包含在 auth.StdTx 中的单个 SDK.Msg。所有相关的以太坊交易信息都包含在这条消息中。这包括签名、gas、payload 等。”
信息量很大,所以我们把它分解成几个部分。首先,我们需要回答以下基本问题:什么是区块链交易?
交易是以太坊的关键功能之一,因为它们是唯一可以修改或更新区块链状态的东西。它们是由以太坊网络通过“flood routing”协议(即 gossip)发送到每个节点的签名消息,并且源自外部拥有的帐户 (EOA)。
只有交易才能导致状态改变或合约在 EVM 中执行。用户与区块链的每一次接触都将从一笔交易开始。
交易结构如下:
如果你想了解更多关于 ECDSA 的信息,请查看我们的 签名简介。
Ethermint 的链如何执行状态转换?通过使用 MsgEthereumTx
。这个消息提供了相关的交易数据元素,并将以太坊交易包装成 SDK 消息。
我们不会深入研究 SDK.Msg
和 auth.StdTx
,因为它们与这个问题无关。如果你想知道它们的作用,请查阅 Ethermint 的 官方文档。
当交易在 Ethermint 中被消耗时,它们会经过一系列的处理程序。AnteHandler
是其中一个处理程序,它负责执行初步的消息执行业务逻辑,例如费用支付、签名验证等等。它只适用于通过 Cosmos SDK 进行的交易。由于 EVM 处理相同的业务逻辑,因此以太坊路由的交易将不受影响。
有了这些知识,攻击者可以通过利用交易的处理方式来构建一笔会导致前面概述的漏洞的交易。
每当我们希望发送以太坊交易时,Ethermint 都会提供标准的 JSON-RPC 端点来使用。
当通过兼容性 JSON-RPC 端点提交以太坊交易时,它会被重新格式化为 MsgEthereumTx
,然后将 ExtensionOptionsEthereumTx
附加到它。当由节点处理时,ExtensionOptionsEthereumTx
会导致交易被适当的 antehandlers 处理,包括 EthGasConsume
处理程序。EthGasConsume
处理程序从发起帐户中扣除 gas price * gas limit。交易执行后,费用将被退还。
这消除了对 cosmos 签名的需求,同时也确保了以太坊消息中指示的 gas limit 首先被扣除,就像在以太坊上一样。但是,没有检查 MsgEthereumTx
是否有 ExtensionOptionsEthereumTx
。因此,有可能打包没有 ExtensionOptionsEthereumTx
的 MsgEthereumTx
并将其提交给节点。这只执行标准的 antehandlers 集合,因为省略了这个选项。因此,我们可以跳过一些应该在处理 MsgEthereumTx
之抢跑的 antehandlers。
被调用的处理程序之一是 EthGasConsumeDecorator(evmKeeper)
。它的主要目的是确保以太坊交易消息有足够的资金来支付内在的 gas,并且发送者有资金来支付 gas 成本。在交易完成之前消耗的 gas 数量被称为内在 gas。这与 cosmos 费用不同,因为它是要被退还的。
但是由于 gas 成本没有被扣除,因此可以指定一个任意的 gas limit,然后获得“退还”的 gas,而这些 gas 从一开始就没有被扣除,因为 EthGasConsumeDecorator
处理程序没有运行,因为缺少 ExtensionOptionsEthereumTx
。
这意味着在恶意交易被执行之前,当前区块中的交易费用可能会被盗取,并且攻击可以为每个区块重复进行。
Cronos 为了修复这个问题所做的是,他们现在检查 MsgEthereumTx
是否包含在交易中。这个修复已经应用于当前 Cronos 主网 beta 版本的二进制升级 v0.6.5
(参见 https://github.com/crypto-org-chain/cronos/security/advisories/GHSA-f854-hpxv-cw9r)。
我们要感谢 zb3 (https://github.com/zb3) 做了出色的工作,并提出了这个非常有趣的发现。还要感谢 Cronos 团队迅速响应了报告,并奖励了白帽 4 万美元的赏金。
这个问题通过 Immunefi 平台以负责任和安全的方式报告,为每个人,特别是用户,带来了快乐的结果。
如果你想开始漏洞赏金,我们为你准备好了。查看 Web3 安全库,并在 Immunefi 上开始赚取奖励——Immunefi 是 web3 领先的漏洞赏金平台,拥有世界上最大的奖励。
- 原文链接: medium.com/immunefi/cron...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!