由工程師 Clay Garrett 帶領的 Block 比特幣工程與安全團隊發現,攻擊者使用了一個知名區塊鏈服務提供者的付費帳戶,來高效辨識並查詢弱勢錢包地址。攻擊者鏈上活動的模式——異常快速地、按順序清掃具有相同弱點的地址——引起了調查人員的警覺。Block 確認有追蹤證據直接將攻擊者的活動與該服務提供者的基礎設施連結起來
。
Block 的調查結果被 Garrett 形容為具有「非凡的精確度,精細到帳戶層級」。該分析服務有效地充當了偵查工具,讓攻擊者能快速繪製出哪些地址是在有漏洞的韌體上生成的,並優先攻擊餘額最豐富的目標
。
此錯誤最初於 2021 年 3 月的一次韌體提交(始於 Mk3 韌體版本 4.0.1)中被引入,當時正在進行向比特幣核心的 libsecp256k1 函式庫的遷移工作。一個構建配置巨集錯誤導致韌體略過了裝置專屬的 STM32 硬體隨機數生成器(TRNG),並回退到 MicroPython 的確定性 Yasmarang 軟體隨機數生成器
。
生產板配置將 MICROPY_HW_ENABLE_RNG 設為零,因為 Coldcard 有自己獨立的硬體隨機數生成器封裝。然而,libngu 函式庫未能正確呼叫該封裝:其檢查條件(#ifndef MICROPY_HW_ENABLE_RNG。由於該巨集已被定義(值為零),libngu 便默默地認定硬體路徑可用,並綁定了 MicroPython 基於軟體的
rng_get() 函式。
這導致有效熵值降至大約 32 至 40 位元(原本預期為 128 位元以上),意味著只有約 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 助記詞密碼的情況下生成的種子詞 | 使用用戶提供的骰子點數或助記詞密碼生成的種子詞 |