1,什么是日蚀攻击
日蚀攻击(Eclipse Attack)是对区块链的一种网络级攻击,攻击者基本上控制了点对点的网络,同时模糊了区块链上的节点视图。
与比特币一样,以太坊网络上的一个节点依赖于与其他节点的连接,以获得网络的完整视图。在日蚀攻击中,攻击者控制所有来自以目标受害者的节点及将要连接目标受害者的节点。这样,攻击者就可以防止受害者获得关于网络其他部分的完整信息。
人们通常认为日蚀攻击是一种将网络挖矿能力与共识相结合的方式,但是日蚀攻击在双花攻击中特别有用。收款人可以为交易发送币,并使用日蚀攻击来阻止接收方了解到这一过程,在网络的另一个部分中,同样的币会被用于另一个交易。
在以太坊网上发起一次日蚀攻击,与在比特币上发起一次攻击是“完全不同的”。为了实现对比特币的一次日蚀攻击,一个攻击者需要控制大量IP地址(机器)来垄断连接到受害者节点的连接,这使得攻击比特币的代价极高。
与此相反,研究人员仅使用一两台机器就能在以太坊层发动类似的攻击,使对以太坊的攻击比对比特币的要更强大。在以太坊的网络中,阻止这类攻击的主因并不是攻击的难度,而是对以太坊点对点网络如何运作缺乏理解。以太坊网络“基本上是无证明文件的”。
乍一看,以太坊似乎对日蚀攻击更有弹性。尽管比特币节点只生成8个传出的TCP连接,以形成传播交易和区块的gossip网络,但以太坊节点却有13个。同时以太坊的点对点的网络使用了安全加密通道,而比特币的网络却没有。
但是,事实证明,以太坊实际上是容易受到攻击的,这主要是因为比特币依赖于一个非结构化网络节点的随机相互连接,而以太坊则依赖于结构化的基于一个称为Kademlia的协议的网络,其旨在更有效地允许一个节点可以连接到其它节点。
以太坊的点对点网络中的节点由其公钥所标识。显然,以太坊的版本(在Geth v1.8.1之前)允许用户运行无限数量的节点,每个节点都有一个不同的公钥,从同一个IP地址的同一台机器上运行。
通过使用密钥生成算法,攻击者可以非常快地创建无限数量的节点ID(在对等网络上的标识符)。更糟糕的是,攻击者甚至可以创建节点ID,使其相比于随机的节点ID来说对受害者更具吸引力,这样就能基本上把受害者拉到他们身边 。
2,以太坊的节点发现机制
虽然Ethereum的点对点网络基于Kademlia,但其目的却大不相同。 Kademlia旨在成为在分布式对等网络中存储和查找内容的有效手段。 以太坊的点对点网络仅用于发现新的对等点。
以太坊节点选择一个随机目标t,查找她的桶以查找k = 16最接近目标t的节点ID,并要求它们各自从它们的“接近”目标t的桶中返回k个节点ID,导致多达k×k个新发现的节点ID。从这些k×k新发现的节点ID中,最接近目标t的k个节点然后被要求返回更接近t的k个节点。这个过程继续迭代,直到找不到新的节点。换句话说,以太坊查找大多是用随机选择的节点ID填充存储桶的一种奇特方式。
以太坊网络中的同行由其节点ID标识。节点ID是b = 512位(64字节)加密ECDSA公钥。 多个以太节点可以在具有单个IP地址的单台机器上运行,每个节点都有不同的节点ID。 生成ECDSA密钥很容易 - 只需要运行ECDSA密钥生成算法。 没有机制检查唯一节点ID对应于唯一网络地址; 因此,可以从具有相同IP地址的同一台计算机运行无限数量的节点。 这是我们攻击中利用的主要媒介。
攻击生效需要受害者重启。 受害者重启可能有几个原因,包括电源故障、对主机操作系统的攻击、geth以太坊客户端的软件更新、耗尽内存、带宽的DDoS攻击等。
3,攻击步骤:
在攻击前,每个受害者节点都进行了检测和修改,以便其不向其他节点发送区块信息(以避免污染以太网网络),但是与常规geth v1.6.6客户端不同。 该节点具有默认值maxpeers = 25。
在纽约有一个受害者,两个攻击者机器上有N = 1000个攻击者节点ID。 一名攻击者在纽约(上传速度:60Mbps),一名在波士顿(上传速度:22Mbps)。 受害者在袭击发生前一天在线。 连续进行了50次测试。 在每次测试中,都会在受到攻击之前将受害者状态还原,重新启动受害者,然后发起攻击。 在50次日食攻击测试成功了49次,失败的一次测试中,受害者与一个合法节点进行了连接。
第二次实验测试了网络延迟的影响。 受害者在新加坡。 在纽约使用了两台攻击机(上传速度从140 kbps到1 Mbps)和N = 1000个攻击者节点ID。 使用相同的方法,进行了53次连续测试,并在53次测试中的43次中设法让受害者受到攻击。
第一步:制作攻击节点。
这种攻击利用了从节点ID到桶的映射是公开的,制作一组攻击者节点ID(即ECDSA密钥),用于填充受害者table中所有最后一个桶。
请注意,随着攻击节点的增加,制作攻击节点ID变得越来越困难。 对于攻击者来说幸运的是,即使是一个没有受到攻击并且已经上网数天的受害者,很可能有一个只包含几百个节点的表。 因此,我们的攻击者只需要制作几百个节点ID。 在我们的实验中,制作总共272个节点ID。 我们可以在15分钟内在电脑上生成这些272制作的节点ID(MacBook Pro i5,2.9 GHz,16 GB RAM)。 另请参见图3,这是制作映射到特定存储桶的单个攻击者节点所需时间的对数图。
第2步:将攻击者节点插入db。
现在我们需要将我们制作的节点ID插入到受害者的db中。 我们从单个攻击机器执行此操作。 对于每个精心制作的攻击者节点,我们的攻击机器向受害者发送一个ping。 受害者将通过绑定与攻击者节点进行响应。绑定到一个新节点包括发送一个ping,等待它的pong,然后将节点插入到db和table(如果table中有空间)。 为了确保存储在受害者db中的攻击者节点不会因为过时而驱逐,我们的攻击机至少每24小时对受害者进行一次ping。 我们还确保攻击者机器响应所有受害者的ping请求(带有pong)和findnode请求。
第3步:令受害者重启
重新启动并攻击受害者。我们利用的最终漏洞是重启。 重新启动后,客户端table为空。 然后,我们使用我们精心设计的攻击者节点ID积极地ping受害者,以便用攻击者节点ID填充受害者的table,从而使受害者将其所有传出TCP连接都连接到攻击者节点。 按照以下步骤进行操作。
首先,在重新启动后,攻击者立即用每个攻击节点ping受害者。 这会导致受害者很快与攻击者节点ID绑定,从而将其插入其table中。键合快速发生是因为,在绑定期间,受害者直接将攻击者节点插入其table中,而不是先ping它。发生这种情况是因为步骤2确保了
(1)攻击者节点ID位于受 害者的db中
(2)db记录了对findnode请求的响应失败为零
(3)在过去24小时内曾发生响应。
接下来,以太网客户端首先启动其UDP监听程序(因此,它接受触发绑定的传入ping),然后启动其播种过程。然而,在播种过程开始的时候,它很可能已经包含了节点(所有节点都属于攻击者),所以播种过程什么都不做。因此,存储在db中的节点都不会在table中移除,并且我们的攻击者节点ID不需要与存储在db中的诚实节点ID争用table中的空间。唯一的竞争来自以太坊网络中的诚实节点,它能够平衡受害者,从而使受害者与他们连接。
4,对策:
1,对传入TCP连接的数量实施上限,强制客户端混合传入和传出TCP连接。
2,IP和ECDSA密钥之间的一对一映射。
3,不公开节点id到bucket的映射
4,不公开节点查找规则
5,不停更换连接
6,重启时不重新寻找连接
7,在pong中包含随机数
以太坊1.8.0采取的是第一种策略,传入连接的默认值设置为8
具体的代码分析,待补充–
转载请注明来源