U卡雷達

風險分析

Coldcard 錢包的熵缺陷與近 9000 萬美元損失:一次「絕對安全」硬體的深刻警示

分享文章

分享到

X微博FacebookLinkedInWhatsAppTelegram

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 的技術整理中交叉核對。

這些錢包有一個共同點:相關種子被認為由 Coinkite 的 Coldcard 硬體錢包生成。

很多受影響設備長期離線,助記詞也沒有被上傳到雲端。問題出在更早的階段。設備在建立錢包時,沒有按預期使用硬體真隨機數生成器。攻擊者不需要竊取助記詞,只要把可能生成的助記詞計算出來,再到區塊鏈上尋找對應地址即可。

硬體錢包最難防的事故,往往就是這一類。設備可以一直鎖在抽屜裡,私鑰也確實從未離開設備,但如果私鑰一開始就不夠隨機,後面的空氣隔離、安全晶片和防拆設計都派不上用場。

圖片占位
U卡雷達原創圖解:Coldcard 錢包的熵缺陷與近 9000 萬美元損失:一次「絕對安全」硬體的深刻警示

資料與結論邊界

一手核驗:COLDCARD Mk3 Seed Generation Warning;Version History;BIP-0039: Mnemonic code for generating deterministic keys。

本文關於 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 校驗位的作用也只是檢查格式,它不會增加助記詞的實際熵。

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。所謂「設備從未聯網」並不能排除這種攻擊,因為計算候選私鑰的過程本來就可以離線進行。

長期沒動過的幣也不會因此安全。弱種子的風險不會自然過期。隨著研究公開、硬體計算成本下降,原本不划算的搜尋可能變得有利可圖。長期休眠、餘額較高的地址反而更適合攻擊者優先處理。

鏈上的 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 資料更新

資料來源與核驗日期

以下為支撐本文重要事實、監管狀態或服務狀態的可存取資料;適用範圍以各條說明為準。

本頁核驗: 2026年8月3日
  1. COLDCARD Mk3 Seed Generation Warning

    官方來源發布: 2026年7月30日存取: 2026年8月3日

    适用地区:受影响的 COLDCARD 用户|用于核验:低熵缺陷、受影响机型、修复版本和迁移建议;页面于 2026-08-01 更新。
  2. Version History

    官方來源存取: 2026年8月3日

    适用地区:COLDCARD 固件用户|用于核验:各产品线官方固件版本与安全更新记录。
  3. BIP-0039: Mnemonic code for generating deterministic keys

    官方來源存取: 2026年8月3日

    适用地区:采用 BIP-39 的钱包|用于核验:助记词初始熵、校验位和词数规范。