6月28日凌晨3点,北京时间 在刚刚结束的硅谷Blockchain 新手如何炒钱来推广和卖钱 Connect Conference会议现场,区块链安全公司PeckShield披露可能导致以太坊的披露geth节点休克或崩溃的安全性BUG。PeckShield将披露的BUG命名为“Ethereum Packet of Death(EPoD)”,即“致命报文”,攻击者可以发送恶意报纸geth攻击节点。geth它是以太坊主流的官方客户端,被许多重要节点采用,这意味着一旦攻击者使用它BUG所有向以太坊都受到影响geth对节点进行攻击,所涉及的相关节点随时可能停止。对于整个以太坊网络,这样BUG恶性竞争将扰乱市场秩序,造成不可估量的严重损失。
以太坊网络节点波及2/3
在深入探讨BUG在详细信息之前,让我们首先介绍以太坊客户端的应用程序。根据以太坊公益事业官方网站的描述,以太坊官方客户端有几个独立的运营版本,其中市场份额较大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节点休克或崩溃的安全性BUG,而这些BUG一旦被使用,可能会对以太坊2/3上述网络产生严重影响。
“致命报文”BUG细节
以太坊的核心是所有客户端都必须遵守相同的协议才能保持共识。这些协议是由这些协议组成的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服务器将完全崩溃。
BUG危害及后续
作为区块链世界,公共链“操作系统”,为区块链生态系统提供数据存储、网络传输、交易计算、共识机制等基本协议。目前,市场上有许多竞争激烈的公共链。总市值排名第一的以太坊无疑是公共链领域的领导者。一旦以太坊网络受到攻击,它将对整个区块链生态系统产生重大影响。
此次BUG所波及的以太坊geth客户端可能包括数字货币交易中心和一些矿池等关键节点。攻击者可以利用这一点BUG通过直接瘫痪竞争对手的计算能力,实施恶性竞争,赢得更大的市场份额,将严重影响以太坊市场秩序的持续性。我们正在发现BUG第一次向以太坊公益事业提交BUG报告,目前以太坊geth相关的客户开发团队已经发布了相应的补丁,
我们还呼吁受影响的关键节点尽快升级最新版本,以抵御可能的攻击和危害。
图5.CVE-2018-12018 错误报告
这只是我们披露的系列BUG在正确的时间开始,我们将公开发现其他东西BUG。