旧博文,搬到 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 史矛革

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

  1. 浅谈几种区块链网络攻击以及防御方案之拒绝服务攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/14/network_attack_of_blockchain_ddos_attack/ 写在前面的话 自比特币 ...

  2. 浅谈几种区块链网络攻击以及防御方案之女巫攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/13/network_attack_of_blockchain_sybil_attack/ 写在前面的话 自比特 ...

  3. 浅谈几种区块链网络攻击以及防御方案之其它网络攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/16/network_attack_of_blockchain_other_attack/ 写在前面的话 自比特 ...

  4. 浅谈几种区块链网络攻击以及防御方案之51#37攻击

    旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/11/network_attack_of_blockchain_51_attack/ 写在前面的话 自比特币诞生 ...

  5. 浅谈一种规避iOS多线程Crash的方案

    一般来说,多线程编程因具有以下几个优点,一直被广泛应用: 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 但是因为多线程而导致的crash问题,也是令程序员非常头疼的一个问题,因为线程调度执 ...

  6. [原]浅谈几种服务器端模型——反应堆模式(epoll 简介) - _Boz - 博客园

    [原]浅谈几种服务器端模型--反应堆模式(epoll 简介) - _Boz - 博客园 [原]浅谈几种服务器端模型--反应堆模式(epoll 简介) 引言:上一篇说到了线程池方式来处理服务器端的并发, ...

  7. 区块如何防篡改_一种区块链防篡改技术的优化方法与流程

    本发明涉及区块链技术领域,具体涉及一种区块链防篡改技术的优化方法. 背景技术: 区块链是比特币等数字虚拟货币的底层技术,通过去中心化的数据记录,由全网所有的节点共同维护数据,实现安全地存储数据,具有不 ...

  8. 四种区块链底层技术形态的对比解读

    新世纪以来,互联网技术快速发展,催生了以平台经济为典型的各种新业态.新模式,深刻影响和改变了人类社会的生产方式.生活方式和社会治理方式.然而在推动经济和社会发展的同时,基于数据点对点传输建立的互联网也 ...

  9. 区块链电子签名技术及方案

    数字签名技术是电子签名的底层核心技术,由非对称密钥加密技术和数字摘要技术构成.首先发送方利用Hash函数对文件内容进行加密并生成数字摘要,然后利用私钥对数字摘要加密形成数字签名;接收方利用发送方提供的 ...

最新文章

  1. idea上实现github代码同步
  2. 【机器学习】基于蚁群算法的多元非线性函数极值寻优
  3. windows下 nginx安装 使用
  4. js源码 模仿 jquery的ajax的获取数据(get,post )的请求封装
  5. 【solr基础教程之九】客户端
  6. execl中设置的格式无法实现
  7. allow control allow origin_Origin绘图笔记(一)——如何高效绘制一个漂亮的数据图...
  8. DXUT框架剖析(6)
  9. 18.模板引擎(2)
  10. Office系列完全干净卸载工具合集(最全)
  11. 蓝海灵豚医疗器械信息管理系统B/S
  12. windows下V-Rep下载及安装教程
  13. 淘金网UCskype即时通讯软件定制
  14. 前端学习 -- HtmlCss -- 背景
  15. 怎样设计一个好的社交网站
  16. 设置chrome浏览器访问http服务时使用麦克风
  17. Java零散知识点记录——类的方法
  18. JS处理JSON字符串转数组,数字超17为处理方法
  19. k8s每天报告服务器状态信息,[工作随笔] 配置 cron 检查 K8s Pod 存活状态以推送钉钉消息...
  20. 10w 行级别数据的 Excel 导入,完整优化记录

热门文章

  1. 10行Python代码实现Web自动化管控
  2. GitHub开源的10个超棒后台管理面板
  3. Linux那些事儿 之 戏说USB(18)设备的生命线(一)
  4. 深度学习--TensorFlow (1)单层感知器1 -- 实现单数据训练
  5. mysql innodb 设置,Mysql5.5 InnoDB存储引擎简单设置
  6. Udacity机器人软件工程师课程笔记(三十五) - SLAM - 基于网格的FastSLAM
  7. Linux 下安装cnpm淘宝镜像命令npm
  8. Vue引入百度地图,如何去掉左下角的版权logo百度等信息?
  9. 不能忽略的Nginx做web服务器的favicon.ico图像找不到问题
  10. 贪心:Jump Game 跳跃游戏