干货 | Verge 攻击解析,Part-1

Ajian   |     |   2607 次阅读

时间扭曲,算力利用,拒绝服务等等!

加密货币爱好者热衷于告诉普通用户,支撑他们最看好的某个币的区块链协议是多么的安全可靠。的确,像比特币、以太坊等主流加密货币保持了良好的安全性,甚至其安全性比历史上任何其他资产/支付系统都更好,而且考虑到这些都是没有任何一方控制背书的数字货币,这是很不寻常的。目前已经有数十亿美金的资金在其上流通。

然而,许多人会更进一步地讲,加密货币是“无法攻击的”。这至少是一个策略性的错误,因为深信并极力推崇“无法攻击”的特性,这就使得在特定事件发生时(比如说,一次黑客攻击),加密货币爱好者会处于有些尴尬的境地。.

在这样的事件中,似乎没有别的合理的解释。

上个月,一名尚未确认身份的攻击者严重破坏了 Verge (一种相对较小,专注于隐私保护的加密货币) 的运行。在 4 月 4 日至 6 日这段时间里,神秘黑客成功地控制了 Verge 网络三次,每次持续几个小时,(在其控制期间)阻止了任何其他用户进行支付。更糟糕的是,在此期间他们能够以 1560 枚每秒(大约 $80)的速度伪造 Verge 币,共伪造价值超百万美元的 Verge 币。

毫不避讳地讲这就是一场灾难。整件事都糟糕透了。

但谁应该为此负责呢?是 Verge 开发者的人为失误,还是密码学基础被攻克,亦或者介于两者之间?这种事还会发生么?可能在更大规模的数字货币平台上?如果真的可能发生,我们能做什么来阻止这类攻击呢?

对于这些漏洞,许多细节我们无法完全搞清楚。然而,在这种情况下,我们还是可以清晰地了解基础攻击。例如:

时间戳欺骗(或:诚实的错误 vs. 危险的谎言)

这种攻击的根源乍一看是一个 Bug,但实际上是一个刻意的特征:能够创建“不准确”的时间戳。在区块链协议中,单笔交易(通常是一方向另一方支付的操作)被分组打包到一个区块中,作为整体进行确认。每一个区块都有一个其创建日期的时间戳。即使区块链协议正常运行,在某些情况下这些时间戳也可能是乱序的,即,第 100 个区块的时间戳可能 晚于 第 101 个区块。这是因为,在绝对拒绝给予第三方任何特殊权限的去中心化网络中,准确地进行时间同步并不是一件简单的事情。考虑到数据在 P2P 网络中传播时间存在不可预测的差异,即便所有节点都是诚实的,区块的时间戳也绝对有可能出现“乱序”的情况。换句话说,允许一定程度的灵活性才是公平的;在 Verge 的事件发生前(在黑客攻击之前),该协议允许接收的区块时间戳“窗口”(译注:即 nMacBlockDrift 变量)大小至多为 2 个小时。(译注:在攻击事件发生后,Verge 开发人员将窗口缩小到 15 分钟)

黑客攻击的切入点是篡改时间戳,提交时间戳是过去时间的区块,但仍在两个小时“窗口”范围内,从而该区块会被其他节点接收。

至于为什么这一点对网络安全极度重要,则要谈到工作量证明(PoW)挖矿本身。

挖矿难度(或:只有难度提升,安全的大门才有效)

保持 Verge 网络去中心化需要确保小规模设备(例如:macbook)能够运行网络软件加入到网络中。但这反过来就限制了网络中支付操作吞吐量,即,设置一个明确的目标区块产生间隔(反过来就会限制每秒钟网络中交易数量)。Verge 对此规定,每隔 30 秒产生一个区块。现在有人可能会问,既然网络是去中心化的,又要如何执行呢?怎么阻止节点快速提交区块呢?这并不是一个小问题,既然一个已确认的区块会给它的提交者一份区块奖励,那么提交者的动机就是尽可能快地确认区块。

