以太坊是一个出了名的对抗性环境,它甚至被比作一个「黑暗森林」(三体中可怕的博弈论概念)。这种声誉主要来自应用层(不安全的智能合约)或社交层(用户被操纵放弃私钥或无意中签署交易)的弱点,以及从交易存储池中提取价值(MEV)的机器人的存在。然而,作为小偷或破坏者的老练黑客,也在不断寻找机会攻击以太坊的客户端软件。客户端软件可以将计算机变成以太坊节点,它是定义连接到其他节点、交换信息以及就以太坊区块链状态达成一致的所有规则的代码。而对协议层的攻击,就是对以太坊本身的攻击。
很快,以太坊客户端就会进行一次重大升级(称为「合并」),这会关闭保护以太坊的工作量证明(PoW)算法,取而代之的是一种权益证明(PoS)共识机制。造成这种情况的原因有很多,这在其他文章当中已经有详细解释?。这将是一场哲学变革,同时也是一场技术变革。
合并到权益证明(PoS)共识机制带来了可持续性以及可扩展性方面的好处,但另一方面,客户端软件的复杂性将会增加,协议的潜在攻击面也会增加。目前,保护 PoW 以太坊区块链只需要运行单个软件,而在「合并」之后,需要运行的软件增加到了 3 个(执行客户端、共识客户端以及验证器)。
本文概述了以太坊共识层上已知的攻击向量,并概述了一些防御这些攻击的方法。读者可能需要掌握一些信标链的基础知识,才能从本文中获得最大价值。
这些都是很大的话题。但我在下面的序言中包含了一些非常易懂的入门知识。
序言
激励层
信标链是一个权益证明(PoS)区块链,它使用以太坊的原生加密货币 ETH 进行保护,希望参与验证区块以及识别区块链头部(head)的节点运营商将 ETH 存入以太坊的智能合约中。然后,他们获得 ETH 的报酬以运行验证器软件,检查通过对等网络接收到的新区块的有效性,并应用分叉选择算法来识别区块链头部。节点运营商现在是「验证者」,而验证者有两个主要角色:1)检查新区块并「证明」它们是否有效,2)从总验证器池中随机选择时提出新区块。如果验证者在被询问时未能完成这两项任务中的任何一项,他们就会错过 ETH 支付。还有一些非常难以意外执行,并且表示有恶意意图的操作,例如在同一个 slot 提出多个区块,或在同一个 slot 证明多个区块,这些是「可罚没」的行为,可导致验证器在从网络中移除之前燃烧一定数量的 ETH(最多为 0.5 ETH),这需要 36 天。被罚没的验证器的 ETH 在退出期内会缓慢流失,但在第 18 天,当有更多的验证器同时被罚没时,它们会受到更大的「相关性惩罚」。因此,信标链的激励结构是奖励诚实行为者,并惩罚不良行为者。
分叉选择
分叉选择算法由每个验证器运行,其作用是识别区块链的头部。在完全诚实的验证器及零网络延迟的理想条件下,分叉选择算法实际上是不必要的,因为此时区块链的顶端只有一个区块。然而,在现实当中,一些客户端会比其他客户端更晚接收区块,从而创建了区块链头部的多个版本,并且可能存在一定比例的行为不端的验证器,这些验证器可能在同一个 slot 提议或投票多个区块。这意味着必须要有某种算法来从多个选项中挑选出真正的区块链头部。
稍微提一下,信标链也会以固定的间隔使区块链固定不变,这被称为「最终性」(finality)。该过程通过将每个 epoch 中的第一个 slot 视为「检查点」来工作。如果一个检查点从持有存款合约中至少 2/3 总质押 ETH 的验证器那里收集证明(投票),那么它被称为「justified」的。一旦该检查点在其之上有另一个检查点,它就成为「最终」检查点。然后,分叉选择算法只考虑区块链中不合理部分的区块。证明并最终确定区块链的算法称为「Casper FFG?」,而分叉选择算法本身被称为 LMD-GHOST?(代表「最新消息驱动的最贪婪、最重的观测子树」),这是一种用行话表达的方式,即正确的区块链是累积了最多证明(GHOST)的区块链,并且如果从同一验证器接收到多条消息,则只有最后一条消息才算(LMD)。每个验证器使用此规则评估每个区块,并将最重的区块添加到其规范链中。
每个 epoch 时期,验证器需要签署一份证明,该证明包含两条关键信息:「LMD 投票」和 「FFG 投票」。LMD 投票是验证器认为区块链头部的区块的根,FFG 投票包含目标检查点和源检查点的区块哈希以及 epoch,其中源检查点是链已经知道的最近正当检查点,而目标检查点是下一个要证明的检查点。
因此,信标链的共识算法是 LMD-GHOST 和 Casper FFG 的组合,有时我们也将其称为 Gasper?。简单了解了这个背景知识后,我们可以继续研究这个系统可能受到的一些攻击方式。
第 0 层攻击
首先,没有积极参与以太坊(通过运行客户端软件)的个人,可选择针对社交层(第 0 层)来攻击以太坊网络。尽管这些攻击从未真正直接影响任何以太坊软件的执行,但它们会给以太坊带来风险。第 0 层是构建以太坊的基础,因此它代表了一个潜在的攻击面,其后果会波及堆栈的其余部分。以下是我想到的一些例子:
1.跨多个平台发起并持续数月或数年的重大错误信息宣传活动,可能会削弱社区对以太坊路线图、开发团队的信任。这可能会减少愿意参与网络安全的个人数量,降低去中心化和加密经济安全性。
2.针对开发者社区的定向攻击或恐吓,这可能导致开发人员自愿退出,并减缓以太坊的发展,同时更广泛地打击士气。
3.过度热情的监管也可以被视为一种第 0 层攻击,因为它可能会迅速抑制参与和采用。
4.知识渊博但恶意的参与者渗透到开发者社区,其目的是通过减少讨论、延迟关键决策、创建垃圾帖或转移注意力提案等来减缓进度。
5.故意煽动以太坊社区的不满情绪,目的是制造足够的动荡以造成永久性分裂。
6.向以太坊生态系统中的关键参与者行贿以影响决策。
在很多情况下,发动 L0 攻击所需的资金或技术知识很少,这使得对社交层的攻击尤其危险。真正需要的只是时间和恶意的意图,而不是稀缺的资源。思考第 0 层攻击如何成为一次加密经济攻击的倍增器也很有趣。例如,如果审查或最终性逆转是由恶意的多数质押者实现的,那么破坏社交层可能会使带外(out-of-band)社区协调响应更加困难。
防御第 0 层攻击可能并不简单,但可以建立一些基本原则。一是保持以太坊公共信息的整体高信噪比,以太坊由社区的诚实成员通过博客、discord 服务器、带注释的规范、书籍、播客以及 YouTube 创建和传播。Ethereum.org 就是一个很好的例子,特别是他们正在迅速将其广泛的文档和解释文章翻译成多种语言。用高质量的信息和 meme 充斥一个空间,是防止错误信息的有效防御措施(信息缺口是脆弱的)。以太坊社区擅长于此,但长期的第 0 层安全需要持续致力于创建和传播高质量信息。
另一个针对社交层攻击的重要防御措施,是明确的使命声明和治理协议。以太坊将自己定位为智能合约 L1 中的去中心化和安全冠军,同时也高度重视可扩展性和可持续性。无论以太坊社区出现什么分歧,这些核心原则都会受到最低限度的影响。根据这些核心原则评估叙述,并通过 EIP(以太坊改进提案)过程中的连续几轮审查,可能有助于社区区分出好人和坏人,并限制恶意行为者影响以太坊未来方向的范围。
最后,以太坊社区保持开放并欢迎所有参与者,这一点至关重要。一个有看门人、精英主义和排他性的社区,尤其容易受到社交攻击,因为这很容易构建「我们和他们」的叙事。另一方面,一个开放和包容的社区是通过开放的讨论更有效地消除错误信息的社区。部落主义和有毒的最大主义(maximalism)伤害了社区,这会侵蚀第 0 层的安全。以太坊通常有一个非常开放的社区,它欢迎新的参与者,但随着社区规模的扩大,这可能会变得越来越难以维持。对网络安全有既得利益的以太坊社区成员,应将其在线行为和在现实世界中的行为视为对以太坊第 0 层安全的直接贡献,因为正如我们将在本文后面讨论的,强大的社交层是抵御协议攻击的最后一道防线。
攻击者的奖励
第 0 层攻击可能旨在破坏公众对以太坊的信任、使 ETH 贬值、降低以太坊的采用率,并使以太坊容易被其他竞争链超越,或者是削弱以太坊社区,使带外协调更加困难。然而,攻击以太坊网络本身所能获得的好处并不明显。
一个常见的误解是,成功的攻击允许攻击者生成新的 ETH,或从任意账户中提取 ETH。这两种说法都是不可信的,因为添加到区块链的所有交易都由网络上的所有执行客户端执行。它们必须满足有效性的基本条件(例如,交易由发送方的私钥签名,发送方有足够的余额等),否则它们会简单地还原。攻击者实际上可能会针对几种结果发起攻击:重组(reorgs)、双重最终性(double finality)或最终性延迟(finality delay)。
「重组」是对区块链头部区块的重新排列。在攻击中,这旨在确保包含或排除某些区块,即使它们不在诚实的网络中。这可能允许攻击者进行「双花」,例如,将他们的 ETH 发送到交易所并将其兑现成法定货币,然后重组以太坊区块链以删除这笔交易,这样他们最终能够拿回 ETH 并获得法币。或者,重组可能允许老练的攻击者通过抢先交易(front-running)或尾随式交易(back-running)从其他人的交易中提取价值(MEV),或者重组可能会持续阻止某人或某些组织的交易被包含在规范链中,从而有效地从以太坊网络中对其进行审查。
最极端的重组形式是「最终性反转」(finality reversion),它可删除或替换先前已经确定的区块。这种情况只有在至少 1/3 质押的 ETH 被销毁时才有可能发生,这种保证被称为「经济最终性」,稍后我们会详细介绍。
双重最终性(Double finality)攻击的可能性很低,但这种情况会很严重,发生时两个分叉能够同时确定区块,从而造成永久性的区块链分裂。这在理论上是可能的,只要攻击者能够掌握 34% 及以上总质押的 ETH,并愿意冒险失去它们。然后社区将被迫进行链外协调,并就遵循哪条链达成共识。稍后我们将详细探讨这些类型的社会协调防御。
最终性延迟(finality delay)攻击会阻止网络达到 Casper-FFG 确定链的必要条件。这将对以太坊的应用层造成极大的破坏,因为在以太坊之上运行的许多应用都依赖于快速最终性来运行。如果对区块链的最终确定性没有高度信心,就很难相信建立在它之上的金融应用。最终性延迟(finality delay)攻击的目的,可能只是为了破坏以太坊,而不是直接获利,除非攻击者部署了一些战略空头头寸。
懒惰和发送相互矛盾的消息(Laziness and Equivocation)
任何人都可以运行以太坊的客户端软件,即使没有运行验证器。人们这样做是因为它提供了区块链的本地副本,可用于非常快速地验证数据,并使交易能够私下提交给以太坊网络,而无需通过中心化的第三方(例如 Infura 或 Quicknode)。然而,不同时运行验证器的节点运营商,就无法参与区块生产或验证。这意味着他们根本不会影响到网络安全。非验证节点运营商攻击信标链的可能性可以忽略不计,除非他们也发起不相关的第 0 层攻击。
要向共识客户端添加一个验证器,用户需要在存款合约中质押 32 ETH。通过一个活跃的验证器,用户开始通过提议和证明新区块来积极参与以太坊的网络安全。在承担这些额外责任的同时,用户以 ETH 的形式获得回报,但这也给他们带来了报复行为的新机会。验证者现在有了发言权,他们可以用于影响区块链的未来内容,他们可以诚实地工作以增加他们的 ETH 储备,或者他们可以冒着风险,尝试操纵这个过程以实现自己的利益。发起攻击的一种方法是累积大比例的质押权益,然后用它来击败诚实的验证者。攻击者控制的质押权益比例越大,他们的投票权也就越大,尤其是在我们稍后将探讨的某些经济里程碑上。然而,大多数攻击者将无法积累足够的 ETH 来实现这种攻击方式,因此他们不得不使用微妙的技术来操纵诚实的大多数人以某种方式行事。
从根本上讲,所有针对信标链的小规模质押攻击(small-stake attacks)都是两种类型的验证器错误行为的细微变化:活动不足(未能证明 / 提议或延迟执行)或过度活动(在一个 slot 时间段中提议 / 证明次数过多)。在最普通的形式中,这些行为很容易由分叉选择算法和激励层处理,但有一些聪明的方法可以让这些算法对攻击者有利。目前已经发现了几种这样的技术,主要是仔细协调其消息的时间和传播,以控制整个验证器集的不同子集如何查看区块链的状态,从而控制它们的行为方式。下一节将描述低质押(low-stake)攻击者攻击网络的一些方式,以及如何抵御这些攻击。
小型质押者的攻击
短程重组(Short range re-orgs)
有几篇论文解释了针对信标链的攻击,这些攻击仅使用了一小部分质押的 ETH 来实现重组或最终性延迟攻击。这些攻击通常依赖于攻击者向其他验证器隐瞒一些信息,然后以某种微妙的方式或在某个适当的时候发布它。这些攻击通常旨在从规范链中替换一些诚实的区块。当攻击开始时,这些诚实的区块尚未被创建,这种攻击被称为事前重组(ex ante reorg),而不是事后重组(在这种重组中,攻击者回顾性地从规范链中删除已经验证的区块)。在 PoS 以太坊中,如果不控制 2/3 质押的 ETH(按当前价格计算约为 180 亿美元),事后重组实际上是不可能的。如果攻击者控制的质押权益百分比少于 66%,则攻击者完成事后重组的机会非常低(即使攻击者控制了 65% 的质押权益,他们的成功机会也小于 0.05%)。
另一方面,可以很好地防止事后重组的相同机制,可以被老练的攻击者在非常特定和不太可能的网络条件下用来创建事前重组。例如,这篇论文?展示了攻击验证者如何为特定 slot n + 1 创建和证明区块 (B),但避免将其传播到网络上的其他节点。相反,他们会扣留该已证明的区块,直到下一个 slot n + 2。诚实的验证者为 slot n + 2 提出一个区块(C)。几乎同时,攻击者可以释放他们扣留的区块(B)及其保留的证明,并证明区块(B)是区块链的头部,他们对 slot n + 2 的投票,有效地否认了诚实区块(C)的存在。当诚实区块(D)被释放时,分叉选择算法看到区块(D)建立在区块(B)之上,要比建立在区块(C)之上的区块(D)更重。因此,攻击者成功地使用 1 区块事前重组将 slot n + 2 中的诚实区块(C)从规范链中移除。掌握 34% 质押权益的攻击者有很好的机会在这次攻击中获胜,因为他们的投票给了攻击者首选的分叉 68% 的权重,而诚实分叉的权重为 66%,如此处所述?。这意味着他们不需要依靠操纵诚实的验证器来与他们一起投票。不过,理论上,这种攻击可以用更少的质押比例来尝试。Neuder 等人描述了在 30% 质押比例下的事前重组攻击方式,但后来证明,在控制 2% 比例的质押权益下,这种事前重组攻击也是可行的。
一个成功的重组攻击者无法改变历史,但他们可以不诚实地改变未来。他们不需要控制大多数质押的 ETH 就可以做到这一点,尽管他们成功的机会会随着控制质押比例的增加而增加。这种重组攻击可允许他们实现双花或通过 front-running 大额交易来提取 MEV。这种攻击还可以扩展到多个区块,但成功的可能性会随着重组长度的增加而降低。
弹跳攻击和平衡攻击(Bouncing and Balancing)
更复杂的攻击可以将诚实的验证器集,拆分为对区块链头部有着不同看法的离散小组,这被称为平衡攻击(balancing attack)。在这种情况下,攻击者等待机会提出一个区块,当它到达时,他们会在同一个 slot 中提出两个区块。他们将一个区块发送给诚实验证器集的一半,将另一个区块发送给另一半。分叉选择算法将检测到这种模棱两可的情况,并且区块提议者会被罚没并从网络中弹出,但这两个区块仍然存在,并且将有大约一半的验证器集证明每个分叉。在花费单个验证器罚没成本的情况下,攻击者成功地将区块链一分为二。与此同时,其余的恶意验证器扣留了他们的证明。然后,通过在执行分叉选择算法时有选择地将有利于一个或另一个分叉的证明发布给足够的验证器,他们能够让网络看到任何一个具有最多累积证明的分叉。这可以无限期地继续下去,攻击验证者在两个分叉上保持验证器的平均分配。由于两个分叉都无法吸引 2/3 的绝对多数,所以信标链无法最终确定。攻击验证者控制的质押权益比例越大,在任何给定 epoch 时间段进行攻击的可能性就越大,因为他们越有可能选择验证器在每个 slot 中提议一个区块。即使只控制 1% 的质押权益,发动平衡攻击的机会平均每 100 个 epoch 时期就会出现一次,这并不需要等待太久。
一种名为弹跳攻击(bouncing attack)的类似攻击方式,也只需要控制一小部分质押权益。在这种情况下,攻击的验证器再次拒绝投票。这一次,他们没有发布投票来保持两个分叉之间的平均分配,而是在适当的时候使用他们的投票来证明在分叉 A 和分叉 B 之间交替的检查点的合理性。两个分叉之间的这种翻转,可停止最终确定性。
弹跳攻击和平衡攻击的防御措施
弹跳攻击和平衡攻击都依赖于攻击验证器将其证明延迟到某个适当的时刻,以便对网络产生巨大的影响。因此,只有在不太可能的网络同步条件下,并且攻击者通过紧密协调的共谋验证器对消息时间进行非常精细的控制情况下,这种攻击才是可行的。尽管如此,仍然有必要关闭这个攻击向量。为了防止迟到的消息影响共识,与及时收到的消息相比,迟收到的消息的权重可以减少。这被称为提议者权重提升?(proposer-weight boosting)方案。
对于弹跳攻击,修复方法是更新分叉选择算法,以便最新的合理检查点只能在每个 epoch 的前 1/3 slot 期间切换到替代链的检查点。这种情况可以防止攻击者保存投票,以便以后部署。针对这些延迟投票攻击的另一种防御措施是,与每个 slot 迟到的投票相比,为及时到达的投票分配更大的权重。
结合起来,这些措施创造了一个场景,在这个场景中,一个诚实的区块提议者在 slot 开始后非常迅速地发出它们的区块,然后大约 1/3 slot(4 秒)的时间段,这个新区块可能会导致分叉选择算法切换到另一条链。在同一截止时间之后,与较早到达的证明相比,来自较慢验证器的证明的权重会较低。这非常有利于快速提议者和验证器确定区块链头部,并大大降低弹跳攻击和平衡攻击的可能性。从本质上讲,这些防御措施可以防止基于大型网络异步性的攻击,即使在上述情况下,也不需要对消息发布进行精细控制。因此,在很大程度上,这些类型的攻击风险,已通过对分叉选择算法的修改得到了缓解,这些修改有利于快速活动并惩罚延迟。
值得一提的是,提议者权重提升(proposer-weight boosting)方案只能抵御「廉价重组」攻击,即攻击者以少量质押权益进行的重组攻击。事实上,在另一种事前重组攻击中,提议者权重提升方案本身可能被更大的质押者玩弄。这篇文章?的作者描述了控制 7% 质押权益的攻击者如何战略性地部署他们的投票,以欺骗诚实的验证器在他们的分叉上构建,重组掉一个诚实的区块。投票给对手分叉的诚实验证器会及时投票,以便攻击者从提议者权重提升方案中受益。同样,这种攻击是在假设理想的延迟条件下设计的,而在实际情况下很难满足这种条件。总的来说,攻击者控制的质押权益比例越大,其成功攻击的几率就越大。而更大的质押权益,也意味着更多的风险资本以及更强的经济抑制力。
高级平衡攻击
上面描述的弹跳攻击和平衡攻击依赖于恶意验证器对网络上其他验证器何时收到他们的消息进行非常精细的控制,而这类攻击已通过提议者权重提升(proposer-weight boosting)方案有效地缓解了。
但是,研究者还描述了一种额外的攻击?,它不依赖于对网络延迟的细粒度控制。在这种情况下,攻击者需要在两个后续 slot 中使用一个提议的验证器(在任何两个 slot 中发生这种情况的概率,都会随着攻击者控制的验证器的的增多而增加)。其中一个对抗性区块提议者在 slot n 中提议一个区块,然后第二个对抗性区块提议者在 slot n+1 中提议一个冲突区块,从而创建一个分叉。由于没有一个区块提议者模棱两可(equivocated),因此不会发生罚没的情况。在这个例子中,我们假设分叉 A 会更有利。攻击者可以知道这一点,攻击者还可以估计网络上一半验证器提交证明所需的时间……来自 slot n 的保留投票可以在大约一半验证器投票的时间点被释放。这些是来自 slot n 的支持分叉 B 的证明。因此,一半的验证器组投票支持分叉 A,因为它们不知道分叉 B 上的额外证明,而另一半投票支持权重更重的分叉 B。在 n+1 中扣留的敌对投票可用于弥补分叉 B 上因发布扣留证明的时间不准确而造成的任何不足。
这种平衡攻击是针对分叉选择算法的理想版本描述的,它比以太坊共识客户端中实际实现的分叉选择算法具有更可预测的证明时间,而在真正的信标链上执行这种攻击,则要困难得多。将攻击者的节点分布在网络拓扑中可以帮助攻击者在一定程度上克服这一问题,因为他们的消息在整个网络中传播的速度要快于来自一个拓扑位置的消息。
还有人提出了一种专门针对 LMD 规则的平衡攻击?,尽管有了提议者权重提升(proposer-weight boosting)方案,这种攻击仍被认为是可行的。攻击者通过模糊他们的区块提议,并将每个区块传播到大约一半的网络来建立两条竞争链,从而在分叉之间建立近似平衡。然后,相互勾结的验证器会模棱两可地投票,以使一半的网络首先收到它们对分叉 A 的投票,而另一半网络首先收到它们对分叉 B 的投票。由于 LMD 规则丢弃了第二个证明并且只为每个验证者保留第一个证明,因此一半的网络只会看到 A 的投票而 B 没有投票,另一半网络会看到 B 的投票而 A 没有投票。文章的作者描述了 LMD 规则赋予了攻击对手「非凡的力量」来发起平衡攻击。
这种 LMD 攻击向量,已通过更新分叉选择算法关闭了?,以便它完全从分叉选择考虑中丢弃模棱两可的验证器。模棱两可的验证器也可以通过分叉选择算法降低其未来影响。这可以防止上述平衡攻击,同时还可以保持对雪崩攻击(avalanche attacks)的弹性。
雪崩攻击(avalanche attacks)
2022 年 3 月的一篇论文?描述了另一种称为雪崩攻击(avalanche attacks)?的攻击类型。这篇论文的作者认为,提议者权重提升(proposer-weight boosting)方案无法防止雪崩攻击的某些变体。然而,论文作者也只展示了对以太坊分叉选择算法的高度理想化版本的攻击(他们使用了没有 LMD 的 GHOST)。
要发动一次雪崩攻击,攻击者需要控制多个连续的区块提议者。在每个区块提议 slot 中,攻击者扣留他们的区块,收集它们直到诚实链达到与扣留区块相等的 subtree 子树权重。然后,攻击者释放被扣留的区块,使其最大程度地造成混乱。这意味着,例如,对于 6 个扣留区块,第一个诚实区块 n 与敌对区块 n 竞争创建一个分叉,然后所有 5 个剩余的敌对区块都在 n+1 处与诚实区块竞争。这意味着建立敌对区块 n 和 n+1 的分叉现在吸引了诚实的证明,因为此时诚实链的权重等于敌对链的权重。现在可以对剩余的扣留区块重复此操作,从而允许攻击者阻止诚实的验证器跟随链的诚实头部,直到攻击者模棱两可的区块用完为止。如果攻击者在攻击过程中有更多机会提出区块,他们可以使用这些区块来扩展攻击,这样,越多的验证器参与共谋攻击,攻击持续的时间就越长,并且可以将更多诚实的区块从规范链中移出。
而 LMD-GHOST 分叉选择算法的 LMD 部分减轻了雪崩攻击,LMD 的意思是「最后一条消息驱动」,它指的是每个验证器保存的一个表格,其中包含从其他验证器收到的最新消息。只有当新消息来自比特定验证器表中已存在的 slot 更晚的 slot 时,该字段才会更新。在实践中,这意味着在每个 slot 中,接收到的第一条消息就是它接受的消息,任何附加消息都可以忽略。换句话说,共识客户端使用来自每个验证器最先到达的消息,并且相互矛盾的消息会被简单地丢弃,以防止雪崩攻击。
最终性延迟
首次描述低成本单区块重组攻击的同一篇论文?,还描述了一种最终性延迟(也称为「活性失效」)攻击,该攻击依赖于攻击者是 epoch 边界区块的区块提议者。这是至关重要的,因为这些 epoch 边界区块成为了 Casper FFG 用于最终确定链的各个部分的检查点。攻击者简单地扣留他们的区块,直到有足够多的诚实验证器使用其 FFG 投票支持前一个 epoch 边界区块作为当前最终性目标。然后,他们释放扣留的区块,并证明自己的区块,而其余的诚实验证器也会这样做,这样会创建具有不同目标检查点的分叉。如果他们的时间恰到好处,他们将阻止最终性,因为不会有 2/3 的绝对多数证明任何一个分叉。攻击者控制的质押权益比例越小,则时间需要越精确,因为攻击者直接控制的证明越少,攻击者控制提出给定 epoch 边界区块的验证器的几率就越低。
关于长程攻击(long range attacks)的说明
还有一类特定于权益证明(PoS)区块链的攻击,其涉及参与创始区块的验证器在诚实的区块链旁维护一个单独的区块链分叉,最终说服诚实的验证器在很久以后的某个适当时间切换到它。这种类型的攻击在信标链上是不可能的,因为「 finality gadget」(直译为确定性小工具)可确保所有验证器定期就诚实链的状态(「检查点」)达成一致。这种简单的机制可以消除对长程攻击者的担忧,因为以太坊客户端根本不会重组最终确定的区块。加入网络的新节点通过找到一个受信任的最近状态哈希(称为弱主观性?检查点)并将其用作伪创始区块来构建。这将为进入网络的新节点创建一个「信任网关」,然后它才能开始为自己验证信息。然而,从对等方或区块浏览器或其他地方收集检查点所需的信任,并没有增加隐含在客户端开发团队中的信任,因此主观性是「弱的」。因为根据定义,检查点由网络上的所有节点共享,所以不诚实的检查点是共识失败的症状,那此时,无论如何,带外社会协调必须接管以拯救诚实的验证者。
这一切都表明,要以少量的质押权益成功攻击信标链是非常困难的。这里描述的可行攻击需要一个理想的分叉选择算法,以及可能性极低的网络条件,或者攻击向量已通过客户端软件相对较小的补丁关闭。当然,我们并不能排除零日漏洞在野外存在的可能性,但这确实证明了少数质押权益攻击者要成功实现攻击所需的极高的技术能力,对共识机制的了解以及运气。从攻击者的角度来看,他们最好的选择可能是尽可能多地积累质押的 ETH。
拒绝服务攻击(Denial of Service)
以太坊的 PoS 机制从所有验证器集中选择一个验证器,以作为每个 slot 中的区块提议者。这可以使用一个公共函数进行计算,并且对手有可能在他们的区块提议之前稍微提前识别下一个区块提议者。然后,攻击者可以向区块提议者发起垃圾信息,以防止他们与对等方交换信息。对于网络的其余部分,区块提议者似乎处于离线状态,并且 slot 将简单地变空。这可能是对特定验证者的一种审查形式,以阻止他们向区块链添加信息。攻击者的成本取决于验证者的带宽,这意味着对家庭质押者发起拒绝服务攻击,要比使用工业级硬件和互联网连接的专业人员要便宜得多,这使得业余爱好者更容易受到审查。这个问题有一些变通方法,但这些方案也有利于专业验证者,而不是家庭质押者。例如,运行多个节点并将区块构建与网络通信分开可以提供额外的保护层,因为节点身份和验证者身份是解耦的。节点运行者可能会在短时间内切换身份或重新获取身份,以避免拒绝服务攻击。从长远来看,实施单一秘密 leader 选举(SSLE)或非单一秘密 leader 选举方案可以更有效地缓解验证者审查问题,因为只有区块提议者才能知道他们已经被选中,并且事先不知道他们的选择。所有验证器都将对秘密的承诺提交到一个反复洗牌的池子当中。然后一个随机承诺会被公开选出,只有被选中的验证器才能知道,因为连接已经被混淆了。这项工作尚未实施,但它是一个活跃的研发领域。
验证者控制的质押权益比例大于或等于 33%
将质押 ETH 的控制权分散给更多人,要比集中在少数人的手中更安全。这是因为一个人控制的质押权益越多,其对以太坊共识的影响就越大。当攻击者掌握了足够的质押权益时,本文中提到的所有攻击都更有可能成功,并且可能选择更多的验证器在每个 slot 中提议区块。因此,恶意验证者的目标可能是控制尽可能多的质押 ETH。
33% 的质押 ETH 是攻击者的一个基准,如果其控制的 ETH 超过了这个数量,他们就有能力阻止信标链最终确定,而无需精细控制其他验证器的操作。它们可以简单地一起消失。这是因为要最终确定信标链,必须有 2/3 的质押 ETH 来证明检查点对(pairs of checkpoints)。如果 1/3 或更多的质押 ETH 被恶意证明或未能证明,那么 2/3 的绝对多数就不可能存在。对此的防御措施是信标链的消极惩罚(inactivity leak)机制,这是一种紧急安全措施,它会在信标链 4 个 epoch 时期未能最终确定后触发。消极惩罚(inactivity leak)标识了那些未能证明或证明与大多数人相反的验证器。这些非证明验证器拥有的质押 ETH 会逐渐流失,直到最终它们占总数的比例不到 1/3,这样区块链才能再次 finalize。
消极惩罚(inactivity leak)机制的目的是让信标链再次实现最终确定,而攻击者也会失去一部分质押的 ETH。假设没有可罚没的攻击,并且攻击验证器只是未能证明,它们的不活动分数被更新,这向网络的其余部分表明该验证器将在每个 epoch 时期受到惩罚,直到它们的不活动分数返回为零。当消极惩罚(inactivity leak)机制处于活动状态时,每个 epoch 的不活动验证器分数会增加 4,而活动验证器分数会减少 1。一旦消极惩罚(inactivity leak)机制停用(并且信标链再次最终确定),所有活动验证器的不活动分数都会降低。对于不活跃时间较长的验证器来说,这需要更长的时间,因为它们有更多的不活跃分数要消耗。而持续的不活动状态,会更慢消耗不活跃分数。对于一个离线 100 个 epoch 的验证器,它的不活动分数将达到 400 左右,而惩罚大小的计算公式为:
- 不活动分数 * 验证器余额 /(不活动分数偏差 x 不活动惩罚商)
- inactivity_score * validator_balance/(inactivity_score_bias x inactivity_penalty_quotient)
其中不活动分数偏差(inactivity score bias)是在每个 epoch 时期增加验证器分数的数字,不活动惩罚商(inactivity penalty quotient)是将非证明验证器的余额减少到其初始值大约 60% 所用时间的平方,设置的时间大约为 37.5 天。这意味着攻击者通过未能证明来阻止最终性的时间越长,他们质押权益被燃烧的越多。Upgrading Ethereum? 展示了一个图表,该图表估计了始终处于脱机状态的验证器在短时间(100 个 epoch,大约 13.5 小时)消极惩罚期间和之后验证器余额的减少情况。在 135 个 epoch 时期之后,验证器的余额从 32 ETH 降至 31.996 ETH,损失了 0.004 ETH。而要让一个攻击者控制 33% 的 ETH 质押权益,他们必须运行大约 144,000 个 验证器,每个验证器至少持有 32 ETH。这意味着他们延迟信标链最终确定性的攻击,将至少花费 0.004 x 144000 = 576 ETH。按当前市场价计算,这大约相当于 109 万美元。花掉近 100 万美元的成本,将信标链的最终确定性推迟半天,这对信标链本身的长期影响很小。(译者注:此处修改了原文的数字)
当然,更持久的消极惩罚要更加昂贵,事实上,惩罚的幅度会呈二次方的速度增加,直到信标链再次开始最终确定。攻击者进行最终性延迟攻击的确切成本,取决于他们的初始余额、他们保持离线的时间以及重新获得最终性所需的时间。然而,最重要的是,即使验证器没有被罚没, 33% 的验证器持续不活动也是极其昂贵的。
假设以太坊网络是异步的(即消息发送和接收之间存在延迟),控制 34% 总质押权益的攻击者可能会引发双重确定性(double finality)攻击。这是因为攻击者在被选为区块生产者时可以模棱两可,然后与其掌握的所有验证器进行双重投票。这创造了一种区块链分叉的情况,其中每个分叉都有 34% 质押的 ETH 投票支持。每个分叉只需要 50% 的剩余验证器投票支持两个分叉,从而得到绝对多数的支持,在这种情况下,两条链都可以最终确定(因为 34% 的攻击者验证器 + 剩余 66% 的一半 = 每个分叉 67%)。每个竞争区块都必须由大约 50% 的诚实验证器接收,因此只有当攻击者能够在一定程度上控制消息在网络上传播的时间时,这种攻击才可行,这样他们才能将一半诚实验证器推到每条链上。这也是为什么这种攻击需要网络异步的原因——如果所有节点都立即收到消息,它们将立即知道这两个区块,并通过拒绝较早接收的区块来处理模棱两可的问题。攻击者必须销毁其全部质押的权益(今天 1400 万质押 ETH 中的 34%)以实现这种双重确定性(double finality)攻击,因为他们 34% 的验证器将同时进行双重投票,而这是一种具有最大相关性惩罚的可罚没攻击。防御这种攻击的代价,只是销毁 34% 总质押 ETH 的巨大成本。
而从这种攻击中恢复过来,需要以太坊社区进行带外(out-of-band)协调并同意遵循其中一个分叉,而忽略另一个分叉。与这种社会支持相关的复杂性,我们将在后面讨论。
攻击者控制的质押权益比例大约为 50%
理论上,在一个恶意验证者控制的质押 ETH 比例达到 50% 的情况下,他可以将以太坊区块链分裂成两个大小相等的分叉。与前面描述的平衡攻击类似,攻击者可通过为同一个 slot 提出两个区块来仅使用他们的一个验证器。然后,攻击者不需要通过仔细传输消息来操纵一半的网络,而只需使用其全部 50% 的质押权益与诚实的验证器集进行相反的投票,从而维持两个分叉并防止最终确定性。在四个 epoch 时期之后,两个分叉上的消极惩罚(inactivity leak)机制将激活,因为每个分叉都会看到其一半的验证器无法证明。每个分叉都会泄露验证器集的另一半质押权益,最终导致两条链以代表 2/3 绝对多数的不同验证器完成。在这一点上,唯一的选择就是依靠社区恢复,稍后我们会提到。然而,考虑到诚实验证器数量、网络延迟等变化,一组敌对的验证者似乎不太可能始终精确地控制总质押权益的 50% 比例,但也许有一种方法,攻击者可以利用略高于 50% 的质押权益,动态调整其在每个 slot 中的投票比例,以保持两个分叉之间的完美平衡。虽然成功攻击的风险,无疑会随着攻击者掌握的质押 ETH 比例的大小增加而增加,但 与 50% 的质押权益相关的攻击向量,似乎不太可能被成功利用,发动此类攻击的巨大成本以及较低的成功率,对理性的攻击者而言似乎是一个很强的抑制因素。
而当攻击者控制的质押权益占到 51% 以上,则其可以控制分叉选择算法。在这种情况下,攻击者将能够以多数投票作证,让他们有足够的控制权来进行短期重组,而无需欺骗诚实的客户端。控制 51% 的质押权益不允许攻击者改变历史,但他们有能力通过将多数投票应用于对其有利的分叉,或将区块重组来影响未来。诚实的验证器会效仿,因为它们的分叉选择算法也会将攻击者喜欢的链视为最重链,因此该攻击链可以最终确定。这使攻击者能够审查某些交易,进行短程重组,并通过重新排序对其有利的区块来提取最大 MEV。与工作量证明(PoW)链一样,51% 攻击也是非常有问题的。针对该问题的防御手段就是多数质押权益的巨大成本(目前略低于 190 亿美元),攻击者会面临巨大的风险,因为社交层可能会介入,并采用诚实的少数派分叉,从而使攻击者的质押权益大幅贬值。
攻击者控制的质押权益比例大于或等于 66%
控制 66% 或更多比例质押 ETH 的攻击者可以确定其首选链,而无需强制任何诚实的验证器。攻击者可以简单地投票选择他们喜欢的分叉,然后最终确定它,仅仅是因为他们可以不诚实的绝对多数进行投票。作为绝对多数的质押者,攻击者将始终控制最终区块的内容,其拥有花费、回滚和再次花费的权力,他还能审查某些交易并随意重组区块链。通过购买额外的 ETH 以控制 66% 质押比例,而不是 51%,攻击者实际上购买了事后重组和最终性反转的能力(即改变过去并控制未来)。当前控制 66% ETH 质押权益的成本约为 250 亿美元,这里唯一的防御措施是退回到社交层来协调采用替代分叉。在下一节中,我们会更详细地探讨这一点。
第 0 层:最后一道防线
当区块链的编码防御被破坏,并且攻击者能够最终确定不诚实的区块链时会发生什么?
这种情况可能会以多种方式出现,最明显的是,当攻击者控制多数质押权益,并且可以简单地通过他们自己的投票或 51% 以上诚实验证器的额外证明来完成。凭借控制 34% 质押比例的 ETH,以及对网络上消息传递的一些控制权,攻击者可以最终确定两个分叉。在某些情况下,重组链可能由于消极惩罚(inactivity leak)机制而最终确定。如果攻击者成功将验证器集划分为两个分叉,则消极惩罚(inactivity leak)机制将在两个分叉上激活,那么问题就变成了,诚实或不诚实的验证者会首先重新获得最终确定性吗?如果诚实的验证者首先确定,那么诚实链就会变成规范链,网络上所有客户端的分叉选择算法都会接受该链最终确定的部分,然后以太坊又回到了诚实玩家的控制之下。但如果不诚实的验证者设法确定了区块链,那么以太坊社区将处于非常困难的境地。规范链在其历史中会包含不诚实的部分,而诚实的验证者最终会受到惩罚。
第三种不太可能发生的情况是永久性的网络分裂,其中一个分叉上的验证器不知何故不知道对方分叉上的对应方。这会创建出两个独立确定的分叉链,每个分叉都会泄露另一组验证器的质押权益。然后这两条链永远不会重新组合在一起,因为它们将有不同的最终检查点。来自主导客户端的漏洞(而不是攻击),也可能导致损坏但最终确定的链。在以太坊的执行层方面,go-ethereum (Geth) 客户端占到了主导地位,超过 85% 的节点运行了该客户端。而在共识层方面,Prysm 客户端目前占到了主导地位,在持续的社区活动之后,其占比才下降到 50% 左右。而主导执行客户端或共识客户端中的漏洞,可能会停止最终确定性或导致最终确定的数据不正确。在 Kiln 测试网上,Prysm 中的一个漏洞?影响了区块生产,这无关紧要,因为节点在四个不同的客户端中的份额大致相等,但如果是在主网,那么有超过 66% 的客户端会遇到相同的错误。因此,会有几条通往不诚实的最终确定链的路线,尽管它们的概率非常低。它们都需要在质押 ETH 上投入巨资,或者对验证器集进行非常复杂的操作,截至目前,只有在理想条件下才证明是可行的,并且这些攻击都通过软件更新得到了缓解。然而,我们不能排除万一的情况,那么,最终的解决方案就是依靠社交层(第 0 层)。
以太坊 PoS 共识机制的优势之一是,社区在面对攻击者时可以采用一系列防御策略。最小的响应可能是强制将攻击者的验证器从网络中退出,而不会受到任何额外的惩罚。而攻击者要重新进入网络,必须加入一个激活队列,以确保验证器集逐渐增长。例如,添加足够的验证器以使质押的 ETH 数量翻倍大约需要 200 天,在攻击者可尝试另一次 51% 攻击之前,有效地为诚实验证器带来了 200 天的应对时间。当然,社区也可以决定更严厉地惩罚攻击者,比如取消过去的奖励,或燃烧掉攻击者的部分(最高 100% 的)质押资本。
无论对攻击者施加何种惩罚,社区还必须共同决定不诚实的区块链(尽管是编码到以太坊客户端中的分叉选择算法所青睐的区块链)是否实际上无效,并且社区应该建立在诚实的替代链上。诚实的验证器可以集体同意构建在社区认可的以太坊分叉之上,例如,在攻击开始之前可能已经分叉了规范链,或者强行移除了攻击者的验证器。诚实的验证器将被激励在该分叉链上构建,而建立在以太坊上的交易所和应用可能更喜欢在诚实链上,并会跟随诚实的验证器进入诚实的区块链。然而,这将是一个极其混乱的治理挑战。一些用户和验证者无疑会因为切换回诚实链而输掉资金,攻击后验证的区块交易可能会被回滚,从而扰乱应用层,这完全冲击了倾向于相信「代码就是法律」的用户。此外,一些用户,甚至可能是机构用户,他们会通过精明或机缘巧合的方式从不诚实的区块链中获益,并可能反对分叉以保护他们的收益。有人呼吁社区对超过 51% 的质押攻击进行应对演练,以便能够快速执行合理的协调缓解措施。Vitalik 在 ethresear.ch 以及 Twitter 上都进行了一些有益的讨论。
治理已经是一个复杂的话题,而对于以太坊社区来说,对不诚实的最终链进行第 0 层紧急响应无疑会是一个挑战,但在以太坊的历史上,这已经发生了两次。最终,即使我们拥有如此惊人的技术堆栈,如果最坏的情况发生,社区的参与者也必须协调出一条出路。
总结
本文探讨了以太坊合并到权益证明(PoS)共识机制后,攻击者可能会采用的一些攻击信标链的方式。总体而言,攻击者控制的质押 ETH 比例越多,其攻击的成功机会就越大,因为他们的质押权益可以转化为投票权,以此用来影响未来区块的内容。而随着攻击者控制的质押 ETH 比例增大,其能够实现的破坏力就越大:
- 33%:延迟最终性
- 34%:导致双重最终性
- 51%:审查,控制区块链的未来
- 66%:审查,控制区块链的过去与未来
还有一些更复杂的攻击方式,它们只需要控制少量的质押 ETH,但这些攻击要求攻击者对消息时间的精细控制,以使诚实的验证器集对他们有利。
总的来说,尽管存在这些潜在的攻击向量,但信标链的风险很低,甚至要低于工作量证明的等效链。这是因为攻击者为了用投票权压倒诚实的验证器,需要将质押 ETH 的巨大成本置于风险之中。内置的「胡萝卜加大棒」激励层可以防止大多数的恶意行为,尤其是对于低质押的攻击者。更微妙的弹跳攻击和平衡攻击也不太可能成功,因为真实的网络条件使得很难实现对特定验证器子集的消息传递进行精细控制,并且客户端团队已经用简单的补丁快速关闭了已知的弹跳攻击、平衡攻击以及雪崩攻击向量。
而 34%、51% 或 66% 攻击可能需要社区协调才能解决。虽然这对社区来说可能是痛苦的,但社区在带外响应的能力对攻击者来说是一个强大的抑制因素。以太坊社交层是最终的后盾,一次技术上成功的攻击仍可能被同意采用诚实分叉的社区所扼杀。最终,攻击者和以太坊社区之间会有一场竞赛,如果进行得足够快,用于 66% 攻击花费的 250 亿美元可能会被一次成功的社交协调攻击所抹杀。
对于攻击者来说,有利可图的可能性会很低,这足以起到有效的威慑作用。这就是为什么维持一个价值观一致的凝聚力社会层,对于加密投资而言是如此重要的原因。
译者注:截至目前,以太坊全网质押的以太币数量大约为 1400 万 ETH,而通过 Lido 质押的以太币数量已经达到了 428 万 ETH,这大约占到了 30.5 % 的 ETH 质押比例,而这对于以太坊网络而言无疑是最大的安全隐患,因此以太坊开发者们也建议质押者将 ETH 分散到不同的协议当中,而面对 Tornado Cash 级别的审查,类似以太坊这样的 PoS 链可能都是相对脆弱的,正如 vitalik 所言,社交层将作为最后的恢复手段。
(声明:请读者严格遵守所在地法律法规,本文不代表任何投资建议)