完整事故报告 · 16 个信源 · Anzen Lab

四行代码。
1,596+ 枚 BTC 灰飞烟灭。

2021 年 3 月,某版 COLDCARD 固件停止向硬件芯片请求随机数,转由普通软件生成。此事长达五年无人发现。直到 2026 年 7 月,攻击者算出了结果,并开始清空钱包。

该设置付出的代价
5 年
漏洞隐藏在完全公开的代码中,无人察觉1
1,596+ BTC
确认从大约 7,300 个地址中被盗,且数字仍在上升7
41 分钟
单笔最大清空金额:1,083 枚 BTC,当时约合 7000 万美元9
1 万亿分之一
攻击者在 Mk3 上必须攻破的概率。设计要求是 78 位数字分之一1
故障根源

一个形同虚设的 安全检查

01

钱包所有的防护,都押在一个猜不到的数字上

硬件钱包有几项工作。它向你展示你实际签署的内容,而不是让你去信任受感染电脑的屏幕,并将你的密钥保留在专为防拆解而设计的芯片中。所有这些防御都假设你密钥所源自的数字是不可能被猜到的。如果能被猜到,攻击者就永远不必突破其中任何一道防线。 24 个单词的助记词所抽取自的密码池,其大小大约相当于可观测宇宙中每千个原子对应一个数字。这样大小的密码池是无法被穷举的。这就是整个安全模型。

技术细节

12 个单词包含 128 位熵,24 个单词包含 256 位熵,外加基于该熵的 SHA-256 校验和。BIP-39 将其扩展为 BIP-32 主密钥。

技术细节

12 个单词包含 128 位熵,24 个单词包含 256 位熵,外加基于该熵的 SHA-256 校验和。BIP-39 将其扩展为 BIP-32 主密钥。

02

COLDCARD 不再从那个数字池里抽数

2021 年的一次固件更新悄然停止了钱包向专用随机数芯片索取该数字的行为,转而让普通软件计算出一个替代数字。对照来看,整个事件的本质如下:

这并不是安全性能打了三折。每个比特都会使工作量翻倍,因此减少 88 个比特意味着将工作量缩减了 2⁸⁸ 倍。对个人而言万亿是个大数字,但对于租用高性能机器来处理这件事情的人来说只是个小数字。

技术细节

种子生成过程从 ckcc.rng_bytes() 转移到了 ngu.random.bytes()。Coinkite 估计 Mk3 上剩余的搜索空间约为 40 位,在 Mk4/Mk5/Q 上约为 72 位,而目标是 128 位。Block 的独立分析得出了相同数量级(低于 2⁴⁰·⁷ 和低于 2⁷³·³),并发现了剩余空间更小的更严苛条件。2

技术细节

种子生成过程从 ckcc.rng_bytes() 转移到了 ngu.random.bytes()。Coinkite 估计 Mk3 上剩余的搜索空间约为 40 位,在 Mk4/Mk5/Q 上约为 72 位,而目标是 128 位。Block 的独立分析得出了相同数量级(低于 2⁴⁰·⁷ 和低于 2⁷³·³),并发现了剩余空间更小的更严苛条件。2

24 个单词理论上应从中选取的范围
115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936
COLDCARD 实际选取的范围
1,099,511,627,776
03

因为软件无法做到真正的随机

想想是什么让抛硬币变得不可预测。投掷的力量、重力、空调吹出的气流、地面的微小震动。数十种你能说出的影响和数十种你无法说出的影响。没有人能够计算出轨迹,因此没有人能预言结果。 软件的工作方式则不同。它对少数几个初始值运行固定的公式,并产生固定的答案。在这里,这些值是芯片的序列号以及设备开机运行了多长时间。了解了配方和原料的攻击者会重新计算出输出结果,而不是去猜测它。

技术细节

在硬件 RNG 被禁用后,rng_get() 链接到了 MicroPython 的 Yasmarang PRNG,该 PRNG 从非机密状态(UID、SysTick、RTC)获取种子,并且在此之后没有收集新的熵,因此候选密码可以在离线状态下被枚举。Coinkite 认为,与 50 次或更多公正、私密的投掷相混合的种子不会因这一问题本身而面临风险:50 × log₂6 ≈ 129 位。3

