U卡雷达U卡雷达 U卡雷达

风险分析

Coldcard 钱包的熵缺陷与近 9000 万美元损失:一次“绝对安全”硬件的深刻警示

作者
林知远
最后更新
2026年8月3日
分享文章

分享到

X 微博 Facebook LinkedIn WhatsApp Telegram

image

7月 30 日,比特币链上出现了一批很不寻常的转账。
最早引起关注的一轮清扫只持续了 41 分钟,1,196 个地址里的 1,082.65 BTC 被转走。随后,Galaxy Research 又找到了两轮疑似相关活动。到 8 月 2 日,三轮合计约 1,367.05 BTC,按事发时的币价估算接近 8,860 万美元,涉及 4,585 个地址。
这组数字可以从 Galaxy Research 的公开更新、CoinDesk 的链上追踪和 The Hacker News 的技术整理中交叉核对。

Coldcard Hardware Wallet Flaw Linked to $70 Million Bitcoin Theft in 41  Minutes

这些钱包有一个共同点:相关种子被认为由 Coinkite 的 Coldcard 硬件钱包生成。 很多受影响设备长期离线,助记词也没有被上传到云端。问题出在更早的时候。设备在创建钱包时,没有按预期使用硬件真随机数生成器。攻击者不用盗取助记词,只要把可能生成的助记词算出来,再去区块链上找对应地址就行。 硬件钱包最难防的事故,往往就是这一类。设备可以一直锁在抽屉里,私钥也确实从未离开设备,可如果私钥一开始就不够随机,后面的空气隔离、安全芯片和防拆设计都派不上用场。

目前已经确认了什么 Coldcard 的开发商 Coinkite 已经承认,2021 年至 2026 年 7 月间发布的部分固件存在低熵问题。公司要求受影响用户重新生成种子,并把资金转到新地址。Coinkite 安全公告给出的修复版本包括:Mk2/Mk3 4.2.0、Mk4/Mk5 标准版 5.6.0、Q 标准版 1.5.0Q,以及 Edge 分支的 6.6.0X 和 6.6.0QX。 Block 的比特币工程与安全团队也进行了独立分析。他们在技术报告中把问题定位到了随机数调用链:钱包生成种子时,本应调用 STM32 芯片的硬件随机数生成器,实际走到的却是 MicroPython 内置的软件伪随机数生成器 Yasmarang。 漏洞和链上清扫都是真实存在的,但两者的归因还没有完全闭合。Galaxy 是根据手续费、找零方式、批量转账结构和派生路径识别相关交易的。目前没有公开报告完整展示过“重建某位受害者的弱种子,然后与被清空地址一一对应”的全过程。 因此,更准确的说法是:研究人员发现了一个足以导致私钥被离线枚举的 Coldcard 固件缺陷,同时观察到多轮高度可疑的资金清扫,两者在时间和行为上高度吻合。直接把 1,367.05 BTC 全部写成“经证实由该漏洞盗走”,证据还差最后一段。

Bug 藏在随机数调用链里
Coldcard 原本有一套直接读取 STM32 硬件 RNG 的代码,对应的 Python 接口是 ckcc.rng_bytes()。
2021 年,Coldcard 在迁移椭圆曲线相关代码、引入 libNgU 时,把新钱包的随机数接口换成了 ngu.random.bytes()。问题随之进入固件。
生产配置中,MICROPY_HW_ENABLE_RNG 被定义为 0。开发者这样做,是因为 Coldcard 已经有自己的硬件 RNG 封装,不需要 MicroPython 再提供一套。libNgU 的检查却用了 #ifndef,只判断这个宏有没有定义,没有检查它的值是不是非零。
代码能编译,设备也能正常开机。最终链接时,rng_get() 没有指向 Coldcard 预期的硬件实现,而是绑定到了 MicroPython 的 Yasmarang 回退程序。相关代码和提交记录都能在 Coldcard 固件仓库中查到,Block 的报告则把完整调用过程逐段拆了出来。
Yasmarang 会产出看起来杂乱的数字,但它不是给钱包主密钥准备的密码学安全随机数生成器。它的初始状态主要来自芯片 UID 的低 32 位、SysTick 计时器和 RTC 时间寄存器。
芯片 UID 只是设备编号,不是秘密。计时器状态也不等于物理噪声,而且这些输入彼此可能有关联。生成器初始化后不会继续吸收新的随机信息。一旦设备状态、启动时间和此前的调用次数被缩小到一定范围,后面的输出就能在另一台电脑上重现。
代码后面虽然还会对生成结果做哈希,但这解决不了问题。一万个可能的输入,经过 SHA-256 后仍然只有一万个可能的输出。结果看上去更均匀,不代表搜索空间变大了。BIP-39 校验位的作用也只是检查格式,它不会增加助记词的实际熵。

COLDCARD - Bitcoin-Only Hardware Wallet

