时间扭曲,算力利用,拒绝服务等等!
加密货币爱好者热衷于告诉普通用户,支撑他们最看好的某个币的区块链协议是多么的安全可靠。的确,像比特币、以太坊等主流加密货币保持了良好的安全性,甚至其安全性比历史上任何其他资产/支付系统都更好,而且考虑到这些都是没有任何一方控制背书的数字货币,这是很不寻常的。目前已经有数十亿美金的资金在其上流通。
然而,许多人会更进一步地讲,加密货币是“无法攻击的”。这至少是一个策略性的错误,因为深信并极力推崇“无法攻击”的特性,这就使得在特定事件发生时(比如说,一次黑客攻击),加密货币爱好者会处于有些尴尬的境地。.
在这样的事件中,似乎没有别的合理的解释。
上个月,一名尚未确认身份的攻击者严重破坏了 Verge (一种相对较小,专注于隐私保护的加密货币) 的运行。在 4 月 4 日至 6 日这段时间里,神秘黑客成功地控制了 Verge 网络三次,每次持续几个小时,(在其控制期间)阻止了任何其他用户进行支付。更糟糕的是,在此期间他们能够以 1560 枚每秒(大约 $80)的速度伪造 Verge 币,共伪造价值超百万美元的 Verge 币。
毫不避讳地讲这就是一场灾难。整件事都糟糕透了。
但谁应该为此负责呢?是 Verge 开发者的人为失误,还是密码学基础被攻克,亦或者介于两者之间?这种事还会发生么?可能在更大规模的数字货币平台上?如果真的可能发生,我们能做什么来阻止这类攻击呢?
对于这些漏洞,许多细节我们无法完全搞清楚。然而,在这种情况下,我们还是可以清晰地了解基础攻击。例如:
这种攻击的根源乍一看是一个 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 使用的多种挖矿算法有关。
使用工作量证明的加密货币区块的计算通常使用单一算法,最常见的是 SHA-256 算法。然而,Verge 允许矿工任意使用五种不同算法(你要真想了解,我不妨直说,Verge 使用的五种算法是 Scrypt,X17,Lyra2rev2,myrgroestl 以及 blake2s。)使用多种挖矿算法的基本理由如下:
一些对比特币持批评态度的人认为,随着时间推移,比特币矿场变得过于专业化和中心化,例如,比特币大部分区块都是由 Bitcoin ASIC 矿机(这种矿机专门设计用于挖比特币)产生,并且许多比特币是由少数矿池挖出来的,矿池是由许多矿工组成,这些矿工将计算资源整合到一起,并按比例获得收益。这些批评者认为,不同类型的“中心化”趋势,已经与无需许可的加密货币的基本主张背道而驰。使用多种挖矿算法产生加密货币能够避免这种趋势。该观点认为,在硬件、工业和资源管理方面控制五种不同的算法,肯定比只控制一种算法更难,从而促进 Verge 挖矿经济朝着更分布式、去中心化的方向发展。
所以,他们决定:唯一保证系统正常运行的方法是,每个算法都有 自己 的挖矿难度参数,并且独立于其余四个算法进行调整,这意味着,Scrypt 的挖矿难度将调整到每30秒产生一个区块,X17 及其他三种算法亦然。从而整个 Verge 网络才能保证每 30 秒产生一个区块、保持全部五种算法的收益对于矿工来说都是均衡的,并确保没有一种算法占优势地位(否则使用五种算法就毫无意义了)。
这意味着伪造的时间戳并没有降低整个网络挖矿难度,他仅仅只是降低了五个算法中的 Scrypt 一个算法的挖矿难度。因此,当 Scrypt 矿工的挖矿难度很低时,其他四种算法的矿工依旧得像之前一样努力工作,那么它们的哈希算力对于维护网络安全就没用了。更重要的是,攻击者仅需要使用 Scrypt 算法挖矿,并且仅需要与也使用 Srypt 挖矿的人竞争。因此,攻击者控制网络所需的哈希算力从当初的超过50%(在整个网络中占多数),下降到仅需超过10%(在 Scrypt 矿工中占多数)。
现在,事情看起来确实有点投机,但实际情况比现在看起来的更糟糕。鉴于挖矿难度调整的性质,我们可以大致估计每种挖矿算法的经济资源分配(算力分配)是相同的,得出的“10%”仅仅是一个估计值。然而,现实往往是拒绝遵循自由市场经济规则的。根据社区里的讨论,由于多方面原因的存在——有的 Scrpyt ASIC 矿机尚未部署,可通过 Nicehash 租闲置资源等,意味着在攻击的时候,控制 Scrypt 会远比其余四种算法的成本更低。我们可以放心的假设,攻击所需算力一定是远远小于10%的,Reddit 论坛上有人粗略地估计,这个数字甚至低至0.4%。
综上所述,时间戳造假可以极大的降低挖矿难度,Verge 使用了五种共识算法,意味着可以针对某一个算法降低其挖矿难度,这也就使得控制整个网络变得更加容易。这一特殊挖矿算法(Scrypt)的经济/工业状况造成其更容易控制。极地的挖矿难度最终造成区块间隔大幅度减少,并使得此次攻击所获得的利润是正常挖矿情况下的 30 倍以上。
从此次攻击中可以得到什么样的经验教训呢?可以预见,此次黑客攻击的短期内会给网络带来很大混乱。大约几天之后,核心开发者开发出一些 Bug 快速修复程序,当然这些程序内部仍有可能存在 Bug,Verge 网络最终也是经历了一次硬分叉,这次分叉也许并不是意外。在黑客攻击一周内,世界范围内的 Verge 币价涨了 30%,并在接下来的一周,该公司宣布 Verge 将支持 pronbub.com 的订阅支付服务。近期最大的协议级加密货币攻击,怎么会使得该加密货币价格反而上涨,且之后又宣布与互联网上访问量最大的……建立合作伙伴关系呢?这个问题我不知道如何解释,我个人的初步见解是,这个世界也许是毫无道理可言的,人们也完全失去了理智。
言归正传。从更广的角度来看,确实有一些我们应该汲取的经验:
首先,使用时间戳来人为降低难度的方法很早之前就已为人所知,我们给它起个名字——“时间扭曲”漏洞。具体信息可以查看几年前比特币论坛中关于攻击者向量的讨论。在某种意义上,攻击之所以能够在 Verge 网络中生效是由于其使用了更新的、更华丽的暗重力井(Dark Gravity Well,以下简称DGW)难度调整算法。与比特币协议里每 2016 个区块调整一次难度不同,在这种算法中每产生一个区块都会调整挖矿难度。在这种间隔调整挖矿难度,乍一看这些离散增量像是一种奇怪的决策,但在此次黑客攻击后可以明显看出这是一种安全防护。在比特币中,如果想采取某些措施略微降低挖矿难度,攻击者每两周仅能尝试一次且效果可忽略不计,但在 Verge 中攻击者每30 秒就可以发起一次攻击。
有趣的是,据说 DGW 算法的好处之一是它能够免疫时间扭曲漏洞。鉴于这种说法已经被证明是无效的,其他使用该算法的货币至少应该有些警惕了。
由于使用了五种挖矿算法:从长远角度看,有助于从经济上鼓励去中心化,但也带来了新的复杂性,不可避免地增加了出现不可预见的漏洞的可能性。
这两种情况,黑客攻击行为都有力的证明了:当涉及用户金融资产时,应更倾向于事实证明更行之有效的东西,并防止事情变得过于复杂,从而带来不必要的风险。我想这对比特币团队来说意味着两点。
有一个更大的问题是:软件开发者,尽管我们不愿意承认,在最终分析中只有人类。即使底层安全协议看起来非常完美,但也总有出错的可能。出现意想不到的攻击向量,trade-off 的预估结果很差等等,当然,总有一些老式 Bug。软件也不一直是按照我们的预期运行,这类故障会导致资金损失,这在 2018 年应该不会让人感到特别震惊。但事实上,当资金在软件上流动时,就应该增加预防措施。
考虑到我们中大多数没有时间对我们投资的每个项目进行彻底的代码审计,预防灾难的最好的方法是更加信任已证明安全的控件,并且开发理念转向保守一些。与此同时,如果你想投资开发迅速、突破性强且资金回报快的项目,你也应该清楚其中存在的风险。最重要的是,来自社区的压力激发地努力减弱未来灾难的努力是系统安全最好的保障。我相信 Gerorge Santayana 所说的:“那些没有从过去的漏洞中吸取教训的人最终还会遇到这些漏洞”,这句话我们要谨记,以免当我们意识过来地时候已经再次处于时间扭曲的边缘。
更正:难度重新调整的窗口最初等于允许时间漂移(2小时)。实际上,根据跟踪数据显示,重置窗口为 30 分钟,低于当初系统理论设计值。
更新(5/22):似乎我们又遭遇了时间扭曲的攻击,这次黑客针对两个而不是一个挖矿算法进行攻击。说时迟那时快,相同的漏洞又出现了。详情请继续关注!
链接: https://blog.theabacus.io/the-verge-hack-explained-7942f63a3017