返回博客
安全

钱包熵:Coldcard 事件揭示的随机性教训

一条由 128 个随机比特组成的宽阔比特流,经过一枚被绕开的 RNG 芯片后,收窄成一条只剩 40 个可预测比特的稀疏细流

2026 年 7 月 31 日 01:31(UTC),比特币开始从一批钱包中流出,而这些钱包的主人什么都没有做。到 01:56——仅仅二十五分钟之后——约 594 枚 BTC、价值约 3800 万美元,已从大约 500 个单签名钱包中被席卷一空。Galaxy Research 的后续分析与 Chainalysis 的相关报道进一步把关联范围扩大到约 1,196 个地址上的至多约 1,083 枚 BTC。没有人被钓鱼,没有人安装恶意软件,也没有人批准过任何交易。受害者唯一的共同点,是他们钱包的创建日期——因为真正失守的是钱包熵:助记词赖以生成的随机性,它在钱包诞生的第一秒就已定型。

这些钱包都是在 Coldcard 硬件设备上生成的,而背后的漏洞已在正式发布的固件中潜伏了五年多。本文将讲清楚发生了什么、这一类漏洞为何始终难以察觉、它对硬件钱包说明了什么又没有说明什么——以及针对任何钱包(包括我们自己的)的随机性,你应该提出哪些问题。

2021 年埋下的漏洞,2026 年被兑现

根据 Coinkite 的安全通告,该漏洞随 2021 年 3 月发布的 Coldcard 固件 4.0.0 进入产品。在受影响的设备上,种子生成跳过了硬件随机数生成器,回退为使用以非保密芯片数据作为种子的密钥材料。一条 BIP39 助记词本应编码 128 位熵——2¹²⁸ 种可能的种子,一个任何攻击者都无法穷举的空间。而在受影响的 Mk3 设备上生成的种子,实际只携带约 40 位有效熵。2⁴⁰ 大约是 1.1 万亿个候选——对人类而言浩瀚无边,对机器而言完全可以遍历。这就是 Coldcard 漏洞的一句话解释:设备悄悄放弃了自己的随机性,而表面上没有任何迹象泄露这一点。

有两类用户从未暴露在风险之中:使用 BIP39 密语创建种子的人,以及通过 50 次以上掷骰子生成种子的人。Coinkite 披露了这一问题并发布了修复固件——Mk4 和 Mk5 对应 5.6.0,Q 对应 1.5.0Q。而在这中间的五年里,受影响的钱包一直运转无碍,与安全的钱包看起来毫无二致。发动这次席卷的人根本不需要接触任何受害者:枚举弱密钥空间,派生地址,与链上数据比对,然后在一个 25 分钟的窗口内把一切转走。

静默的熵退化:为什么这些种子看起来是随机的

令人不安之处在于,受影响的种子从头到尾没有任何异样。一条由 40 位可预测输入构造出来的种子,最终仍呈现为十二个再普通不过的 BIP39 单词,校验和完全有效。钱包接受它、派生地址、签署交易;每一个界面显示的,都与一个强种子钱包会显示的一模一样。

统计检验同样无能为力:一个以可预测数据作为种子的确定性生成器,其输出照样能通过随机性测试——比特分布良好,只不过它们取自一个小得灾难性的可能序列集合。弱点藏在一个任何输出都无法揭示的属性里:本来还可能生成多少条别的种子。这个答案只存在于生成代码之中。

弱种子看起来并不弱。2¹²⁸ 与 2⁴⁰ 的差别,只存在于生成这些单词的代码里。
种子生成分成两条路径:一条经硬件 CSPRNG、拥有 2 的 128 次方种可能;另一条是以非保密芯片数据为种子的静默回退路径,只有 2 的 40 次方种可能;两条路径最终都得到十二个看起来正常的单词
两条路径都以十二个普通单词收尾。2¹²⁸ 与 2⁴⁰ 种可能种子之间的差别,从不会出现在任何屏幕上。

