新闻加密货币Coldcard 比特币漏洞解析:固件缺陷如何降低密钥熵并导致 1.3 亿美元被盗

Coldcard 比特币漏洞解析:固件缺陷如何降低密钥熵并导致 1.3 亿美元被盗

作者: Decrypt·

要点速览

  • 一次构建配置错误导致 Coldcard 钱包使用软件伪随机数生成器,而不是原本设计的硬件随机芯片,使 Mk2 和 Mk3 设备的熵从 128 位降至约 40 位。
  • Galaxy Research 已确认至少 1,596 BTC 在三轮攻击中被盗,疑似第四轮可能将总损失推高至约 2,055 BTC,约合 1.3 亿美元。
  • 尽管 Coldcard 的开源代码始终可供社区审查,这一漏洞仍然大约八年未被发现。
  • Coinkite 已为所有受影响型号发布修复固件,但补丁无法修复已有种子,用户必须重新生成钱包并手动转移全部资金。
  • Coinkite 怀疑攻击者使用了 AI 辅助代码分析发现该缺陷,并指出公司自己最近用 AI 审查同一段代码时并未识别出问题。
Coldcard 比特币漏洞解析:固件缺陷如何降低密钥熵并导致 1.3 亿美元被盗

固件漏洞导致 Coldcard 硬件钱包使用软件伪随机数生成器来生成种子,而不是按设计用于此任务的专用硬件随机芯片。该缺陷实际上将较旧设备型号的搜索空间从 128 位降至约 40 位,使攻击者能够计算出私钥,并清空原本不应可达的钱包。

这些资金存放在 Coldcard 设备上——由加拿大公司 Coinkite 制造的硬件钱包,设计上应保持离线。Coldcard 一直因其隔离设计和透明架构而被比特币安全圈广泛推荐,这也使得这次失误对那些正是因为其安全声誉而选择该设备的用户而言尤为严重。此次事件中没有钓鱼链接、恶意软件或被盗设备;攻击者只是推导出了私钥。

Galaxy Research 已追踪到三轮已确认攻击中共有超过 1,596 BTC 被盗,另有一轮疑似攻击可能将总量提高到约 2,055 BTC——按当前价格约合 1.3 亿美元。一次集中转移在 41 分钟内搬走了 7,000 万美元。Coinkite 表示至少有 15 名不同攻击者参与其中。大多数大规模加密货币失窃都依赖社工、交易所入侵或智能合约漏洞;而这次可让攻击者仅凭设备元数据计算密钥的漏洞,则代表了完全不同的威胁面。

该公司于 8 月 1 日发布了一份技术背景说明解释问题所在。这份文件以罕见的坦率呈现,简而言之,就是这个钱包在过去八年里一直在摇着带有负载的骰子,却没人注意到。

零仍然算数

2021 年,Coinkite 将 Coldcard 的密码学迁移到 libsecp256k1,也就是 Bitcoin Core 使用的同一库。问题正是在集成环节开始的。

这次迁移悄悄地把种子生成从 Coldcard 自己的硬件随机数生成器,转向了 MicroPython 的软件回退方案——一个名为 Yasmarang 的小型算法,原本是为完全没有随机性芯片的设备而设计的。

🚨COLDCARD 黑客事件损失超过 1 亿美元

高置信度显示,1,596 BTC 已从约 7,300 个地址中被盗,分布在 3 轮已确认攻击和另外 14 起较小事件中。

如果加上疑似但未确认的部分,总额将膨胀至 1.3 亿美元(2,000 BTC)。

更多内容见下方线程 👇 pic.twitter.com/RAl3ib67qa

— Galaxy Research (@glxyresearch) August 3, 2026

Coldcard 确实有随机性芯片,只是它不再被调用了。

原因小到几乎难以置信。构建保护条件使用了 #ifndef,它检查的是某个设置是否存在,而不是它是否被开启。Coinkite 将该设置定义为 0,表示“关闭”。由于 0 仍然算作已定义,安全检查通过,构建完成。函数的两个版本签名完全相同,因此表面上看不出任何异常。此类构建配置错误——即预处理指令静默选择了错误代码路径——是 C 和 C++ 开发中已知的一类缺陷,但由于编译后的二进制在所有可观察行为上都表现正常,因此极难通过测试发现。

“COLDCARD 上的大部分随机性来自一个我根本不知道实际上存在于源码库中的 PRNG,”Coinkite 写道。这里的 PRNG 指伪随机数生成器——一种生成看起来随机、但实际上遵循固定规则并由起始值决定的软件。只要向该规则输入相同起始值,就会每次得到相同输出。

在运行 4.0.1 至 4.1.9 固件的 Mk2 和 Mk3 设备上,这个起始值来自芯片序列号和时钟。Coinkite 估算由此产生的搜索空间约为 40 位。较新的型号则混入了一些安全元件熵,将搜索空间提升到约 72 位。

这两个数字都达不到目标 128 位。

差距比看起来更重要。位数是指数。128 位的搜索空间所包含的组合数,比可观测宇宙中的原子还多,暴力搜索实际上不可能完成。40 位大约相当于一万亿种可能——一台普通笔记本就能处理。每少一位,攻击者需要付出的工作量就减半。

Block 的工程团队也发布了自己的分析,他们将较新设备的有效安全元件搜索空间估为 2^32 个候选值,平均约需 2^31 次尝试。对于较旧板卡,他们的判断更直接:在已知设备 ID、计时器状态和调用历史的情况下,钱包生成是确定性的。而确定性与随机性相反,而随机性对密码学至关重要。

