北京时间 6月28日凌晨3时,在刚刚结束的硅谷Blockchain Connect Conference大会现场,区块链安全公司PeckShield披露了一个能够造成以太坊geth节点休克或崩溃的安全漏洞。PeckShield将披露的漏洞命名为“Ethereum Packet of Death(EPoD)”,即“致命报文”,攻击者通过发送一个恶意报文即可向geth节点发动攻击。geth是以太坊主流的官方客户端,被众多重要节点采用,这也意味着一旦攻击者利用此漏洞向以太坊全部受影响geth节点实施攻击,涉及到的相关络节点将随时可能停摆。对整个以太坊网络来说,这样的漏洞如若被用来开展恶性竞争,将扰乱市场秩序,造成不可估量的严重损失。
波及2/3以上以太坊网络节点
在深入探讨漏洞细节之前,我们首先介绍一下以太坊客户端应用。根据以太坊基金会官方网站的描述,以太坊官方客户端有若干个独立的运行版本,其中占较多市场份额的主要为Go Ethereum和Parity两种。
图1.Ethernodes网站统计的不同以太坊客户端的市场份额
Go Ethereum即geth,是使用Go 语言编写的官方客户端。geth完全开源,采用的是GNU LGPL v3的授权。根据Ethernodes网站的统计,geth的份额大概占整个以太网客户端的2/3,是目前以太坊网络较为主流的客户端。而排名第二的Parity(是Parity科技公司的产品,以Rust语言编写)则占据了了剩余三分之一份额中的绝⼤大部分(如图1所示)。还有其他客户端, 占较小的一部分(如图2所示),共识机制的一致性,使得这些客户端在功能上几乎完全等同。
图2.Ethstats网站统计的不同以太坊客户端的市场份额
PeckShield的研究人员已经发现了一系列可能导致geth节点休克或崩溃的安全漏洞,而这些漏洞一旦被利用可能会给以太坊2/3以上的网络带来严重冲击。
“致命报文”漏洞细节
以太坊的核心在于所有的客户端都必须遵守同样的协议以保持共识。这些协议由RLPx、DΞVp2p和其他子协议,包括以太坊线路路协议(Ethereum Wire Protocol)或者轻量级以太坊协议(Light Ethereum Protocol)等组成。
图3展示了了以太坊应用的协议层。为了支持轻量量级的客户端,轻量量级以太坊⼦子协议(LES) 允许以太坊节点在同步获取区块时仅下载区块的头部,在需要时再获取区块的其他部分。为了实现这一功能,我们还需要一个全节点(或archive节点)作为LES服务器器,为轻量级节点 提供服务。
执行以下命令可以启动一个支持LES服务的geth全节点
geth --lightserv 20
在向LES服务器器请求区块头部时,LES客户端会发起类型为GetBlockHeaders的消息 (message),而LES服务器器的消息处理器(message handler)负责相应的解析工作。 图4给出了geth客户端负责处理GetBlockHeaders类型消息的代码片段。
(GetBlockHeaders)的信息处理器的代码片段:
图4.geth客户端中获取区块头部信息处理器由LES客户端发送的查询(query)请求遵循如下格式
从图4的第17行开始,LES服务器处理not reverse分支。在第19行,LES服务器会检测在忽略了query.Skip个区块之后,是否还有可用的区块头部。如果检测通过,GetBlockHashesFromHash方法就会被调用(即第20行),并返回一个区块头部数组。
然而对作为输入的请求(即query),LES服务器并未验证其有效性。攻击者可以构造形如query.Skip = -1 (0xFFF...F)这样的恶意请求。当query.Skip+1被作为待分配数组 的最大长度参数传递至GetBlockHashesFromHash方法时,长度为0的数组即被分配并返回。随后,通过索引query.Skip = 0xFFF...F访问该⻓长度为0的数组时,LES服务器就会彻底崩溃。
漏洞危害及后续
公链作为区块链世界的“操作系统”,为区块链生态提供数据储存、网络传输、交易算、共识机制等底层协议。当前市上已经有多条竞争公链,总市值稳居第一的以太坊无疑是目前公链领域的领跑者,一旦以太坊网络遭到攻击,将会给整个区块链生态带来重大影响。
此次漏洞所波及的以太坊geth客户端很可能包含着数字货币交易所以及部分矿池等关键节点。攻击者可以借助此漏洞实施恶性竞争,通过直接瘫痪竞争对手算力赢取更大的市场份额,这会严重影响以太坊市场秩序的稳定。我们在发现漏洞后的第一时间向以太坊基金会提交了漏洞报告,目前以太坊geth客户端的相关开发团队已发布了相应的补丁,
在此我们也呼吁受影响的关键节点尽快升级最新的版本,以抵御可能发生的攻击和危害。
图5.CVE-2018-12018 错误报告
这只是我们披露系列漏洞的开始,在合适的时间我们将会公开所发现的其他漏洞。