作者:Unchained

来源:https://www.unchained.com/blog/how-multisig-protected-thousands-of-bitcoin

2026 年 7 月 30 日(周四),Coldcard 签名器的制造商 Coinkite 公司发布了一份安全提醒,披露了绝大部分 Coldcard 签名器上存在的一个漏洞。不幸的是,绝大部分受此漏洞影响的单签名钱包用户,都立即遭遇了资金失窃。而绝大部分多签名钱包用户,包括 Unchained 的客户,则并没有失盗。在这篇文章中,我们讲解释不同类型的钱包的区别,以及多签名如何形成了更好的保护,超过了多个密钥的简单冗余性。

漏洞从何而来

比特币钱包的基础是 “(entropy)”,指的是不可预测的随机性。生成私钥来形成和控制钱包的过程,需要生成一个非常大的随机数,要求是其他人(在现实的条件下)无法猜到或重新创造出来。你可以手动采集熵,比如投很多次骰子,或者扔很多次硬币,但密码货币的硬件签名器也会尝试方便用户,办法是在设备中实现 RNG(随机数生成器),将此过程简化为按一次按钮。

Coldcard 签名器的事故是,人们在其 RNG 程序中发现了一个严重的漏洞,这个漏洞意味着,在过去五年时间里,绝大部分 Coldcard 签名器所生成的熵都是不安全的,它们远远不像人们期待的那么不可预测、那么随机;这个 RNG 可以生成的种子和私钥的可能数量,比保证安全性所需要的数量少得多。

因为熵是起点,它没有安全性,也就意味着建立在它上面的层级都是不安全的。这也意味着,在这个漏洞被发现之后,受影响的用户没有任何办法补救。因为钱包(私钥)本身是从最初的那个坏熵派生出来的,用户唯一能够做的事情就是尽快将钱包中的资金转移到安全的地方。在转移之前,攻击者可以持续利用这个漏洞、尝试生成这个坏 RNG 可能生成的种子并检查对应的钱包有无资金。

为什么单签名钱包是最脆弱的

单签名钱包是这样一种保管比特币的办法:它只要求一个私钥来授权比特币的转移。来自这个私钥的一个密码学签名,就足够了。虽然这种模式便于快速、轻松地转移资金,它也到来了一个 “单点故障”。如果这个私钥被忘记了、摧毁了或是失盗了,那么它所保管的比特币也就找不回来了。

利用 Coldcard 签名器漏洞的攻击者可以快速找出在单签名钱包中保护了资金的私钥,尤其是那些没有额外防护的。他们可以(尝试生成这个坏 RNG 可能生成的种子)(根据常用的派生路径)扫描可能的私钥,然后迅速发现真正保管着比特币的私钥。只要他们找出来了,攻击者就可以立即使用这个私钥将资金转移到自己的钱包,也就是盗走受此漏洞影响的用户的比特币。

为什么多签名钱包可以提供保护

多签名钱包是这样一种保管比特币的办法:需要多个密钥来授权比特币的转移。如果你还不熟悉多签名钱包,可以先阅读我们的专门的介绍性文章

1. 多签名钱包需要阈值数量的密钥来花费比特币

多签名钱包需要阈值数量的密钥来移动资金。最典型的例子是,一个使用 3 把不同密钥的钱包,需要其中任意两个密钥的签名才能花费比特币 —— 这就是所谓的 “2-of-3 多签名钱包”。这显然比单签名钱包提供了更多保护,因为只要 3 个密钥是分别保存的,就没有单点故障。如果某一个密钥弄丢了或者毁掉了,依然有两个密钥可以转移比特币。如果一个密钥被盗(或就像我们这次遭遇的事故一样,因为根本性的 RNG 漏洞而暴露),盗贼也没有足够多的密钥来转移你的比特币。

在这次的 Coldcard 签名器事故中,用于一个 2-of-3 多签名装置的密钥也可能是用 Coldcard 签名器生成的,因此会受本漏洞影响。如果没有密钥是这样有缺陷的,或者只有一个密钥是这样的,那么攻击者没有足够多的私钥来转移你的资金。如果其中两个或三个密钥是有缺陷的,那么多签名装置依然能提供一些保护,不过前提是理解公钥是如何用来生成比特币地址的。

2. 从一个地址花费时,需要知道所有的公钥

单签名的比特币地址的构造相对简单。每个地址都是用一个公钥构造出来的。但是多签名地址是用多个公钥构造出来的,其中每个公钥都对应着在建立钱包的过程中用到的一个密钥。比如,一个 2-of-3 多签名地址涉及总共 3 个密钥,所以需要 3 个公钥来构造它。