不是“脆弱”。是可预测。

Coinkite 怀疑这一漏洞是通过自动化代码分析发现的。“我们必须假设有人使用 AI 审查了我们固件的早期版本,并偶然发现了这个问题,”公司写道,并补充称他们近期曾用目前最好的 AI 模型之一审查同一段代码,但没有发现任何异常。“攻击者和防守者都拥有相同的 AI 工具,但今天它没有帮助我们,只是帮助了坏人。”

所有受影响型号都已发布修复固件。它无法修复已有种子;这些钱包必须重新生成,资金也必须转移。Decrypt 曾报道这种事件后空气隔离存储会如何变化,并持续跟踪损失攀升至1.14 亿美元以上

熵到底是什么

熵衡量的是攻击者不知道多少——换句话说,就是用比特表示的不确定性。1 比特等于一次抛硬币:两个结果,猜对的概率各半。10 比特等于 1,024 种结果。每增加 1 比特,猜测者的工作量就翻倍。

比特币钱包本质上是一个被保密的巨大数字。人们向其发送比特币的地址是通过该数字数学推导出来的,而且这个推导过程是单向的——你可以从密钥得到地址,但不能反过来。

因此,每个钱包的安全性都取决于一个问题:攻击者需要尝试多少个数字?如果这个数字是用 128 位熵选出的,答案就是“超出物理极限”。如果是用 40 位选出的,答案就是“给我一点时间”。

这也是量子计算威胁之所以值得讨论的原因——量子机器会攻击连接密钥与地址的数学关系。Coldcard 的漏洞根本不需要这么复杂。它在数学介入之前就让密钥变得可猜。

这里的术语容易混淆。伪随机生成器产生的输出可以通过随机性的统计测试,因此基本上不会被电子表格标记出来。但该输出仍完全由其种子值决定。它看起来随机,但并不是真随机。

统计意义上的随机性与密码学意义上的不可预测性是不同的属性。Coldcard 的输出可以轻松通过前者,却会在后者上彻底失败。

真正的随机性必须来自物理噪声:电路中的电抖动、热波动、放射性衰变。这正是 Coldcard 上硬件芯片本该提供的东西,也正是那个被构建标志断开的芯片。

然后 Luke Dashjr 提到了骰子

在用户急于重新生成种子的同时,许多人选择了显而易见的低技术方案。Coldcard 允许用户掷实体骰子,并将结果作为熵输入。Coinkite 自己的指导原则认为,至少经过 50 次独立、私密骰子掷出的种子不受该漏洞影响。

这听起来或许很蠢,但公司实际上还出售一袋“100 cute and tiny little dice”,以便让整个过程更容易一些。

7 月 31 日,Bitcoin Core 开发者 Luke Dashjr 发布了一个警告:“不少人建议/使用骰子来缓解 Coldcard 漏洞。注意,普通骰子并不是为密码学安全而设计的。如果你要这么做,最好购买精度较高的赌场骰子。即便如此,也还需要另一个熵来源。”

比特币 Twitter 并没有平静接受这一说法。

“lol now you can't even roll dice,”一位用户写道。“Self custody is done for…” 另一位则问,他是否应该雇一位患有帕金森病的人来掷骰子。(这样说不太妥当。)

should I hire someone with parkinsons to throw the dice? — Murern (@Bitcoin_Murern) July 31, 2026

最有技术含量的回应大概带着算术。开发者 Justin Sharp 算出了劣质骰子究竟会让你损失多少熵:

“太过度了。完美的 d6 每次掷出提供 2.585 比特。一个明显有偏差的骰子,例如某一面有 20% 的概率落出,而不是 16.7%,每次仍然大约提供 2.55 比特。在 99 次掷骰中,这相当于约 256 比特和约 252 比特熵之间的差别。”

256 比特中少了 4 比特。这就是一个肉眼可见不公平骰子的全部代价。

Dashjr 说廉价骰子存在可测量偏差并没有错——注塑成型的点数会从每一面去除略有不同的塑料量,这正是赌场使用齐平填充精密骰子的原因。他对物理原理是对的,但对风险级别判断错了。256 比特里少 4 比特,仍有 252;Coldcard 的漏洞却把用户留在了 40。

不过,在他的建议中还埋着一个更尖锐的论点,而且并不是关于制造公差,而是关于不要信任任何单一熵源。Coldcard 的失败并不是其随机性略有偏差,而是某个组件悄无声息地停止贡献,而没有任何机制捕捉到这一点。

该怎么办

如果你在有影响的 Coldcard 上生成了种子,而且没有使用掷骰子(确实如此)或强大的 BIP-39 助记词口令,那么该种子应被视为已受损。

建议步骤是:更新固件、生成新种子、验证指纹、发送一笔测试交易,然后转移全部资金。Coinkite 的公告按不同型号逐一说明了这一流程。导出的种子会把缺陷一并带走——把有问题的种子导入另一个钱包应用并不能解决问题。

对其他人来说,这个教训不是硬件钱包坏了,也不是骰子是陷阱,而是“随机”本身就是一种主张,而主张需要验证。Coldcard 的源码始终公开。预期中的硬件 RNG 一直就在二进制文件里。审查者确认它存在,却从未确认种子生成器真的调用了它。Coldcard 所采用的开源模式,原本就建立在社区审查在攻击者之前发现缺陷的前提上。八年的审计都看了正确的代码,却没人检查它是否真的运行。