Bitcoin Core开发者向BCH开发团队披露重大漏洞始末

2018年8月15日 17:40
來源:奇点财经

引言:众所周知,BTC和BCH的开发团队的理念并不相同,但比特币核心开发团队Cory Fields并没有计较这些,他在查阅BCH软件更新时发现了一个重大漏洞,并想尽方法通过最安全最谨慎的方式将其报告给了BCH的开发团队,避免了重大损失,堪称道德的楷模。Cory Fields指出,对于加密货币而言,最重要的威胁就是软件的安全问题。本文详细的讲述了他发现漏洞,反馈漏洞的过程,值得全体加密货币的从业者反思与借鉴。

本文转自Bitcoin Core开发者Cory Fields发表在Medium上的文章,由奇点财经翻译。

在2018年4月25日,我以非公开的形式匿名披露了比特币现金(BCH)的一个严重漏洞。如果这一漏洞被人成功利用,可能会对比特币现金造成巨大破坏,用户将无法安全的交易比特币现金,目前该漏洞已经在没有发生意外的情况下得到修复,并于2018年5月7日公开披露。

小贴士:比特币现金是一种与比特币完全不同的加密货币,与比特币的唯一相似的是名称。本次漏洞仅影响比特币现金。

关于我本人:我在麻省理工学院媒体实验室为数字货币计划工作,顾名思义,这个社区负责研究和开发加密货币。具体来说,我帮助开发和维护Bitcoin Core,这一开发组负责维护比特币的程序。因为我的工作关系,我经常在会议上被问到什么是比特币未来的最大挑战。我的回答只有一个:避免灾难性的软件漏洞。

本次发现这一漏洞更坚定了我的信念,即在加密货币世界中,软件漏洞的威胁被严重低估。我现在提供一份关于这次事件的报告,并不是针对比特币现金,而是作为一个真实的例子,告诉大家做好加密货币需要足够的努力,并作为一个警钟,让那些没有为此做好充分准备的公司早作准备。

SIGHASH_BUG

简而言之,一部分交易签名验证代码被重写,但新代码省略了对签名类型中特定位(bit)的关键检性查。我在本文中将这个位称为SIGHASH_BUG。这个省略将允许一个特制的交易将比特币现金区块链分叉成两条不兼容的链。

链分叉漏洞指什么?

大多数加密货币,包括比特币和比特币现金,通过向所有参与者分发包含所有交易信息的账本而运作。为了花费一些硬币,消费者必须首先创建一个遵守系统所有规则的交易。这些规则中的大多数都是显而易见的,例如“你不能花费比你拥有还多的钱”,但其他规则则更加微妙和富有技术性,特别是那些描述数字签名应符合什么格式的规则。但是,如果加密货币是去中心的,谁设置了这些所谓的验证规则?

大家共同设定验证规则!

系统的规则是大家一起决定的,软件负责执行。如果一个参与者试图欺骗并创建一个能花费他没有的钱的交易,那么其他参与者的软件将简单地拒绝该交易。

负责执行验证规则的软件将始终需要发展。需要不断进行更改以提高性能,添加功能,提高安全性等。但是,必须保证验证规则是不变的。

那么,当新版软件中的意外编程错误导致交易被认为有效,而所有之前版本的软件都将其视为无效时,会发生什么?结果是“分叉”,这意味着只有升级了软件的交易者才会接受相关交易。并且由于交易和区块被连接在一起,因此两个阵营在随后的每个交易上都不一致。如果没有开发人员的快速处理,及时更新两者的交易,两个阵营将再也无法达成一致。此时,加密货币会被撕裂成两种互不兼容的货币。

在权衡这些漏洞的潜在影响时,时机起着至关重要的作用。如果有99%的人没有更新软件,那这一分叉会被放弃,不过如果50%的人都更新了软件。事情就会变得复杂。

我在比特币现金最近更新的软件中发现了这一错误,已经有近一半用户更新了这一软件。

发现经过

因为Bitcoin Core是免费的开源软件,所以新生加密货币经常借鉴其作为基础。比特币现金的主要软件Bitcoin ABC(比特币现金的软件开发应用),就是基于Bitcoin Core开发的。

由于大量的通用代码,衍生项目通常具有类似的错误。但是,期望一种加密货币的开发者积极主动地与其他开发者分享是不现实的,因此,我已经养成了一个习惯,每隔几个月去检查一下其他加密货币软件的更新,以寻找可能的与Bitcoin Core相关的错误修正。