技术细节

在硬件 RNG 被禁用后,rng_get() 链接到了 MicroPython 的 Yasmarang PRNG,该 PRNG 从非机密状态(UID、SysTick、RTC)获取种子,并且在此之后没有收集新的熵,因此候选密码可以在离线状态下被枚举。Coinkite 认为,与 50 次或更多公正、私密的投掷相混合的种子不会因这一问题本身而面临风险:50 × log₂6 ≈ 129 位。3

04

本应拦截此事的检查机制问错了问题

构建版本中曾有一个保护机制,专门用于阻止在没有硬件生成器的情况下发布固件。它检查的是是否存在某个设置,而不是该设置是否已开启。 该设置存在,并且它是关闭的。保护机制保持沉默,构建未报告任何错误,固件随之发布。

技术细节

#ifndef 仅测试是否已定义。主板配置将 MICROPY_HW_ENABLE_RNG 定义为 0(既已定义又被禁用),因此 #error 从未触发,链接器将 rng_get() 解析为了软件备用方案。3

技术细节

#ifndef 仅测试是否已定义。主板配置将 MICROPY_HW_ENABLE_RNG 定义为 0(既已定义又被禁用),因此 #error 从未触发,链接器将 rng_get() 解析为了软件备用方案。3

摘自源码的缺陷代码。3

05

这一切在五年里看起来毫无破绽

脆弱的恢复助记词看起来和强密码完全一样。二十四个普通的词,正确的校验和,一个表现正常的设备。屏幕上没有任何警告,构建过程中也没有任何错误。 源代码自始至终都是公开的。但要阅读它,仍然需要有人去打开那个特定的文件。

技术细节

弱 PRNG 的输出长度、非零性和非重复性检查均可通过,因此常规的冒烟测试也无法发现它。

技术细节

弱 PRNG 的输出长度、非零性和非重复性检查均可通过,因此常规的冒烟测试也无法发现它。

06

随后有人做了一道数学题

他们从未接触过任何一台实际设备。他们在自己的机器上生成了可能的助记词,计算出每一组会生成哪些比特币地址,并将这些地址与公开区块链进行核对。所有持有余额的地址都被清空了。 一个自 2022 年起就一直断电闲置在抽屉里的钱包,其暴露风险与日常使用的钱包完全相同。

技术细节

候选密钥通过 BIP-39/BIP-32 在离线状态下衍生;只有最后的余额查询才会连接网络,因此受害者在事前不会收到任何异常信号。3

技术细节

候选密钥通过 BIP-39/BIP-32 在离线状态下衍生;只有最后的余额查询才会连接网络,因此受害者在事前不会收到任何异常信号。3

本页并非幸灾乐祸。

Coinkite 披露了该漏洞,发布了技术报告并推送了修复程序。外部研究人员能够还原发生的事情,是因为 COLDCARD 是开源的。

关于估算数据的一个提醒:它们描述的是在当前假设下攻击者面临的破解难度,而不是倒计时秒表。没有人能告诉你破解某个特定钱包具体需要多长时间。2

如果您持有 COLDCARD

在进行任何操作前请先阅读

你需要做什么取决于你最初创建恢复助记词时使用的是哪款设备,而不是你今天手里拿的是哪款。

假设这种情况仍在发生。这些助记词在 2021 年变得可预测,现在该方法已经公开,因此任何人都可以运行相同的搜索。没有任何补丁能从外部封堵这个漏洞,攻击者也没有理由停手。如果你受到了影响,最稳妥的假设就是:时间是你和他们之间唯一的缓冲。

Mk2 和 Mk3:立即转移你的币

受影响的固件版本范围为 4.0.1 至 4.1.9。4.2.0 版本修复了新助记词的生成方式,但任何更新都无法为已经存在的助记词补足随机性。请在信任的设备上创建一个新钱包,并将资金转移过去。1

Mk4 和 Mk5:检查固件版本

如果助记词是在低于 5.6.0(或 Edge 构建版本的 6.6.0X)的固件上创建的,请更新固件,在更新后的固件上创建一个全新的钱包,然后转移你的资金。单纯更新固件并不能修复旧的助记词。1