正因如此,这一类漏洞才能存续多年,Coldcard 事件也并非孤例,而是属于一个家族。Libbitcoin bx 工具中的 Milk Sad、Trust Wallet 浏览器扩展的 MT19937 生成器、Cake Wallet、靓号地址工具 Profanity,以及早期浏览器钱包中的 Randstorm,都共享同一种形态:CSPRNG 被一个可预测的来源悄悄替换——没有报错,没有警告,没有任何可见差异,直到有人开始枚举密钥空间。

令人不适的教训

“硬件钱包”描述的是一种形态,而不是一种保证。7 月 31 日被席卷的钱包,都创建于专门打造的签名硬件之上——而失守的恰恰不是这一层。决定生死的,是一个在多年前就已定型的属性:钱包创建当天,种子是如何生成的。下游的一切——冷存储、气隙签名、细致的核对——保护的都是密钥不被偷走。可如果密钥能被重新生成出来,这一切都无济于事。

同样重要的是,Coinkite 及时披露了漏洞并迅速发布了修复固件。这不是一个关于粗心厂商的故事;这是整个行业在硬件和软件中不断重蹈的失败模式。任何钱包——包括我们自己的——距离同一类漏洞都只隔着一次静默回退。诚实的问题不是“哪家厂商能够免疫?”,而是“这个钱包会以什么方式失败?失败时会有人察觉吗?”

关于任何钱包的随机性,应该问的五个问题

你不需要成为密码学家,也能提高安全门槛。五个问题就足以对钱包做出有意义的区分:

  1. 熵源是什么?种子应当来自 CSPRNG,而不是时间戳、设备标识符,或任何外人能够重构的东西。
  2. 如果熵源失效会怎样?可接受的答案是抛出硬错误、终止钱包创建。不可接受的答案是悄悄换用替代品——静默回退正是这一类漏洞的标志性特征。
  3. 生成路径是否开源、可验证?弱熵在输出中不可见,因此代码审查是唯一能抓住它的地方。
  4. 钱包是否支持 BIP39 密语?密语加入了设备生成器从未经手的保密材料。这正是受影响 Coldcard 上使用密语的用户分文未失的原因。
  5. 在多签中,各把密钥是否在相互独立的设备上生成?独立的设备意味着独立的随机性:一个有缺陷的生成器只会危及一把密钥,而不是整个法定门限。

Ownbit 如何生成熵

提出了这样的问题,就理应对我们自己的产品给出具体回答。Ownbit 的助记词生成分为两层。在应用层,generateMnemonicRandom(entropy, langIndex) 调用标准 bip39 库中的 generateMnemonic——默认 128 位熵,支持八种 BIP39 词表:英语、简体中文、繁体中文、日语、法语、意大利语、韩语和西班牙语。在库这一层,bip39 的 randomBytes 从 crypto.getRandomValues——即平台 CSPRNG——获取随机字节。

这里真正关键的是:当这个来源不可用时会发生什么——库会直接抛出错误。它不会去读时钟、芯片标识符或任何次级来源——代码中根本不存在回退路径。它的失败模式是在创建时刻响亮报错,而绝不是一条悄然变弱的种子。这一属性——响亮地失败,绝不回退——与 Coldcard 事件、Milk Sad 和 Randstorm 背后的缺陷恰好相反:在那些案例里,生成过程从一个可预测的来源悄无声息地继续了下去。

我们不会声称这让 Ownbit 对漏洞免疫;任何诚实的厂商都无法这样声称。它从构造上消除的,是这一种失败形态:不存在任何一条代码路径,能让 Ownbit 钱包悄悄生成一条弱种子。安全模型的其余部分,都写在我们的安全页面上。

为什么独立生成的密钥能在这类漏洞面前幸存

7 月 31 日的席卷打击的是单签名钱包:一条种子、一个签名,资金就此消失——这是助记词作为单点故障的教科书式案例。多签改变了这道算术题。在 Ownbit 的多签钱包中,每一把密钥都是一条独立的标准 BIP39 助记词,在对应参与者自己的设备上生成。假设其中一台设备恰好携带这类漏洞。在一个 2-of-3 钱包里,枚举了弱密钥空间的攻击者只握有一把密钥——低于门限。资金分毫不动。一把弱密钥变成一项维护任务——把它轮换掉——而不是一笔损失。