简而言之,答案就是工作量证明(PoW)挖矿。想要一个区块能够被网络认定为合法的,该区块就必需包含一个直接从区块本身的数据求出的一道密码学难题的解。这里,问题的本质是该难题的难度是可以动态调整的。Verge 的目标区块产生时间是每 30 秒产生一个区块,而挖矿难度是根据区块确认速率动态调整的。如果更多的人决定投入更多的算力产生 Verge 区块,那么挖矿速率会变快,Verge 区块链协议将增加挖矿难度,从而限制区块提交速率。相反,随着挖矿算力下降以及区块产生间隔增加,挖矿会变得更加容易。因此,当网络正常运行时,即使混乱的真实世界的因素改变——经济波动、加密货币的市场价格、能源市场、(商业)帝国兴衰等等,Verge 网络都能够实时处理,并且引导网络达到目标区块产生速率的均衡。

Verge 用来计算密码学难题的共识算法是 Dark Gravity Wave,它对 30 分钟内滑动窗口的区块确认速率取加权平均值。它有一些复杂,但本文中其细节并不重要——重要的是:挖矿难度是最近区块产生速率的函数,而基于区块产生频率进行挖矿难度计算自然需要查看区块时间戳。

这就是问题所在:如果有人创建出足够多的错误时间戳,一切都变得不一样了。然而,那个黑客就是这么做的——测试区块链数据显示,在黑客几次攻击的时间里,每隔一个区块的提交时间戳大约比区块加入区块链的时间早一个小时,这就使得协议的挖矿调整算法输出结果惨不忍睹了。如果协议能够流利地讲英语的话,它将会说:“Oh no!Not enough blocks have been submitted recently!Mining must be too difficult——let's make it easier!”(哦,不!最近提交的区块数量不够!挖矿算法一定是太难了——让我们调整的简单一些吧!)由于时间戳持续被篡改,协议持续降低挖矿难度,直到挖矿变得非常容易。总的来说,攻击前几个小时的平均难度是 1393093.39131,在攻击期间它的难度降低到 0.00024414,难度降低了超过 99.999999%。更低的挖款难度意味着能够提交更多的区块——在这种情况下,大约每秒产生一个区块。

这次攻击的聪明之处在于它绕过了挖矿困难问题的障碍,而非试图突破它。如果由挖矿算力提供的安全性是围绕在网络周围的大门——这些大门很难突破与跨越,那么可以说这个黑客通过找到一种方式降低了大门高度,使其接近地面,以至于可以直接跨过门槛。

如果你觉得问题还不明显的话,这本身就是一个坏消息。这种公然违反预定协议的行为本身就不被看好。此外,大幅度增加区块提交速率意味着将挖出比协议预设更多的新 Verge 币,如果你是那种以可预测存量流量比来衡量货币可靠性的经济学家,你一定会非常困扰(编者注:货币的存量流量比即是通胀率的倒数)。

然而,持续降低挖矿难度只讲了故事的一半,单独来看,他其实并不能给攻击者带来任何好处。随着挖矿难度迅速下降,对于攻击者来说挖矿确实变得更容易了,但对于其他任何人来说也都变容易了,矿工依旧像之前一样与其他人竞争。我们期望看到的是,区块产生速度的确变快了,但成功挖矿的矿工集合依旧像之前一样是分布式且平等的。也就是说,无论挖矿难度是多少,单一攻击者仍旧需要持有超过 51% 的算力来控制整个网络,这与攻击(编注:即降低挖矿难度)之前同样困难。

然而,这名黑客确实接管了整个网络,并且使用远低于51%的算力就做到了。究竟是什么原因使他们能够做到控制整个网络是这个漏洞的第二部分,这与 Verge 使用的多种挖矿算法有关。


原文链接: https://blog.theabacus.io/the-verge-hack-explained-7942f63a3017
作者: Daniel Goldman
翻译&校对: stormpang & Elisa

本文由作者授权 EthFans 翻译及再出版。


你可能还会喜欢:

观点 | 剖析工作量证明
干货 | 以太坊设计原理
干货 | 以太坊智能合约安全

 
0 人喜欢