我被盗了 600 BSV

请立即停止使用 ElectrumSV 1.3.7 及之前版本中实现的 multisig accumulator 多签方案。该方案的锁定脚本有严重 bug,我被盗了 600 BSV。

背景

CoinGeek 2019 首尔大会时,介绍过 multisig accumulator 多签方案。

ElectrumSV 在 1.3.0b4 版本中实现了该功能,源码如下。

大致经过

事情发生在 11 月 6 号。

  1. 凌晨 2 点多,我输出了 6 个 multisig accumulator UTXO,每个 100 BSV。
  2. 当天晚上 10 点半,我不太放心,又重新整理了一遍这 600 BSV,输出了 6 个新的 multisig accumulator UTXO,每个 100 BSV。

从我第一次使用该方案大额存币,到第二次整理,之间间隔 20 小时,黑客都没有动作。

在我完成第二次操作一小时后,黑客利用漏洞将我的币全部转到了地址 1LcKTzSzpMAwH4bzymGSkbhY2EBpmT7n5J,对应的交易

20adad8bd4cc694cfed4ccadff911433601e55b0f8779e839bc6579cb8d234f9

第二天,7 号晚上,我发现被盗。

问题分析

输出到 accumulator 脚本的 UTXO,被下面这样的锁定脚本锁定。

按照设计,花费这个 UTXO 的解锁脚本中提供的签名个数,要不小于多签的阈值。

下面这笔交易,盗走了我 600 BSV,使用的解锁脚本是“0 0”。

问题出在最后比较 [需要的签名个数] 和 [解锁脚本中的签名个数] 时,使用了错误的操作码 OP_GREATERTHANOREQUAL。

这个操作码实际在验证 [需要的签名个数] 是否大于等于 [解锁脚本中的签名个数]。很明显,这是一个逻辑错误,应该判断是否小于等于。

详细的脚本执行过程,可以参考 Note.SV 作者李龍的分析文档

最后的话

事情发生后,我第一时间联系了 ElectrumSV 的作者 Roger Taylor,他随后确认了这个严重的 bug。

同时,我通知了中文社区,也发了 Twitter,以避免更多的人遇到麻烦。

需要澄清的是,丢币不是因为私钥泄露,也不是使用了有问题的 ElectrumSV 客户端,更不是因为 Bitcoin SV 网络有什么漏洞。

P2PKH 脚本没有问题,传统多签方案 multisig bare 也没有问题,Electrum SV 钱包在其他方面的安全性不受影响。

多签方案 multisig accumulator 的 bug 出自理论原型,Roger 在实现时直接参考了演示代码,也没有做足够多的测试。而我对这样的新技术没有抵抗力,直接使用该方案大量存币,最终酿成悲剧。

最后,衷心感谢每位朋友的关心,经历这样的事情十分痛苦,但你们让我感到温暖。