这场劫掠的效率令人咋舌。区块链分析公司Chainalysis发现,攻击者在前10分钟内就盗走了约3000万美元,他们优先清空了余额最大的钱包,其中一个钱包单笔损失就高达180万美元。另一波更早的攻击则在约25分钟内,从约500个单签钱包中席卷了594枚BTC(约3800万美元)。Galaxy Research、Chainalysis和Block的工程团队均独立将这两波攻击与同一个Coldcard固件漏洞关联起来。
Block的比特币工程和安全团队在工程师Clay Garrett的带领下,发现了攻击者的一个关键破绽。他们确认,攻击者使用了一家知名区块链数据服务商的付费账户,来高效地识别和查询那些使用存在漏洞的固件生成的地址。攻击者在链上留下的痕迹——异常快速且连续地扫描具有相同弱点的地址——引起了调查人员的警觉。Block掌握了确凿的证据,将攻击者的活动与该服务商的底层基础设施直接联系起来。Garrett形容这种关联具有“非同寻常的精确度,甚至精确到了账户级别”。这家数据分析服务实际上充当了攻击者的侦察工具,让他能快速绘制出脆弱钱包的地图,并优先攻击那些最富有的目标。
这个漏洞的根源可以追溯到2021年3月的一次固件提交(从Mk3固件版本4.0.1开始)。当时,为了迁移到比特币核心的libsecp256k1库,开发人员引入了一个构建配置宏错误。
简单来说,Coldcard设备本应使用其专用硬件随机数生成器(TRNG)来生成加密安全的种子。但生产板卡配置将MICROPY_HW_ENABLE_RNG这个宏设置为了0,因为Coldcard有自己的硬件RNG封装。关键问题出在名为libngu的密码学支持库上:它的条件检查指令是#ifndef MICROPY_HW_ENABLE_RNG,这行代码只检查该宏是否被定义了,而不管它的值是否为非零。因为宏被定义了(即便值被设置为0),libngu库便错误地认为硬件路径可用,并绑定到了MicroPython基于软件的rng_get()函数上。
这个错误导致设备在生成种子时,使用的不是硬件TRNG,而是MicroPython中一个确定性的Yasmarang软件随机数生成器。结果,有效熵值从预期的128比特以上骤降至大约32到40比特,这意味着可能的种子值只有约40亿个,对于现代硬件来说,暴力破解几乎不费吹灰之力。只有那些没有添加用户掷骰子或BIP 39密码短语的种子才会完全暴露。
Coinkite的CEO Rodolfo Novak(NVK)后来承认了这个错误:“我明确地将MICROPY_HW_ENABLE_RNG设置为零,以为我们哪个版本都不需要,但这并不是它实际的作用”。
| 受影响 | 未受影响(最初评估) |
|---|---|
| Coldcard Mk3,固件版本4.0.1至5.0.3 | Mk4, Q, Mk5(根据Coinkite初步分析) |
| 未使用用户手动掷骰子或BIP 39密码短语生成的种子 | 使用了用户手动掷骰子或密码短语生成的种子 |
Coinkite在后续分析中扩大了警示范围,将部分Mk4、Mk5和Q固件版本也包括在内,并发布了所有受影响型号的紧急固件更新。
这次事件动摇了自托管模式的核心承诺之一——即硬件钱包的安全元件能够保证密码学安全,不受软件缺陷影响。