Q:同样,分水岭是 1.5.0Q

请更新至 1.5.0Q 或更高版本(Edge 构建版为 6.6.0QX),创建一个新钱包,抄写并测试备份,发送一笔小额测试交易,然后再转移其余资金。1

更新 COLDCARD 固件能修复我现有的恢复秘钥吗?

我该如何查明我的 COLDCARD 恢复秘钥是在哪个固件版本下创建的?

如何检查我的地址是否受此事件影响?

掷骰子或设置密码短语(passphrase)能保护 COLDCARD 的助记词吗?

Coinkite 的公告是否涵盖了所有受影响的 COLDCARD?

Coinkite 官方技术公告迁移到你已经信任的设备上的全新钱包,在全面迁移之前先发送一笔小型测试交易。保留公开证据(交易 ID、地址、时间戳),永远不要保留密钥。任何声称能帮你找回资金的人都是正在进行的第二次盗窃,而且根本不存在这种服务。购买什么新硬件可以等你的币安全后再说。
如果您使用的是 OneKey

所有 OneKey 设备均未受影响

在我们发布过的任何一款型号中都没有。我们的固件不包含任何 libngu、Coinkite、COLDCARD 或 CKCC 依赖项,因此导致失败的代码路径根本不存在,你可以在我们的代码库中亲自核实这一点。在我们当前的硬件上,密钥来自经认证的安全芯片内部真正的随机生成器,绝不来自主处理器上的软件。正是这种替换导致了此次故障。

均未受影响
OneKey Pro
OneKey Classic 1S
OneKey Classic 1S Pure
OneKey Touch
OneKey Classic
OneKey Mini

我们对此也没有盲目信任。当消息传出时,Anzen Lab 对我们的随机性进行了端到端追踪(它来自哪里、什么调用了它、以及决定哪个版本能到达你设备的构建设置),并发布了他们检查的具体文件。12

阅读 Anzen Lab 的重新核查报告
你真正想问的问题

这会发生在 OneKey 身上吗?

此次故障需要同时满足三个独立的条件。在 OneKey 上这三个条件全都不成立,你可以亲自检查所有这三点。

随机数的来源

那么 OneKey 的 随机数来自哪里?

在 EAL 6+ 认证芯片内部生成

您的密钥在专用的防篡改芯片中生成并存储,而非运行其他业务的通用处理器。EAL 6+ 是支付卡和身份卡所采用的安全保障级别。

具备自检机制的随机数

该芯片利用真实的物理噪声生成随机数,并持续测试自身的输出。如果随机性开始出现异常,芯片会注意到这一点,而不是默默地继续运行。

我们对自身产品进行了重新核查

在 COLDCARD 的消息传出后,Anzen Lab 对我们自己的随机性进行了全流程追踪(它来自哪里、实际调用了什么、以及决定哪个版本最终到达你设备的构建设置),并发布了他们查看的确切文件。11

OneKey Pro's EAL 6+ certified secure element
EAL 6+ Badge
每笔交易, 都由 EAL 6+ 安全芯片保护
随机数生成位置
安全芯片
THD89
安全保证等级
EAL 6+ 认证
熵源
硬件 TRNG,具备自检功能
输出认证标准
BSI AIS 20 / 31
事件后重新审计
Anzen Lab,已发布源码
OneKey 如何构建,由谁验证

每一台 OneKey 都要过四重检查, 而每一重都不盲目信任其他三重

任何单一检查都可能有遗漏,关键在于四重检查同时遗漏同一问题的概率微乎其微——而 COLDCARD 的教训恰恰是,只要一个没人复核的构建设置就足以酿成事故。

01

真正可验证的开源

我们的固件和应用程序在 GitHub 上公开,并且我们的构建是可复现的,这意味着你可以亲自重新构建代码,并确认它产生的就是运行在你设备上的精确软件。这就是能够捕获“代码正确、版本错误”问题的步骤。

GitHub 上的 OneKey
02
SlowMist

外部机构的有据审计

