7月30日,一场精心策划的攻击在41分钟内席卷了1196个比特币地址。攻击者总共盗走了1082.65 BTC,按当时的币价计算,损失高达7020万美元。Galaxy Research对此次链上资产的“扫荡”行动进行了路径测绘,并将事件与著名硬件钱包Coldcard(由加拿大公司Coinkite推出)的一个固件漏洞相关联。这也让不少安全/渗透/逆向领域的研究者们开始重新审视硬件钱包的底层实现。
问题的根源在于,2021年3月,Coldcard的一次固件集成出现错误,导致其种子生成流程错误地使用了一个确定性的软件伪随机数生成器(PRNG),而非本应调用的STM32芯片内置的硬件随机数生成器(RNG)。

Block分析指出,攻击者理论上无需物理接触设备,只要能充分确定或缩小设备唯一ID、定时器状态以及此前的RNG调用历史等关键信息的范围,就能在离线状态下重现候选的输出流。然后,攻击者可以通过生成派生地址,并与公开的区块链数据进行比对,来验证其生成的候选种子是否匹配。这听起来像是大海捞针,但如果随机数的熵值不够高,这个“大海”就会小得多。

7月31日,Coinkite迅速反应,为所有受影响的型号和发布渠道推送了紧急固件。然而,需要特别强调的是:此补丁并不能修复已经生成的、存在弱点的旧种子。 Coinkite敦促所有种子可能已暴露的用户,务必在打过补丁的固件上生成全新的种子,并立即将资产从旧地址转移到新的安全地址。
如果你只是简单地将旧种子恢复到更新后的固件或另一款钱包中,安全隐患依然存在。截至目前,尚没有公开报告声称已成功重建出某个特定受害者的种子,并与已被清空的地址完成匹配,但潜在的风险并未消除。
Block将问题代码追溯至Coldcard的生产配置。该配置将MICROPY_HW_ENABLE_RNG定义为0,因为Coinkite提供了自家的硬件RNG封装。问题在于,libngu库只检查此宏是否存在,而不关心其是否启用,导致构建过程直接跳转到了MicroPython的Yasmarang备用方案。麻烦的是,该备用方案仅由芯片唯一ID和定时器寄存器初始化,之后便不再收集任何新的熵。
关于有效熵的损失,Coinkite估计:Mk3型设备仅剩约40位;Mk4、Mk5和Q型设备约为72位。相比之下,一个标准的12词BIP-39种子理论熵值应为128位。Block虽然给出了熵值上限的警告,但并未公布具体的暴力破解成本基准。

对于较新型号的设备,虽然重新播种的机制会增加攻击者需要尝试的候选数量,但Block认为,实际的攻击成本主要取决于可利用的设备唯一ID信息、启动时序、先前的RNG调用记录以及派生计算的开销。
是否受影响,取决于创建种子那一刻运行的固件版本,而非设备当前安装的版本。来看看具体的受影响范围:
- Mk2 & Mk3: Coinkite将Mk3的受影响版本定格在4.0.1至4.1.9(问题在4.2.0中修复),未提及Mk2。而Block的研究则将Mk2和Mk3的4.0.0至4.1.9版本都划入了受影响范围。
- Mk4 & Mk5: 5.6.0之前发布的所有版本均受影响。
- Q: 1.5.0Q之前的所有版本均受影响。
- Edge构建版本: Mk4/Mk5在6.6.0X之前的版本,以及Q在6.6.0QX之前的版本。
那么,用户该如何自救呢?Coinkite指出,如果你的种子是通过至少50次公平、独立且私密的骰子掷币结果生成的,那么仅凭此漏洞不会处于风险之中。如果无法百分之百确定掷骰子的次数或私密性,Coinkite的建议简单直接:迁移,立刻创建新种子。虽然设置一个强度够高且唯一的BIP-39口令可以创建一个仅靠种子词无法访问的独立钱包,但官方仍然建议更换种子本身,这是最彻底的办法。多重签名方案只有在所需的签名者不全是来自受影响的设备时,才能提供缓冲。此外,同样由Coinkite推出的TAPSIGNER、OPENDIME和SATSCARD由于使用了不同的代码库,并不受此问题困扰。
关于攻击者的身份,目前依旧是迷。绘制了1196个地址扫荡链路的Galaxy表示,在过去30天内,他们没有发现其他具有相同“30 sat/vB、无找零”特征的比特币交易。不过,Galaxy也警告,这种链上模式只能用来识别操作者,尚不足以构成证明“盗窃行为”的铁证,因为这种扫荡方式“与币主自己选择转移资产时的交易表现,在技术上并无二致”。
这也并非近期发生的唯一一起随机数相关安全事件。在此次披露之前,Coinspect于7月初发布了“III Bloom”研究报告,揭示了旧版软件钱包中存在的另一个独立的弱PRNG漏洞。该漏洞与自5月以来从比特币、以太坊、Tron、Rootstock和Polygon等链上地址中累计盗走超过500万美元资金的系列案件有关。
参考来源:
Coldcard Hardware Wallet Flaw Linked to $70 Million Bitcoin Theft in 41 Minutes
|