裂脑造成安全漏洞时的网络分区风险

Mat*_*ell 4 networking security scalability high-availability

我希望通过使用分布式数据系统创建一个高可用性、可扩展的网络解决方案。此处的节点描述了可以控制数据的一个副本的网络。这些节点可能包含不止一台机器,但拥有一份数据副本。

节点将包含可能处于已用状态或未用状态的数据记录。客户端可以请求将记录从未花费状态转换为花费状态(请求花费)。如果他们可以多次成功执行此操作,则存在安全风险。

单个节点,如果它与所有其他节点有连接,则可以告诉节点已经请求支出,并且可以确保没有其他节点想要访问数据并且支出尚未发生。节点可以将数据的状态更改为已花费,而其他节点不会这样做,因为它们知道其中一个节点正在更新它并处理花费。所有节点都会更改数据,因此记录处于已花费状态。

如果一个节点无法访问另一个节点,它可以假设另一个节点已关闭,并将继续与其他节点一起运行,直到另一个节点恢复正常运行。在这种情况下,节点会将所有更新发送到恢复的节点。如果这个失败的节点正在执行当时未完成的支出操作,那么它可以完成它。这将导致某些操作的轻微停机。这将是在一个节点告诉其他节点它将花费,然后在它完成花费过程之前失败的情况下。在这种情况下,其他节点被阻止更新它,因此故障节点需要在完成之前重新联机。

问题是,支出的处理只能发生一次。如果网络被分区,知道这一点的攻击者可以请求在一个分区和另一个分区上花费。网络的每个分区都会假设另一个分区已关闭,因此将独立运行。这可能会导致多次处理支出。

如果在分区期间未向网络两侧发出请求,则这不会成为问题。当重新建立连接时,网络将最终变得一致。如果攻击成功,节点会在重新建立连接时了解攻击,因为网络的两侧会宣布相同的更改。

所以这是可检测的攻击,但实际上可能吗?

攻击者需要故意尝试这样做。该软件并非旨在同时发出多个支出请求。攻击是有时间成本的。如果攻击者失败,他们需要时间才能重新创建未使用的记录。创建未使用的记录需要钱。并且需要在一次攻击中使用更多的钱才能获得更高的收益。之所以有时间成本,是因为要收回钱再试一次需要时间。他们可以承受许多较小的攻击,然后对他们的好处会更少,造成的损害也会更少。

当然,分区自然非常罕见,如果攻击者在任何时候尝试攻击,攻击者必须非常幸运地获胜?

如果连接自然丢失,节点可以停止所有操作并尝试重新连接。使用低超时连接到节点意味着它不会导致任何停机时间(也许只是很少增加延迟)。如果重新连接失败,则它将继续尝试,然后重新启动操作(假设节点已关闭)。类似的东西可以防止偶尔的连接错误吗?

那么攻击者是否能够检测/导致网络中的分区?发生分区的可能性有多大以及持续多长时间?如果可能,可以通过哪些方式解决问题?

谢谢你。

sys*_*138 5

在集群场景中处理过类似的问题,我对你描述的情况很熟悉。此类系统通常具有法定人数的概念,这就是此类系统需要奇数个成员节点的原因。仲裁用于确定多数和少数分区。

法定人数是大于一半的数字,它定义了提供服务所需的可用节点的最小数量。如果发生网络分区,则只有一个分区有仲裁,另一个会停止服务,直到该分区消失。如果发生多分区事件,则可能导致根本无法提供服务。但是,它确实保证只有一个节点在服务,这就是提供一致性的方式。

至于分区的可能性,这取决于您的基础设施以及您的节点如何相互通信可用性状态。

至于它们检测分区事件的能力,这取决于您的代码。使这种攻击成为可能的主要事情是,如果两个分区在分区期间都可以独立寻址,则可能并非如此。根据我的经验,网络分区经常将最终用户排除在一个分区和其他节点之外。如果分区不可寻址,则此攻击成功的可能性要小得多。