安全公司 SlowMist 对我们进行了审计并发布了报告。独立的评估涵盖了 OneKey Pro、Classic 1S 以及我们的 SDK。我们的安全实践通过了 ISO/IEC 27001 认证,Pro 和 Classic 1S 产品线通过了欧盟指定机构的 EN 18031 认证。所有内容均已公开,绝非自我评估。13

阅读慢雾审计汇总
03

专职寻找自家产品漏洞的团队

Anzen Lab 是我们由硬件、固件和应用安全工程师组成的内部安全团队,并与轮换的外部研究人员合作。他们的工作是在任何产品发布之前破解硬件钱包,包括我们自己的。当这个消息爆发时,他们重新审查了 OneKey 自身的随机性端到端流程,并精确发布了他们检查的文件。11

阅读 Anzen Lab 分析报告
04

我们付费邀请外部人员寻找我们的错误

任何人都可以通过我们在 BugRap 上的公开项目或直接发送邮件至 [email protected] 私下向我们报告漏洞,并获得漏洞赏金。严重程度决定了基于 CVSS 评分的赏金数额。核心目的在于让漏洞披露比公开出售更有价值。15

BugRap 上的 OneKey
entro.tools · 由我们的创始人打造

测试你手里的钱包

entro.tools 是一个免费的开源工具,它读取硬件钱包实际输出的随机数,并在你的浏览器中、通过 USB 运行标准的统计健康测试,无需上传任何内容,也无需更新固件。

它不仅适用于 Trezor 和 KeepKey,也适用于我们自己的设备,因此你可以进行横向对比,而不必盲目相信任何单一厂商的说辞。
运行方式
在浏览器中通过 WebUSB 运行
执行测试
FIPS 140-2, NIST SP 800-22 / 90B
您的数据
绝不会离开页面
固件更新
无需更新
熵检查

通过 WebUSB(桌面版 Chrome 或 Edge)在本地运行 FIPS 140-2、NIST SP 800-22 和 SP 800-90B 健康测试。设备请求导出熵或刚生成的一批随机数,绝不会导出您的恢复短语。16

Maurer's universal 统计检测需要至少 387,840 bit,数据不足时报告会明确标记为 skipped,而不是悄悄略过。16

哪些钱包支持检查

外部人员是否能够读取设备原始随机数。这是一个狭窄的维度。请参阅其下方的说明。

OneKey
可自行验证
所有型号,官方原厂固件16
Trezor
可自行验证
所有型号,共享线缆协议16
KeepKey
可自行验证
Trezor 线缆协议系列16
Ledger
依赖厂商信誉
封闭式安全芯片;无任何主机指令可暴露原始随机数16
BitBox02
依赖厂商信誉
厂商已从协议中移除随机数请求功能16
Blockstream Jade
依赖厂商信誉
主机仅能注入 entropy;无法将源数据读回16
COLDCARD
依赖厂商信誉
具备 USB 接口,但其协议中完全不包含 entropy 相关指令16
Keystone
依赖厂商信誉
按设计采用隔离机制;USB 仅传输设备信息和固件更新16
“无法测试”与“不安全”是不同的说法。封闭的安全芯片遵循其自身的认证路径。通过测试的结果只能证明今天没有表现出统计缺陷,它无法证明密码学上的不可预测性,也无法说明你创建钱包当天所使用的随机性。
仍有疑问

这件事给整个行业留下的思考

OneKey 是否受到 COLDCARD 熵值故障的影响?

COLDCARD 熵值故障会影响哪些硬件钱包?

我可以测试自己钱包的随机性吗?

如何判断一个硬件钱包是否值得信赖?

可以自行验证的安全, 而不是要求你盲目相信的安全。

开源且可复现,经过外部审计,由我们自己的实验室进行攻击测试,并在有人发现漏洞时提供赏金。这些就是这场争论所围绕的设备。

Cold Storage Weeks
购买任意设备即可获得最高 $50 的比特币,活动持续至 8月17日。

参考资料

以下来源检索于 2026 年 8 月 6 日。首先是 Coinkite 自身的公告和技术报告,其次是独立的源码级分析和链上核算。损失数字仍在向上修正:Galaxy Research 在 8 月 4 日确认了 1,596 枚 BTC,并估计疑似损失接近 2,055 枚 BTC。