Total Eclipse of the Heart – Disrupting the InterPlanetary File System
这次要分享的文章是发表于 Usenix security’22 上对于IPFS的P2P网络进行日蚀攻击。作者是来自Graz University of Technology的Bernd Prünster
IPFS是一个点对点的分布式文件系统,允许用户在全球范围内共享和访问文件。在这篇论文中,作者展示了IPFS上首个端到端的日食攻击,使攻击者能够单独选择、分割和破坏IPFS网络上的特定节点。他们成功地在实时IPFS节点上实施了这种攻击,并评估了它的潜在威胁,得出结论即使是拥有适度攻击能力的攻击者也可以使用它来破坏整个公共IPFS网络。
IPFS
IPFS是一种分布式内容寻址文件系统,其中数据不是通过名称或路径进行标识,而是通过其哈希值进行标识。IPFS以分散方式存储所有数据,并在整个网络上覆盖一个Merkle有向无环图(DAG)来创建一个可索引内容的网络结构。网络中存储的所有内容和参与网络的每个节点都被分配了唯一标识符(CID)。CID是通过计算其内容的加密哈希值直接派生的。每一个参与参与P2P网络的节点都会生成一对非对称加密密钥,公钥用作节点的唯一ID。私钥被节点用于签名传出数据,以提接收节点验证其身份。为了实现安全可靠的内容和节点发现,IPFS基于Kademlia分布式哈希表(DHT)。每个节点都维护着自己的路由表,其中包含有关相邻节点的信息。这些信息以二叉树的形式进行结构化,其中包含节点ID到网络(IP)地址的映射。要查找某个节点或特定数据,节点会遍历其自己的树以获取所需的ID。如果能够发现所需的ID,则节点可以使用分配的网络地址访问相关信息。否则,节点会询问最接近所需信息的节点。由于IPFS使用Kademlia,因此可以通过两个节点ID间的距离(XOR)找到最接近的节点。重复进行,直到找到所需的节点或信息。这种方法只需要 O(log2(N)) 个请求即可定位任何内容或节点。这种效率的代价是限制可以本地存储的路由信息的数量。为了弥补这一点,IPFS具有一种称为swarm的数据结构,其保存了超出DHT限制数量的连接。这被用于IPFS的内容分发功能。要在IPFS网络中查找某个数据,节点首先从自己的swarm中每个节点请求数据。如果swarm中的某个节点能够提供它,则向该节点请求数据,如果不能,则使用DHT查找数据。
libp2p
libp2p库是一个独立的项目,最初是IPFS的一部分。它包括一个DHT、传输抽象和其他构建去中心化应用所需的组件。libp2p是为各种区块链的解决方案P2P网络的提供了基础框架。libp2p的DHT基于Kademlia。为了提供存储超过了DHT的容量限制的连接信息的要求,IPFS节点提出了叫swarm的数据结构。在swarm中存储了所有当前活动连接,因此其内容是存储在DHT中的连接集合的超集。IPFS还使用swarm通过先查询整个swarm来加速内容发现,然后再查询DHT。由于swarm是无界的,这存储过多的连接可能会导致资源耗尽。为了防止这种情况,libp2p引入了一个组件称为连接管理器或ConnMgr,其主要工作是保持合理数量的有效连接。这可以确保避免资源耗尽保证内容发现和整个P2P网络流可以有效地操作。目前,libp2p只有一个连接管理器的实现。该实现每分钟遍历一次活动连接集合(即swarm)。如果打开的连接数超过了可配置的阈值(称为highWater标记),则开始清除连接,直到达到第二个配置的阈值(lowWater标记)。最近建立的连接免于修剪,这可以防止攻击者在短时间内建立超过highWater数量的连接,使得ConnMgr开始断开所有旧连接。为了选出哪些连接需要被清除,libp2p设计了一个评分系统,每一个连接都被给予了一个分数。分数低的连接会最先开始被清除。在libp2p中,每一个存在于DHT的连接首先都会被设定一个基本分数,其为 5 + 目标节点ID XOR 本地节点ID。
日蚀IPFS节点
如果攻击者可以一个节点接着一个节点遮蔽,并且保持节点不重新连接所需的资源很少,即使攻击者的总体能力比P2P网络少几个数量级,其也可以破坏P2P网络。本文展示了针对实时IPFS DHT的这种攻击。作者展示了如何从攻击单个节点升级到使用几乎没有运行成本的方式来分割网络。作者实现的对单个节点的攻击能够在几分钟内污染主IPFS网络中任何节点的路由表,并在不到一个小时的时间内完全遮蔽一个普通节点,其概率为约75%。开始攻击所需的唯一输入是目标节点的标识符,所有其他参数都可以远程查询。此外,IPFS使用可配置但静态的引导节点对新加入网络的节点进行引导。因此,毒化引导节点的路由表就足以使新加入网络的节点永远不会发现其他合法节点。
传统的攻击策略
在传统的攻击策略中,攻击者预先生成n个虚假节点ID,随后尝试以预先生成的节点ID与目标节点建立连接。直到目标节点DHT中的低位的30个buckets中的节点被替换为攻击者预先生成的节点,从而实现对目标节点的遮蔽。然而,达到这个目标需要的时间是不可能量化的,因为它实际上是取决于目标网络的状况变化。
作者的攻击策略
作者积极利用libp2p中ConnMgr的行为。DHT中的节点将被授予ConnMgr分数(例如,更接近的节点得分更高),因此作者采取尽可能预生成标识符来填充攻击目标的DHT的更多存储桶,以获得额外的积分的方法。作者预先生成约1460亿个节点ID(29 TB),以填充任何节点的DHT中的低33个bucket。
作者的攻击包括四个阶段:ID生成,设置阶段,攻击阶段和低成本阶段,一旦受害者被遮蔽,可以维持低成本阶段。实际攻击由一个基于libp2p的节点执行(以进一步降低成本),该节点执行攻击,用于遮蔽目标。该节点需要一组预生成的ID(来自ID生成步骤),来攻击受害者的DHT。然后,主攻击循环包括以下步骤:
-
尽可能与目标建立连接,每个连接使用一个预生成的节点ID,从而覆盖受害者DHT的低33个bucket。 -
使用随机生成的标识符建立额外的连接,以达到ConnMgr设置的highWater标记的总活动连接数。这确保了定期清除连接。 -
向每个连接发送消息,从而增加其分数,从而欺骗目标的ConnMgr认为这些连接比与诚实节点的连接更重要。 -
当目标的ConnMgr修剪连接以达到lowWater标记的总活动连接数时。所有其他连接都将被修剪,留下主要是我们恶意的libp2p节点建立的那些连接,因为我们之前欺骗了目标的ConnMgr,认为我们的连接比与诚实节点的连接更重要。
Evaluation
作者首先对一个普通的libp2p节点进行测试,其ConnMgr参数为(lowWater = 600, highWater = 900, 清除间隔20s。其结果如图所示,展示了100次攻击中攻击者和其他节点在目标swarm和DHT中的数量。在攻击开始前,受害者很好的连接到IPFS的网络中,并且在前5分钟内,善意节点数量从未低于lowWater。在5分钟后开始攻击,攻击者在swarm和路由表中的数量几乎瞬间增加,而其他节点的数量迅速下降。不到十分钟后,所有受攻击节点的路由表都被恶意节点完全占据,而在不到17分钟的时间内,完全遮蔽节点的概率已经超过50%。在攻击者的目标不是完全遮蔽一个节点而是防止一个节点高概率地发现任何内容的情况下,所需时间更少。正如下图所示,几乎可以保证在不到半个小时内将目标的swarm中的善意节点缩小到少于10个。
作者之后对一个引导节点进行测试,其ConnMgr参数为(lowWater = 1000, highWater = 2000, 清除间隔60s。其结果如图所示,尽管恶意节点占据了受害者绝大部分的DHT,但仍有一部分正常的连接存在。
对策
在作者将攻击提交给IPFS的开发者Protocol Labs 之后,在go-ipfs v0.5 中发布的 libp2p 版本解决了无条件移除 DHT 节点的问题(,这一版本于 2020 年 4 月 28 日发布。此外,在 6 月发布的 go-ipfs 0.6有效防止了普通攻击者实施本文所介绍的攻击。
go-ipfs v0.5 中的对策
在go-ipfs v0.5中,开发者添加了当节点从自身的DHT中删除连接的延迟。当节点从DHT中删除连接时,真正的连接删除将延迟45分钟。作者测试了在这种情况下对于IPFS中普通节点和引导节点的攻击。
如上图所示,在go-ipfs v0.5中,仅仅讲对普通节点的攻击时间延长到了超过11小时,攻击者依旧可以在一天内实现对于单个节点的日蚀攻击。同样,对于引导节点,其攻击时间被延长到了一周以内。
go-ipfs v0.6 and v0.7 中的对策
在go-ipfs v0.5中,开发者限制了单个IP可以建立的最大连接数。对于单个IPv4或IPv6/23子网地址,与目标节点最多可以建立三条连接,多余的连接讲被拒绝连接。作者认为这种方法可以有效阻挡作者的攻击策略,使得攻击者只能使用传统的攻击策略进行攻击。
Conclusion
本文介绍并展示了一种成功的对于IPFS节点日蚀攻击。利用libp2p库的漏洞,作者成功地污染了IPFS底层P2P网络节点本地存储的路由信息。此外,作者还展示了他们的攻击能够遮蔽任意IPFS节点,从而破坏整个基于公共DHT的IPFS网络。对现有IPFS节点应用我们的攻击证明了攻击的有效性和可行性。进行的评估已经证明,全球范围的攻击已经可以通过低成本实施,这意味着即使攻击者资源有限,这种攻击也是可行的。
作者认为其所提出的攻击的影响是巨大的,主要原因有两个。首先,作者的攻击利用了IPFS连接管理中的概念性缺陷,这个问题没有简单的解决方案。其次,作者的工作已经导致了一个成功的持续加固过程。使得其他基于IPFS的服务的整个生态系统都从上游发布的修复中受益。
原文始发于微信公众号(COMPASS Lab):[论文分享] Disrupting the InterPlanetary File System