大格局!大心胸!Bitcoin Core开发人员向BCH开发团队披露重大漏洞始末
在2018年4月25日,我以非公开的形式匿名披露了比特币现金(BCH)的一个严重漏洞。如果这一漏洞被人成功利用,可能会对比特币现金造成巨大破坏: 用户将无法安全地交易比特币现金,从而完全破坏BCH本身的效用(以及价值) 。该漏洞已经在没有发生意外的情况下得到修复,并于2018年5月7日公开披露。
简短的说明:比特币现金是一种与比特币不同且不兼容的加密货币。它被命名为比特币现金是因为它源自比特币,它与比特币的唯一关系是相似的名称。本文所提到的那个现在已修复的漏洞仅影响比特币现金。
至于我和我的动机。我在麻省理工学院媒体实验室为数字货币计划工作,顾名思义,这个社区负责研究和开发加密货币。具体来说,我帮助开发和维护比特币核心,即比特币的主要软件实施。因为我的工作关系,我经常在会议和研讨会上被问到什么是比特币未来的最大挑战。我的回答只有一个: 避免灾难性的软件bug。
发现这个有可能造成灾难的bug重申了我的信念,即在加密货币世界中, 软件bug的威胁被严重低估 。我现在提供一份关于这次事件的报告,并不是说针对比特币现金,而是作为一个真实世界的例子,表明仍需要多少工作来达到加密货币所需的复杂工程水平,并作为一个警钟,让那些没有为这种情况做好充分准备的公司早作准备。
SIGHASH_BUG
简而言之,一部分交易签名验证代码被重写,但新代码省略了对签名类型中特定位(bit)的关键检性查。我在本文中将这个位称为SIGHASH_BUG。这个省略将 允许一个特制的交易将比特币现金区块链分叉成两条不兼容的链 。
发现漏洞
在今年早些时候查看比特币ABC的变更日志时,我注意到交易验证中一个关键部分已经被重构。这些变更立即吸引了我的注意力,因为这些变更似乎是没有必要的。出于对这些变更的好奇,我看了一下公众对这些变更的评论。 除了“封装”之外,没有任何理由能解释。这个变更只有两个审核人,审核持续一周后代码即被接受。
大型重构是非常常见的,通常是特定软件开发中的良好实践。但是, 修改加密货币的验证代码是极具风险的,极有可能会在无意中引入了一个链分叉错误。
在看到评论很少而变更很大后,我认为一个漏洞很有可能已经产生,所以我就去查看了一下。 找到SIGHASH_BUG花了不到10分钟 。
匿名披露
我在上面提到我的披露是匿名的。我想解释一下这个原因。
在确认该漏洞可被人利用后,我开始通知比特币ABC(比特币现金协议的全节点实施)开发人员——但很快意识到我遇到了一个大问题。这是公开可用的开源软件中的一个bug,可能已经有人发现了这个bug。在完全部署修复程序之前,没有什么可以阻止其他人发现并利用这个bug。
那么在最糟糕的情况下,会怎么样呢?假设我以我的名义以非公开的形式披露了这个bug,而其他人也找到了这个漏洞并在第二天匿名利用了这个漏洞。因为我使用我的名字进行披露,所以会有足够的证据证明我有攻击比特币现金网络的知识和手段。我无法证明我不是攻击者。然而,如果漏洞被利用,可能会造成数十亿美元的损失。 所以匿名是非常重要的,我认为这对我的安全是必要的 。
在试图弄清楚是否可以完全匿名披露时,我开始怀疑它是否值得我花费这么多精力。毕竟,我没有义务报告任何事情。但是,如果有人在比特币核心中发现了一个同样严重的bug,我会很希望这个人以尽可能谨慎和安全的方式引起我们的注意。所以我决定这样做:假设这个bug是比特币核心的bug,创建我想要阅读的报告,按照我想要的标准来写这个报告。
我的思考
我发现的比特币现金漏洞已成功披露,且目前已经得到修补,最终没有对比特币现金造成明显影响。但是,如果整个加密货币生态系统没有从对这种bug的分析中受益,那将是一种遗憾。 作为加密货币开发者,有必要先后退一步,重新评估我们可以使用的工具,以及我们实施的政策和程序。 我们可能无法消除这些bug的威胁,但我们可以从中学习并做好准备,以便将来处理它们。