请立即停止使用 ElectrumSV 1.3.7 及之前版本中实现的 multisig accumulator 多签方案。该方案的锁定脚本有严重 bug,我被盗了 600 BSV。
背景
CoinGeek 2019 首尔大会时,介绍过 multisig accumulator 多签方案。
ElectrumSV 在 1.3.0b4 版本中实现了该功能,源码如下。
- https://github.com/electrumsv/electrumsv/commit/e490e694046faf88f0d6dbada5d01974838b3bcb
- https://github.com/electrumsv/electrumsv/commit/6035f5b51c84e09811274adcb34b162822e9cc3d
大致经过
事情发生在 11 月 6 号。
- 凌晨 2 点多,我输出了 6 个 multisig accumulator UTXO,每个 100 BSV。
- 当天晚上 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 在实现时直接参考了演示代码,也没有做足够多的测试。而我对这样的新技术没有抵抗力,直接使用该方案大量存币,最终酿成悲剧。
最后,衷心感谢每位朋友的关心,经历这样的事情十分痛苦,但你们让我感到温暖。