40 位和 72 位,差距有多大 BIP-39 规范要求助记词的初始熵在 128 至 256 位之间。常见的 12 词助记词对应 128 位,24 词对应 256 位。 Coinkite 对旧固件的初步估算是,Mk2/Mk3 生成种子的有效搜索空间约为 40 位,Mk4/Mk5/Q 约为 72 位。 40 位大约有 1.1 万亿个候选。听起来仍然很多,但它和 128 位并不在一个数量级。两者的候选空间相差约 2^88 倍。一旦攻击者能利用设备型号、芯片 UID、启动时序或常见派生路径继续缩小范围,离线枚举就不再只是理论讨论。 后期机型多了一层处理。Mk4 会在启动时混入安全元件提供的随机值,但代码将结果哈希后只取了 4 个字节,再用这 32 位替换 Yasmarang 的一个状态字。Block 据此认为,在其他状态和调用历史已知时,安全元件最多区分 2^32 条输出流。即便把未知计时器状态全部按宽松上界计算,候选空间也低于 2^73.3。 我不建议把这个结论简单写成“Mk4 有 72 位安全性”。Block 自己也提醒,2^73.3 只是一个偏宽松的候选上限,并不是标准意义上的 73 位密码学安全。实际破解成本会受到 UID 信息、启动时间、此前调用次数、地址派生和验证速度影响,目前也没有公开的完整破解基准。 能确定的是,后期机型的情况比 Mk2/Mk3 好一些,但仍没有达到 Coldcard 原本设定的 128 位目标,所以 Coinkite 也要求这部分用户更换种子。

受影响的是种子,不只是设备
排查时最容易犯的错,是只看设备现在安装的固件。
真正决定风险的,是这组助记词当初由哪个版本生成。今天把 Mk3 升级到 4.2.0,并不会让五年前生成的旧助记词突然多出随机性。把同一组助记词导入 Ledger、Trezor 或软件钱包也没用,弱点已经写进种子本身。

设备

生成种子时的风险范围

官方修复版本

Mk2 / Mk3

Coinkite 列为 4.0.1–4.1.9;Block 把 4.0.0 也列入易受影响路径

4.2.0 或更高

Mk4 / Mk5 标准版

5.6.0 之前

5.6.0 或更高

Q 标准版

1.5.0Q 之前

1.5.0Q 或更高

Mk4 / Mk5 Edge

6.6.0X 之前

6.6.0X 或更高

Q Edge

6.6.0QX 之前

6.6.0QX 或更高

这里还有一个版本细节。标准版和 Edge 是两条发布线,不能因为旧 Edge 固件的数字大于 5.6.0,就认定已经修复。具体范围应以 Coinkite 最新公告和官方变更记录为准。 Coinkite 表示,TAPSIGNER、OPENDIME 和 SATSCARD 使用的是其他代码库,不受本次缺陷影响。

钱包没联网,攻击者怎么把币转走
硬件钱包负责保存私钥和完成签名。只要随机数没有问题,攻击者想从远程拿到私钥,确实很难。
这次的攻击路径绕开了设备本身。攻击者可以在自己的计算机上枚举可能的随机状态,生成候选助记词,再推导对应的扩展公钥和常用地址。比特币区块链是公开的,候选地址上有没有余额,一查就知道。
匹配成功后,攻击者算出的私钥与钱包里的私钥完全相同。他可以自己签名和广播交易,既不用连接原设备,也不用知道设备 PIN。所谓“设备从未联网”并不能排除这种攻击,因为计算候选私钥的过程本来就可以离线进行。
长期没动过的币也不会因此安全。弱种子的风险不会自然过期。随着研究公开、硬件计算成本下降,原本不划算的搜索可能变得有利可图。长期休眠、余额较高的地址反而更适合攻击者优先处理。

Coldcard Attacker Stole $30M in 10 Minutes by Targeting Big Wallets

链上的 4,585 个地址该怎么理解
Galaxy Research 截至 8 月 2 日整理出的主要数据如下:

观察范围

地址数

BTC 数量

交易特点

7 月 30 日首轮大规模清扫

1,196

1,082.65

约 41 分钟完成,手续费和交易结构高度一致

第三轮

1,912

约 207.73

单地址余额更低,平均每笔批量处理约 6 个地址

三轮合计

4,585

1,367.05

Galaxy 的疑似关联口径,约合 8,860 万美元

前两轮使用了相似的固定费率和批处理方式,可能来自同一个操作者,也可能使用了同一套工具。第三轮改变了归集地址和输出结构。Galaxy 没有把三轮活动都归给同一个攻击者,因为链上信息不足以支持这个判断。 地址数也不能直接换算成人数。一个人可能有多个地址,同一组助记词下也能派生出许多收款地址。反过来,研究人员如果只扫描了默认派生路径,也可能漏掉同一钱包里的其他资金。 链上归因还有一个天然限制:钱包主人主动迁移资金,在交易形式上可能和攻击者清扫没有区别。Galaxy 使用的是交易指纹、派生路径和受害者报告组成的判断模型,不是从区块链上直接读到了“盗窃”标签。因此,1,367.05 BTC 更适合称为“观察到的疑似相关规模”。

