浅谈几种区块链网络攻击以及防御方案之日蚀攻击

tech2024-11-30  8

旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/12/network_attack_of_blockchain_eclipse_attack/

写在前面的话

自比特币诞生到现在,比特币(网络)经历过大大小小非常多次的攻击,尤其在比特币诞生之初的几年,并且随着比特币价格的一路飙涨,黑客针对比特币网络的攻击就一直没有停止过。据估算,目前大约有 350 ~ 400 万比特币永久丢失,价值大约 240 ~ 280 亿美元。当然其中不只有由于黑客的攻击导致的丢失,毕竟比特币最初的几年很多人都没有意识到比特币的价值,很多的私钥都遗失了。

本文就谈一下目前几种区块链网络攻击,以及其防御方案。

本文尽量用简单易懂的白话来描述,也仅代表我个人的看法,欢迎探讨。

同系列:

浅谈几种区块链网络攻击以及防御方案之51%攻击浅谈几种区块链网络攻击以及防御方案之日蚀攻击浅谈几种区块链网络攻击以及防御方案之女巫攻击浅谈几种区块链网络攻击以及防御方案之拒绝服务攻击浅谈几种区块链网络攻击以及防御方案之其它网络攻击

日蚀攻击(Eclipse Attack)

P2P 网络

概念

在介绍什么是日蚀攻击之前,有必要先对区块链系统的底层 P2P 网络做一个简单的介绍,因为日蚀攻击就是利用了 P2P 网络的特性来进行的攻击。

P2P 即 Peer to Peer,中文意思是对等网络,它是分布式系统和计算机网络相结合的产物。对等的意思就是网络中的节点角色、地位是平等的,任何节点具有极强的自由,可以任意加入、离开网络。这跟传统的 C/S 模型的结构有很大区别,任何节点既是 client ,也是 server,或者说网络中没有 server 节点,任何节点 down 掉不会对整个网络产生致命的影响,具有极强的伸缩性。

P2P 网络从诞生到现在经过了几个阶段,分别是混合式 P2P,无结构化 P2P以及结构化 P2P。

混合式:顾名思义,P2P 网络混合了传统的 C/S 模型,网络中有角色充当 server 角色无结构化:也就是网状结构模型,纯分布式网络,典型代表就是比特币网络,节点之间以一种随机的,松散的方式组织在一起结构化:节点按照一定规则组织在一起,路由算法比较精准,比如 DHT 算法

混合式

无结构化 ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3NtYXVneC9NeWJsb2dJbWdIb3N0aW5nL3JlYm9vdGNhdC9uZXR3b3JrX2F0dGFja19vZl9ibG9ja2NoYWluX2VjbGlwc2VfYXR0YWNrLzMucG5n?x-oss-process=image/format,png) 结构化(kademlia算法)

路由表(邻居表)

P2P 网络里一个比较重要的概念就是路由表,或者说邻居表。路由表里面保存了网络里面的一些节点,具体数量从几个到几十个不等。路由表中的这些节点可以看做是这个节点与这个 P2P 网络建立关联的重要依据,或者说表示节点到这个 P2P 网络的一些入口。这个节点想要发送任何信息需要先转发给路由表中的节点,再由它们负责转发消息。这就是路由表的作用。

那么无论是哪一种结构的 P2P 网络,每个节点都有一个类似于路由表的概念,本质上就是跟这个网络中的多个节点建立了一些联系,然后后续的所有收发包都交由这些邻居代为收发。

所以对于 P2P 网络里的一个节点来说,它看不到网络的全貌,只能看到网络的局部信息。并且由于路由表的存在,哪怕路由表中只保存了一个入口节点,这个节点也能服务于整个 P2P 网络,其他节点也能通过一定的方式找到这个节点。

NAT 穿透

NAT 穿透不是 P2P 网络的一个必要特性,如果 P2P 网络中都是公网节点(具有公网IP),其实是不需要 NAT 穿透的。那么如果有一些私网节点(局域网节点)也加入到了这个 P2P 网络中,由于不能互通,导致其他节点无法发现这些私网节点,最后带来的结果就是这个私网节点能够成功发送信息到这个 P2P 网络中,但是可能却无法收到来自 P2P 网络里的消息。注意这里的用词是可能,因为存在一些场景是有可能收到的。

关于 NAT 穿透我有另外的博客介绍 NAT 穿透方面的东西,这里就不做展开讲了。

什么是日蚀攻击

上面介绍了关于 P2P 网络的一些知识和概念,下面开始正式介绍日蚀攻击。

日蚀,同日食,是指月球运动到地球和太阳的中间,如果三者正好在一条直线上,月球就会挡住太阳射向地球的光,月球身后的黑影正好落到地球上,这时发生日食现象。月球就切断了地球和太阳之间的(太阳光)联系。

再来看什么是日蚀攻击,日蚀攻击针对特定的某个节点,通过一些方法,填满被攻击节点的路由表,以便切断它们与其他对等点的所有入站/出站通信(这会有效地窒息受害者)。上面提到路由表的概念,路由表里的节点是这个 P2P 网络的入口节点,任何收发消息都要经过路由表中的节点。攻击者通过某种方式填满了被攻击的节点,理论上就是控制了这个节点进出网络的信息,造成被攻击节点被 “伪隔离”的现象。

我觉得用日蚀来形象化的比喻这种攻击还是很合适的,本质上就是隔离了这个节点或者说用恶意节点包围了受害节点。

那么会造成什么后果呢?

阻止受害节点查看真实的区块链信息隔离网络中多个节点,以达到分裂网络的可能用少于 51% 的算力发起 51% 攻击

