
当随机性失灵:Coldcard 的熵缺陷,以及两台设备改变了什么
2026 年 7 月底,攻击者开始从数千个什么都没做错的硬件钱包里搬走比特币。它们的主人照着建议做了:买了专门用来签名的设备,把助记词保持在离线状态,从未把它敲进任何网站。这些都没有用,因为那些设备生成的助记词,从来就没有它看上去那么随机。
大约 1,816 枚 BTC 分四波离开了 5,200 多个地址。这成了今年最大的一次硬件钱包漏洞事件。
这篇文章不是一圈胜利巡游。牵涉其中的这个缺陷,属于几乎任何钱包都可能犯下的那一类——包括我们自己的——而有意思的问题不是谁把它发布了出去,而是当它发生时,一个钱包的架构会做什么。
究竟哪里出了错
一次提交,在 2021 年 3 月。
Coldcard 的设计要求助记词由硬件随机数发生器生成——一枚从物理过程中获取熵的专用芯片。那是正确的做法。但固件 4.0.1 中的一处改动,转而让助记词的生成走上了一条由公开的、硬编码常量播种的软件伪随机数发生器。
伪随机数发生器按定义就是确定性的。给定相同的初始值,它永远产出同一串序列。所以,这样生成出来的助记词,并不是一个谁也猜不到的数——它是从一个小到可以穷举的集合中取出的数,而所用的常量始终躺在已经公开发布的固件里。
设备照常运转。它们显示二十四个单词,人们把它抄下来,它们派生出正确的地址,签出有效的交易。任何钱包上都没有一块屏幕,会告诉你有多少熵进入了你的助记词。每一位受影响的用户,手里都是一台看起来、用起来都与正常设备一模一样的设备——最长达五年之久。
这个窗口从 2021 年 3 月的固件 4.0.1 一直延伸到 2026 年 7 月的 4.1.9。更新固件修好了此后的生成过程,而对已经创建出来的助记词毫无作用:那些密钥本就是弱的,而且没有任何更新,能给一个早已写在卡片上、锁在某人保险箱里的数字追加随机性。受影响的用户只能生成新的助记词,并把币迁走。
为什么弱随机性是一种无声的彻底损失
值得把这类缺陷为何如此严重讲清楚,因为它并不符合直觉。
一个 24 词的 BIP-39 助记词代表 256 比特的熵。猜中一个不只是困难,而是无法想象:无论现在还是将来,都不存在能穷举那个空间的计算机。整套自我保管模型正是建立在这块基石上:你的密钥之所以安全,是因为它是大到无法理解的可能性之中的一个。
而这份保证并不是那些单词的属性。它是挑选出这些单词的那个过程的属性。从弱发生器里取出的二十四个词,和从强发生器里取出的二十四个词,看上去完全一样。它们通过每一道校验和,产出有效的地址,在任何钱包里都能完美恢复。唯一的区别是,别人也能推导出它们。
所以这种失败从内部看是不可见的,而且是彻底的。它不是「如果你犯了错,攻击者就可能偷走你的钱」——这里没有需要避免的错误,没有需要拒绝的钓鱼链接,没有需要仔细阅读的确认对话框。这笔钱在攻击者方便的任何时候都可以取走,而第一个迹象,就是它已经不在了。
两台设备改变了什么

下面是在架构上真正要紧的部分,而我想把它讲得精确,而不是用营销措辞。
SSP 是一个 2-of-2 多签。资金存放在一个由两把独立密钥控制的地址上,这两把密钥在两台独立设备上生成——一把在浏览器扩展里,一把在 SSP Key 手机应用里——而一笔交易需要两个签名。二取二的安排就是这个钱包的全部基础。
现在把 Coldcard 的情形放到这个结构上跑一遍。假设扩展的助记词生成存在同样的缺陷,而攻击者可以完整地推导出你在浏览器里的那把密钥。
他依然什么都花不了。 他手上是两个必需签名中的一个。无论那是谁的密钥、又是怎么弄到的,这个地址都不会为一把密钥释放资金。要动你的币,他还必须独立且同时地攻破你手机上的那把密钥——那是另一个应用、另一套操作系统、另一个熵源,在另一个时刻生成。
这就是结构上的差别。在单密钥钱包里,一个弱助记词就是彻底损失。在 2-of-2 里,一个弱助记词是一个严重的问题,但它本身还不构成损失。
把限度直说出来
在这里打住、任由你得出「SSP 对此免疫」的结论,是很容易的。它并不免疫,而在别人正身处事故之中时假装免疫,恰恰是最不该的时刻。
SSP 的两个应用使用同一套 BIP-39 实现——@scure/bip39,在两边都锁定在同一个版本。该库自身的缺陷会同时影响两把密钥。 SSP 给你的独立性是真实的,但也是具体的:两个各自独立的助记词,在不同时刻、不同设备上生成,从不同的操作系统源汲取熵——一边是浏览器的 Web Crypto,另一边是移动平台的 CSPRNG。它不是两套彼此毫无关联的代码库之间的那种独立性。
它买到的,是针对 Coldcard 实际发生的那种失败模式的防护:某一款产品在生成助记词的方式上、特定于设备的实现错误。它无法防护位于两者之下的那一层共享密码学原语中的缺陷。
这是一个明显弱于「这不会发生在我们身上」的说法,而它是真实的那一个。任何告诉你他家钱包对熵失效具有绝对免疫力的人,谈的是他的营销,而不是他的架构。
该从中带走什么
如果你持有那个固件窗口内的 Coldcard,唯一安全的假设是助记词已经泄露,无论资金是否已经被搬走。请在打过补丁的固件上生成一个新的,并迁移过去。一台尚未被掏空的设备,并不是一台安全的设备。
如果你使用任何单密钥钱包,这就是你正在承担的风险,值得对它保持清醒,而不必焦虑。对大多数人而言,硬件钱包依然远远优于其他选项。这里的教训不是它们不好;而是一把密钥就是一个单点故障,而这把密钥历史中的每一个环节——包括它多年前诞生的那一刻,在一份你没有读过的固件里——都属于你的威胁模型。
而在一般意义上,请偏向那种「一件事出错还不够」的架构。正是这条原则,让 SSP 要求两台设备,让某些操作即便在你已经通过认证之后仍要求重新签名,也让究竟什么能拦下一笔交易成为一个值得向你所信任的任何钱包提出的问题。答案永远不该是「一个秘密,外加它当初被正确生成的希望」。
若要更全面地比较各种选项、以及每一种究竟能防住什么,比较自我保管的各种选项讲了其中的取舍。