代码公开了五年,为什么没人发现 Coldcard 固件一直公开,硬件随机数实现也确实存在。过去的审查能看到那段 TRNG 代码,却没有确认创建钱包时最终调用的是不是它。 这个 Bug 跨了好几层:钱包生成函数换了接口,libNgU 对编译宏的检查不完整,MicroPython 又提供了同名的软件回退实现。每一段单独看都不算醒目。程序可以正常编译,设备可以正常使用,输出也不会简单地重复。只有沿着真实构建结果追踪符号解析和最终调用路径,问题才会暴露。 普通的随机数测试也未必有用。非密码学 PRNG 同样能生成分布均匀、相邻值不重复的数据。它的问题不是“看起来不随机”,而是内部状态能够被推算。 Coinkite 的热修复增加了构建期 RNG 符号检查。如果错误实现再次进入固件,构建会直接失败。官方技术复盘也承认,过去的检查确认了预期 TRNG 存在,却没有核实钱包生成路径最终解析到了哪个实现。 开源仍然有用。这次能够迅速定位问题、复核历史提交,靠的正是公开代码。但“任何人都能审”不等于“已经有人把每条安全路径审完”。对硬件钱包来说,可复现构建只是起点,涉及种子、签名和备份的调用链还需要单独做端到端验证。

多签能降低风险,但要看密钥怎么来的 在 2-of-3 多签中,攻击者恢复一把弱私钥还不能转走资金。他仍然需要第二把签名密钥。如果其余密钥由不同厂商、不同代码库和独立的随机源生成,多签可以挡住单一设备厂商的系统性缺陷。 但把三台受影响的 Coldcard 组合成多签,并不会自动解决问题。只要攻击者能恢复达到签名门限的弱密钥,资金仍然可以被转走。Block 的报告说得很直接:多签中必须有足够数量的安全设备组成签名门限。 对普通用户而言,多签也不是越复杂越好。描述符、派生路径、设备指纹或备份缺失,都可能让恢复失败。如果没有做过完整恢复演练,只是照着教程把几台设备拼在一起,操作风险未必比单签低。

现在应该怎么迁移 如果你的种子是在上表所列固件中生成,而且当时没有加入足够的独立骰子熵,也没有使用强且唯一的 BIP-39 passphrase,应把它视为有风险的旧种子。 先从 Coldcard 官方下载页取得对应机型和发布分支的修复固件,在设备屏幕上确认版本。随后生成一组全新助记词,抄写并核对备份、钱包指纹和收款地址。 不要一上来就转走全部余额。先发送一笔小额,在新钱包中确认到账,重新核对指纹和地址,再迁移剩余资金。全部余额确认到账前,旧备份先留着;迁移完成后,不要再使用旧地址收款。 Coinkite 对骰子熵给出了一个例外:如果创建种子时通过 Coldcard 的 “Add Dice Rolls” 功能输入了至少 50 次公平、独立、全程私密的六面骰结果,骰子本身已贡献至少 128 位熵;99 次及以上约为 256 位。如果记不清次数,或者掷骰结果曾被拍照、记录在联网设备上,就不要依赖这个例外。 BIP-39 passphrase 也能增加一道独立秘密,但短词、名言、常见变形和重复使用的密码仍可能被猜中。设备 PIN 不是 BIP-39 passphrase。即使 passphrase 很强,Coinkite 仍建议更换种子,因为旧助记词本身没有被修复。 迁移期间尤其要提防假公告、假客服和所谓“种子安全检测”网页。任何要求你在网页、聊天窗口或远程协助软件中输入助记词的人,都不可信。

这次事故留下的教训 Coldcard 的空气隔离、可复现构建和物理防护依然有价值,只是它们保护不了生成阶段已经出现的弱私钥。硬件钱包不是一个单独的保险箱,而是一整套过程:随机数生成、固件构建、私钥保存、签名、备份和恢复,少一个环节都可能出事。 用户不可能亲自审完硬件钱包的每一行代码,但可以减少单点风险。大额资产不要永远压在同一个厂商和同一种种子生成方式上;记录助记词的生成设备、固件版本和日期;定期查看厂商安全公告;碰到种子级漏洞时,不要以为升级固件就结束了。 这次真正需要更换的是密钥。只要旧种子还在控制资金,风险就还在。

参考资料 官方公司与固件资料

  • Coldcard 官方网站

  • Coinkite 公司官网

  • Coldcard / Coinkite 官方安全公告

  • Coinkite 官方技术复盘

  • Coldcard 官方固件源码与安全提示

  • Coldcard 官方固件变更记录

  • Coldcard 官方固件下载页

独立技术与标准资料

  • Block Engineering:Predictable RNG Fallback and 32-Bit Reseed in COLDCARD Firmware

  • Bitcoin BIPs:BIP-39 助记词规范

  • Coldcard 2021 年引入 libNgU 的代码提交

链上追踪与新闻核验

  • Galaxy Research:第三轮追踪及三轮合计数据

  • CoinDesk:三轮清扫扩大至 4,585 个地址、约 1,367 BTC

  • The Hacker News:漏洞路径、影响版本与 Galaxy 数据更新