上面的几点其实比较好理解的,受害节点被恶意节点包围之后,恶意节点可以选择性的给受害节点发包或者篡改真实的数据包,本质上就是让这个节点误以为自己还在这个网络中挖矿,然而真实情况是它已经从网络中隔离开来了。

如果受害节点很多的情况,从整个网络全局来看就是被隔离成多个部分,网络实际上已经被分裂了。那么就可以实施分裂网络的 51%攻击,只需要用比原来 51%攻击更少的算力就行。

关于 51%攻击可以查看这篇博文 浅谈几种区块链网络攻击以及防御方案之51%攻击。

如何发起日蚀攻击

由于每种区块链底层的 P2P 网络模型可能不一样,所以就以以太坊为例来做说明。

以太坊 kademlia网络原理

以太坊底层的 P2P 网络采用的是 kademlia 算法,kademlia 网络是一种结构化的 P2P 网络,网络中的节点按照一定的规则组织在一起。

kademlia 算法中的核心特点是用异或来定义两个节点的距离,这种距离与实际的物理距离没有任何关系。

每个节点的路由表会保存不同距离的节点,这个距离的最小值当然是 0,也就是它自己,这个距离的最大值跟节点 ID 的长度有关系(NodeID)。NodeID 是一段具有特定长度的字符串,每个节点具有唯一的 NodeID,用 NodeID 来作为这个节点在 P2P 网络中的身份信息。比如:

NodeID: DEA25B0AF6CC5EA9DA4961DBC5FFEB97

假设 NodeID 长度为 N bit(对于上面的 NodeID 来说 N 为 32 * 8 = 256),那么这个距离的最大值就是 N -1,即距离范围在 [0, N)。

kademlia 网络中的节点的路由表中会保存每一个距离的节点,数量在 1 个以上,这个值称为为 α 值。也就是说与自己的 NodeID 距离为 1 的会保存 α 个,距离为 2 的会保存 α 个,以此类推,直到距离为 N-1 的节点会保存 α 个。实际情况是距离越大,能找到符合要求的节点的概率也就越大,想一想为什么?

这里每一个距离称为一个 Bucket,每一个 Bucket 里保存着 [0, α] 个距离匹配的节点。

通过上述对 kademlia 算法的简要描述可以得出一个结论,知道一个节点的 NodeID,就能够计算出这个节点的路由表中的每一个 Bucket 中应该填入什么样的 NodeID。而这就是日蚀攻击的核心依据。

发起日蚀攻击

当我们知道目标节点的 NodeID 之后,就可以通过一定的方式去伪造生成满足不同 Bucket 的 NodeID,当这个目标节点重启之后,马上以这些 NodeID 启动节点去连接目标节点,由于 kademlia 的特性,这些特意伪造的 NodeID 肯定会被填入目标节点的路由表中,从而把路由表占满,以达到日蚀攻击的目的。

至于让目标节点重启,可以等待目标节点自动重启或者采用 DOS 攻击迫使目标节点重启,当重启之后马上进行上面的操作就可以完成日蚀攻击。

当成功发起日蚀攻击之后,随后就能隔离节点,篡改目标节点的收发数据包了。

如何防御日蚀攻击

根据上述的讨论知道,想要避免日蚀攻击由很多种办法:(可能只适用于 kademlia 网络)

提高节点进入网络的准入门槛

节点进入 P2P 网络需要一定的门槛,不论是以时间为代价还是以 Stake 或是工作证明为代价,这样就能有效防止大批量伪造节点进入网络,从而从源头上避免日蚀攻击

针对同一个 IP 段的节点做连接限制

攻击者很可能利用有限的 IP (1 ~ 2 个)伪造大量节点,发起日蚀攻击,那么对于目标节点来说,看到的节点都是来自于这个 IP,多半可以说明这是恶意节点。那么只需要对来自同一个 IP 段的节点做一定数量的限制,比如 最多 2 个,那么也能显著提高攻击者的攻击成本

对节点主动建立连接和被动建立连接的数量做一定的均衡

发起日蚀攻击,需要主动占满目标节点的路由表,也就是主动与目标节点建立连接,即便不是这样,也有方法让目标节点主动建立连接到恶意节点。所以对于进出的连接数,做一定的均衡能有效避免日蚀攻击的发生

NodeID 重启之后变化

进行日蚀攻击的前提是需要知道目标节点的 NodeID,并且迫使目标节点重启,然后以事先根据目标节点 NodeID 计算好的伪造节点发起连接,达成日蚀攻击。所以如果节点重启之后 NodeID 变为与原来不再一致,那么攻击者事先计算伪造的节点就变得毫无可用之地了。

其他辅助措施

比如节点实时检测,发现恶意节点进行广播,并采取一定的惩罚措施等。

写在最后

最后我们再来简单对比一下比特币和以太坊对日蚀攻击的反应。

由于以太坊采用的是结构化的 P2P 网络,并且采用了 kademlia 算法,那么知道了 NodeID,基本上就大致能知道这个路由表中应该填入一些什么类型的节点;

而对于比特币来说,由于比特币的 P2P 网络采用的是无结构的模型,节点之间以随机,松散的方式进行组织。想要通过类似以太坊日蚀攻击的方法去攻击比特币网络,不太行得通,因为比特币节点不关心你的 NodeID。但是还是有办法迫使比特币节点只与恶意节点建立连接的。

Blog:

rebootcat.com

email: linuxcode2niki@gmail.com

2020-04-12 于杭州 By 史矛革

最新回复(0)