EPoD: 以太坊Geth客户端拒绝服务漏洞 (CVE-2018-12018)

迄今为止,PeckShield发现了很多严重的智能合约漏洞。除了智能合同外,以太坊生态系统还包括其他各种可能受到攻击的组件。

显然,一个这样的组件是以太坊的核心,也就是每个以太坊节点上运行的底层客户端软件。

如果攻击者使某个以太坊客户端/节点崩溃,那么此客户端/节点提供的计算能力也随之消失。如果大量以太坊的客户/节点突然间断线,他们相应的计算能力可能会立即失效,从而严重干扰以太坊的整个运营。

在撰写本文时,我们将揭示流行的以太坊客户中发现的一个严重漏洞,这些漏洞可能会被利用来对整个以太坊网络造成严重影响。

背景

在深入研究这些漏洞的细节之前,我们首先介绍以太坊客户端。正如以太坊基金会网站所写,以太坊客户端有三个独立的官方实施。这些客户对维护共识具有几乎相同的功能。三者之中的Go Ethereum,又名GETH,是用GO编写的官方实现,它是完全开源的,并且在GNU LGPL v3下获得许可。

而且,它也是最受欢迎的以太坊客户端。根据Ethernodes的数据,geth拥有大约三分之二的份额,而Parity(Parity Technologies的Rust实现)占有剩余的三分之一(图1)。


图1:来自以太坊的各种以太坊客户的市场份额

此外,来自Ethstats的数据显示了类似的统计数据(图2)。


图2:Ethstats的不同以太坊客户端

鉴于geth是以太坊网络中的大多数,它的任何关键脆弱点都可能对整个以太坊生态系统造成严重损害。PeckShield的研究人员发现了一系列可能导致系统崩溃或冻结任何节点的漏洞。这些错误可能会降低以太坊网络的大部分计算能力。

细节

在以太坊的核心,所有客户端实施都应遵循相同的协议来维护共识。这些协议包括RLPx,ÐΞVp2p和许多子协议,如Ethereum Wire子协议或Light Ethereum子协议。


图3:以太坊协议栈

图3显示了以太坊中使用的协议层。为了支持“轻量级”客户端,Light Ethereum子协议(LES)允许以太坊节点只下载块头,并随需获取区块链的其他部分。为了实现这一点,我们还需要一个充当LES服务器的完整(或存档)节点来为光节点提供服务。以下命令可以启动具有LES支持的完整geth节点:

geth --lightserv 20

当LES客户端从LES服务器请求块头时,GetBlockHeaders消息从客户端发送,服务器端的消息处理程序解析消息。下图显示了GetBlockHeaders消息处理程序的geth实现的代码片段:


图4:geth中的GetBlockHeaders处理程序

在这里,LES客户端按以下格式发送查询:

// getBlockHeadersData represents a block header query.
type getBlockHeadersData struct {
    Origin  hashOrNumber	// Block from which to retrieve headers
    Amount  uint64		// Maximum number of headers to retrieve
    Skip    uint64		// Blocks to skip between consecutive headers
    Reverse bool		// Query direction
}

从第17行开始,非反向的情况由LES服务器处理。在第19行中,LES服务器在跳过query.Skip块后检查是否仍有可用的块头。如果检查通过,则调用GetBlockHashesFromHash()(第20行),并返回一个块标题数组。

但是,输入的查询数据未经正确验证。攻击者可以使用query.Skip = -1(0xFFF ... F)制作恶意查询。当query.Skip + 1传入GetBlockHashesFromHash()时,将分配最大大小为0的数组。然后,通过访问索引为query.Skip = 0xFFF ... F的零大小数组,LES服务器崩溃。

时间线



图5:CVE-2018-12018错误报告

这是该系列的第一部分,我们稍后会揭示其他发现。

关于我们

PeckShield Inc.是一家领先的区块链安全公司,其目标是提升当前区块链生态系统的安全性,隐私性和可用性。对于任何商业或媒体查询,请通过电报Twitter电子邮件与我们联系。

猜你喜欢

转载自blog.csdn.net/fly_hps/article/details/80858028