因为比特币交易的工作原理,为了从一个地址花费,花费人需要知道构成这个地址的所有公钥。 对于单签名地址来说,这很简单 —— 你本来就需要私钥才能花费;既然你有了私钥,算出它的公钥就不在话下。但对于 2-of-3 多签名地址来说,花费的时候只需要 2 个私钥,但还是需要剩下的那个密钥的公钥才行。

最后的那个公钥可能成为一个重要的因素,在攻击者成功拿到你的 2 个私钥时保护你的资金。在 Coldcard 签名器事件中,它为许多使用多个 Coldcard 密钥搭建多签名钱包的用户提供了有用的保护。

3. 公钥并非一定公开过

公钥不像私钥是敏感数据,因为从一开始就预期它会在某个时间点成为公开信息,而私钥则应该永远保持私密。不过,即使它们没有那么敏感,公钥并不一定公开过。

可能揭晓公钥的情形主要有两种。其一,每个多签名钱包都有对应的配置信息,有时候称为 “配置文件”,有时候称为 “描述符(descriptor)”。配置文件并不包含任何 私钥,但确实包含从所有的公钥计算出钱包中的地址所需的所有信息。这使得用户可以将自己的多签名钱包导入到自己选择的钱包软件中,而不是锁死在一个钱包软件熵。不过,最好让配置信息保持私密,因为公开它会揭晓你所有的地址、余额和构成它们的公钥。

其次,无论什么时候,你要从一个多签名地址花费的时候,构成 该地址 的所有公钥都会公开,这跟比特币交易的工作原理有关(但不意味着你整个钱包的公钥都会暴露)。这意味着,如果你要从一个多签名地址花费,最好是完全清空这个地址、将找零的资金发到你的钱包内的新生成的、未使用的找零地址。此外,最好避免向已经花费过的地址再次存入比特币;要存入比特币,应该使用新的存款地址。(如果你使用 Unchained vault 产品,我们的平台会默认帮助你这样做,但是,任何软件都无法阻止用户手动将资金存入已经用过的地址。)

还有一点需要注意,即使一个地址以前从未花费过,在它被花掉以前,会有一个时间窗口:在你的花费交易广播之后、该交易得到区块确认之前(也就是这笔交易处于 “pending(待处理)”状态的时候)。如果交易是使用普通的公开交易池广播的,那么这个地址中的公钥就已经公开 —— 如果这些公钥背后的私钥都是有缺陷的,那么在此时间窗口中,这些比特币就有被盗的危险。缓解这种 “RBF 攻击” 风险需要另一种广播交易的方法 —— 将交易直接发送给值得信任的比特币矿工,而不是广播到公开的交易池。Unchained 迅速部署了这种服务,以帮助受 Coldcard 签名器事故影响的客户。

4. 猜测密钥的组合并不一定容易

一个使用 3 个 Coldcard 密钥生成的 2-of-3 多签名签名,似乎处在危险境地中(实际上可能确实如此),但即使是这种情形, 多签名也能提供一些安全性好处。如果使用这种装置的比特币资金没有放在已经花费过的地址上(也即地址公钥没有暴露)、其钱包配置信息也保持私密,那么攻击者需要付出更多搜索工作才能发现和转移这些余额。

攻击者不仅需要找出所有三个私钥和公钥,还需要以适当的方式将它们关联起来。换句话说,即使攻击者生成了一个所有可能密钥的清单,也必须逐个尝试三个密钥的组合,直到找出匹配你的比特币地址的那三个密钥。这样做所需的工作量,如果清单较长,会上升一个数量级,甚至可能让它变成一种不可行的、至少无利可图的尝试。

结语

多签名钱包提供了可观的安全性强化,可以消除单点故障。Coldcard 签名器事故是一次重要的案例研究,测试了 —— 最终也证明了 —— 多签名钱包的优势。此时此刻,水落石出,多签名给了用户额外的容错能力和响应时间。即使某人在多签名钱包中使用了多个 Coldcard 缺陷密钥,使他压力很大,但以谨慎、相对迅速的响应,依然很有可能挽救资金。

多签名钱包并不难以搭建,如果使用 Unchained 这样的合作式保管伙伴,甚至更加简单。在我们的默认的 2-of-3 多签名结构中,你持有两个密钥,因此有全面的、排他的、独立的控制全。但 Unchained 持有第三个密钥,从而减少了你需要自己管理的密钥的数量。

(完)