在今年早些时候查看Bitcoin ABC(比特币现金的软件开发应用)的变更日志时,我注意到交易验证中一个关键部分已经被重构。这些变更立即吸引了我的注意力,因为这些变更似乎是没有必要的。出于对这些变更的好奇,我看了一下公众对这些变更的评论。 除了“封装”之外,没有任何理由能解释。这个变更只有两个审核人,审核持续一周后代码即被接受。

大型重构是非常常见的,通常是特定软件开发中的良好实践。但是,修改加密货币的验证代码是极具风险的,极有可能会在无意中引入了一个链分叉错误。

在看到评论很少而变更很大后,我认为一个漏洞很有可能已经产生,所以我就去查看了一下。 找到SIGHASH_BUG花了不到10分钟。

匿名披露

我在上面提到我的披露是匿名的。我想解释一下这个原因。

在确认该漏洞可被人利用后,我开始通知Bitcoin ABC(比特币现金的软件开发应用)的开发人员,但很快意识到我遇到了一个大问题。这是公开可用的开源软件中的一个bug,可能已经有人发现了这个bug。在完全部署修复程序之前,没有什么可以阻止其他人发现并利用这个bug。

那么在最糟糕的情况下,会怎么样呢?假设我以我的名义以非公开的形式披露了这个bug,而其他人也找到了这个漏洞并在第二天匿名利用了这个漏洞。因为我使用我的名字进行披露,所以会有足够的证据证明我有攻击比特币现金网络的知识和手段。我无法证明我不是攻击者。然而,如果漏洞被利用,可能会造成数十亿美元的损失。所以匿名是非常重要的,我认为这对我的安全是必要的。

在试图弄清楚是否可以完全匿名披露时,我开始怀疑它是否值得我花费这么多精力。毕竟,我没有义务报告任何事情。但是,如果有人在比特币核心中发现了一个同样严重的bug,我会很希望这个人以尽可能谨慎和安全的方式引起我们的注意。所以我决定这样做:假设这个bug是比特币核心的bug,创建我想要阅读的报告,按照我想要的标准来写这个报告。

第一步显而易见,我需要找到Bitcoin ABC(比特币现金的软件开发应用)的披露方针。 如今,处理这类问题的政策很常见,并且是任何项目的必备条件。 遗憾的是,我在其网站或代码库中找不到此类政策。 在向github问题跟踪器提交错误时,它显示了我能找到的最接近的内容:

呃,这没有帮助。 然后我开始尝试寻找已知的Bitcoin ABC(比特币现金的软件开发应用)开发人员发布的加密密钥。 将消息加密将确保没有其他人可以查看到。 虽然我无法真正验证密钥持有者的身份,但这种方法仍然相当安全,并且比没有加密要好得多。

但是,我再次碰壁了。 公共PGP密钥服务器上没有任何开发人员发布的秘钥,并且他们的代码存储库中也没有密钥。 此时,除了通过在线渠道匿名请求密钥之外别无选择,我使用Tor尽可能地屏蔽我的身份。

我在4月25日首次创建了一个一次性的Github帐户,并通过那里呼叫了一些Bitcoin ABC(比特币现金的软件开发应用)开发者:

谢天谢地,这起了作用! 我在大约5个小时后收到了一个密钥,很快用它来加密详细的问题披露。 然而,当我第二天回来检查答复时,Github已经标记了我的一次性帐户,可能是因为我使用了Tor。 因此,无法通过那里进行联系。

通过手里的加密密钥,我决定尝试最后一条大道,向Bitcoin ABC(比特币现金的软件开发应用)的bug追踪器提交加密消息,再次使用Tor和一次性账户。 六个小时后,还是没有收到回复,我在他们的bug追踪器上做了最后一次请求:

4月27日,在等了48小时之后,一次更新修复了这个bug,很显然,他们收到了我的消息。

一点思考

我发现的比特币现金漏洞已成功披露,且目前已经得到修补,最终没有对比特币现金造成明显影响。但是,如果整个加密货币生态系统没有从对这种bug的分析中受益,那将是一种遗憾。作为加密货币开发者,有必要先后退一步,重新评估我们可以使用的工具,以及我们实施的政策和程序。我们可能无法消除这些bug的威胁,但我们可以从中学习并做好准备,以便将来好好的应对。

原文链接:https://medium.com/mit-media-lab-digital-currency-initiative/http-coryfields-com-cash-48a99b85aad4