一个密钥分别在三台独立设备上生成的 2-of-3 多签:攻击者破解了那把弱熵密钥,却只握有 3 把中的 1 把,低于门限,资金安然无恙
一把弱的共同签名人密钥只让攻击者拿到 3 把中的 1 把——低于门限。资金不会移动。

这份保护来自独立性,而不是来自“多签”这个词本身。三把在同一款有缺陷设备上生成的共同签名人密钥,会一起失守。而三把诞生于真正不同设备上的密钥——你的日常手机、一台离线保存、通过二维码签名的闲置手机冷钱包、一位家人的设备——不共享任何生成器,因此也不共享任何漏洞。同样的逻辑也解释了为什么 BIP39 密语救下了受影响的 Coldcard 用户:密语是设备 RNG 从未生成过的保密材料,因此仅仅枚举 2⁴⁰ 条种子并不足以花掉资金。

如果你持有受影响的 Coldcard

三个行动:

  1. 更新固件。Coinkite 通告中给出的修复版本为:Mk4 和 Mk5 对应 5.6.0,Q 对应 1.5.0Q。
  2. 把资金转移到在修复固件上新生成的种子。更新只能保护未来的种子,无法加固已经存在的种子。一条生来只有约 40 位熵的种子将永远可被枚举——彻底弃用它,绝不重复使用,也绝不再向它的地址转回资金。
  3. 绝不要把现有助记词输入任何声称可以“检测”其是否存在漏洞的网站。把种子输入任何联网的东西,正是剩余资金被取走的方式;此类事件之后,“检测”网站是一种屡见不鲜的钓鱼套路。

常见问题

什么是钱包熵?

钱包熵是创建助记词时所用的随机性。一条标准的 12 词 BIP39 助记词编码 128 位熵——即 2¹²⁸ 种可能的种子。如果生成器是可预测的,实际可能的种子数量就会坍缩,无论种子事后被保存得多么妥善,攻击者都可以把它们枚举出来。

我的 Coldcard 受影响吗?

根据 Coinkite 的通告,该漏洞随 2021 年 3 月的固件 4.0.0 引入,受影响的 Mk3 种子只携带约 40 位有效熵,而非 128 位。使用 BIP39 密语创建的种子,或通过 50 次以上掷骰子生成的种子,不在风险之列。如有疑虑,请更新到修复固件——Mk4/Mk5 对应 5.6.0,Q 对应 1.5.0Q——并把资金转移到新生成的种子上。

弱种子能靠肉眼看出来吗?

不能。弱种子照样产生十二个正常单词,校验和有效,统计检验也无法揭示可预测的来源。强度是生成代码的属性,而不是单词本身的属性——这正是受影响的钱包五年多都无人察觉的原因。

多签能防范弱熵吗?

从结构上说,能——前提是各把密钥在相互独立的设备上生成。一把弱密钥只给攻击者一个签名——低于 M-of-N 门限——资金因此不会移动。而在同一款有缺陷设备上生成的多把密钥可能一起失守,这就是为什么独立性与门限同等重要。

我应该停用硬件钱包吗?

不必。这次的教训要窄得多:“硬件钱包”这个词本身并不是保证——种子是如何生成的才是。继续使用维护良好的设备,及时应用固件更新,在支持的地方加上 BIP39 密语,并把大额资产放在多签门限之后,而不是任何单一种子之下。

如果这次事件让你重新审视自己的方案,结构性的解法是:不再让任何单一种子独自横亘在你的资金与攻击者之间。Ownbit 的多签钱包把 M-of-N 门限架设在多把于独立设备上生成的密钥之上,每一把都是标准的 BIP39 助记词。每位新用户都可获得 7 天免费试用,而且无论如何,你的密钥始终属于你。