返回部落格
安全

錢包的熵:Coldcard 事件揭示的隨機性教訓

一道由 128 個隨機位元組成的寬闊位元流,流經一顆被繞過的 RNG 晶片後,收窄成僅剩 40 個可預測位元的稀疏細流

2026 年 7 月 31 日 01:31 UTC,比特幣開始從一批錢包中流出,而這些錢包的主人什麼也沒有做。到了 01:56——二十五分鐘之後——約 594 BTC、價值約 3,800 萬美元的資產,已從大約 500 個單簽名錢包中被掃空。Galaxy Research 的後續分析與 Chainalysis 的相關報導,更將受影響範圍連結到分布於約 1,196 個地址、總計最多約 1,083 BTC 的資金。沒有人被釣魚,沒有人安裝惡意軟體,也沒有人批准過任何一筆交易。受害者唯一的共同點,是錢包的建立日期——因為真正失效的是錢包的熵:助記詞賴以生成的隨機性,在錢包誕生的第一秒便已定型。

這些錢包都是在 Coldcard 硬體裝置上生成的,而其背後的缺陷,已在正式出貨的韌體裡潛伏了五年多。本文將說明事情的經過、這類漏洞為何得以長期隱形、它對硬體錢包說明了什麼、又沒有說明什麼——以及面對任何錢包的隨機性時該問哪些問題,包括我們自己的錢包在內。

2021 年埋下的缺陷,在 2026 年被兌現

根據 Coinkite 的安全通告,這個缺陷始於 2021 年 3 月發布的 Coldcard 韌體 4.0.0。在受影響的裝置上,種子生成流程跳過了硬體亂數產生器,回退到以非機密晶片資料為種子的金鑰材料。一組 BIP39 助記詞本應編碼 128 位元的熵——即 2¹²⁸ 種可能的種子,一個任何攻擊者都無法窮舉的空間。而在受影響的 Mk3 裝置上生成的種子,實際只攜帶約 40 位元的有效熵。2⁴⁰ 大約是 1.1 兆個候選——對人類而言是天文數字,對機器而言卻完全可以窮舉。這就是 Coldcard 漏洞的一句話解釋:裝置悄悄停止使用自己的隨機性,而表面上沒有任何跡象洩露這一點。

有兩類人始終未被波及:以 BIP39 密語建立種子的人,以及用 50 次以上擲骰結果生成種子的人。Coinkite 披露了問題並發布了修正後的韌體——Mk4 與 Mk5 為 5.6.0,Q 為 1.5.0Q。而在這中間的五年裡,受影響的錢包運作得完美無瑕,看起來與安全的錢包毫無二致。執行這次掃空的人自始至終不需要接觸任何一位受害者:窮舉薄弱的金鑰空間、推導地址、與鏈上資料比對,然後在一個 25 分鐘的視窗內把一切轉走。

無聲的熵退化:為什麼這些種子看起來很隨機

令人不安之處在於,受影響的種子從頭到尾沒有任何看得出的異樣。一個由 40 位元可預測輸入建構出來的種子,產出的依然是十二個再普通不過的 BIP39 單詞,帶著有效的校驗碼。錢包接受它、推導地址、簽署交易;每一個畫面顯示的,都與一個強種子錢包所顯示的一模一樣。

統計檢定同樣無能為力:一個以可預測資料為種子的確定性產生器,輸出依然能通過隨機性測試——位元分布良好,只是取自一個小得災難性的可能序列集合。這個弱點藏在一項任何輸出都無法揭露的性質裡:除它之外,本來還可能生成多少個其他種子。這個答案,只有生成程式碼本身知道。

薄弱的種子看起來並不薄弱。2¹²⁸ 與 2⁴⁰ 的差別,只存在於產出那些單詞的程式碼裡。
種子生成分成兩條路徑:一條經硬體 CSPRNG、有 2 的 128 次方種可能,另一條是以非機密晶片資料為種子的無聲回退路徑、只有 2 的 40 次方種可能,而兩條路徑的終點都是十二個看似正常的單詞
兩條路徑的終點都是十二個普通的單詞。兩者的差別——2¹²⁸ 對 2⁴⁰ 種可能的種子——從不會出現在任何畫面上。

這正是這類漏洞得以存在多年的原因,也是 Coldcard 事件並非孤例的原因。Libbitcoin bx 工具的 Milk Sad、Trust Wallet 瀏覽器擴充功能的 MT19937 產生器、Cake Wallet、靚號地址工具 Profanity,以及早期瀏覽器錢包的 Randstorm,全都共用同一種形態:CSPRNG(密碼學安全亂數產生器)被一個可預測的來源無聲取代——沒有錯誤、沒有警告、沒有任何可見的差異,直到有人窮舉了那個金鑰空間。

令人不安的教訓

「硬體錢包」描述的是一種產品形態,而不是一種保證。7 月 31 日被掃空的錢包,都是在專為簽名打造的硬體上建立的——而失效的偏偏不是這一層。決定生死的,是一項在多年前就已定型的性質:錢包建立當天,種子是如何生成的。下游的一切——冷儲存、氣隙簽署、仔細驗證——保護的都是金鑰不被偷走。如果金鑰可以被重新生成出來,這一切都無濟於事。

同樣重要的是,Coinkite 及時披露了缺陷並發布了修正韌體。這不是一個關於粗心廠商的故事;這是一種整個行業在硬體與軟體上都反覆重蹈的失效模式。任何錢包——包括我們的在內——距離同一類漏洞都只差一次無聲回退。誠實的問題不是「哪家廠商能夠免疫?」,而是「這個錢包會以什麼方式失效?失效時會有人察覺嗎?」

關於任何錢包的隨機性,該問的五個問題

你不需要是密碼學家,也能提高標準。五個問題就足以把錢包做出有意義的區分:

  1. 熵的來源是什麼?種子應來自 CSPRNG,而不是時間戳、裝置識別碼,或任何外人有辦法重建的東西。
  2. 如果該來源失效會發生什麼?可接受的答案是硬性報錯、中止錢包建立。不可接受的答案是悄悄找替代品——無聲回退正是這類漏洞的標誌性特徵。
  3. 生成路徑是否開源、可驗證?薄弱的熵在輸出中無從察覺,因此程式碼審查是唯一能抓住它的地方。
  4. 錢包是否支援 BIP39 密語?密語加入了裝置產生器從未經手的秘密材料。這正是受影響 Coldcard 上使用密語的人分文未失的原因。
  5. 在多簽中,金鑰是否在彼此獨立的裝置上生成?獨立的裝置意味著獨立的隨機性:一個有缺陷的產生器危及的是一把金鑰,而不是整組門檻。

Ownbit 如何生成熵

這樣的問題,也理應得到關於我們自家產品的具體回答。Ownbit 的助記詞生成分為兩層。在應用層,generateMnemonicRandom(entropy, langIndex) 呼叫標準 bip39 函式庫的 generateMnemonic——預設 128 位元的熵,支援八種 BIP39 詞表:英文、簡體與繁體中文、日文、法文、義大利文、韓文與西班牙文。在函式庫層,bip39 的 randomBytes 取自 crypto.getRandomValues——即平台的 CSPRNG。

這裡真正要緊的,是當該來源不可用時會發生什麼:函式庫會直接拋出錯誤。它不會去查詢時鐘、晶片識別碼或任何次要來源——程式碼中不存在回退路徑。它的失效模式是在建立當下大聲報錯,而絕不是一個悄悄變弱的種子。這項性質——大聲失敗、絕不回退——正是 Coldcard 事件、Milk Sad 與 Randstorm 背後那個缺陷的完全反面:在那些案例裡,生成流程從一個可預測的來源默默繼續了下去。

我們不會宣稱這讓 Ownbit 對程式錯誤免疫;沒有任何誠實的廠商能這麼說。它從結構上移除的,是這一種失效形態:不存在任何一條程式路徑,能讓 Ownbit 錢包悄悄生成一個薄弱的種子。其餘的安全模型,都寫在我們的安全頁面上。

為什麼獨立生成的金鑰能挺過這類漏洞

7 月 31 日的掃空襲擊的是單簽名錢包:一個種子、一個簽名,資金就此消失——正是《你的助記詞是一個單點故障》的教科書案例。多簽改寫了這道算術。在 Ownbit 的多簽錢包中,每一把金鑰都是一組獨立的標準 BIP39 助記詞,在該參與者自己的裝置上生成。假設其中一台裝置恰好帶有這一類缺陷。在2-3 錢包中,窮舉了薄弱金鑰空間的攻擊者只握有一把金鑰——低於門檻。什麼也動不了。一把薄弱的金鑰變成一項維護工作——輪換它——而不是一場損失。

一個金鑰分別在三台獨立裝置上生成的 2-3 多簽:攻擊者破解了那把熵薄弱的金鑰,但只握有 3 把中的 1 把、低於門檻,資金因此安然無恙
一把薄弱的共同簽名金鑰,只讓攻擊者握有 3 把中的 1 把——低於門檻。資金分毫不動。

這份保護來自獨立性,而不是來自「多簽」這兩個字。三把在同一款有缺陷裝置上生成的共同簽名金鑰,會一起失守。而三把誕生於真正不同裝置的金鑰——你的日常手機、一支離線保存、以 QR 碼簽名的閒置手機冷錢包、一位家人的裝置——不共用任何產生器,因此也不共用任何漏洞。同樣的邏輯也解釋了 BIP39 密語為何救了受影響的 Coldcard 使用者:密語是裝置亂數產生器從未產出的秘密材料,因此僅僅窮舉 2⁴⁰ 個種子並不足以動用資金。

如果你持有受影響的 Coldcard

三個行動:

  1. 更新韌體。Coinkite 安全通告中列出的修正版本:Mk4 與 Mk5 為 5.6.0,Q 為 1.5.0Q。
  2. 把資金轉移到在修正韌體上新生成的種子。更新只保護未來的種子,無法強化既有的種子。一個生來只有約 40 位元的種子,永遠都可以被窮舉——請徹底棄用它,絕不再使用,也絕不再把資金轉回它的地址。
  3. 絕不要把現有的助記詞輸入任何聲稱能「檢查」它是否受影響的網站。把種子輸入任何連網的東西,正是殘餘資金被取走的途徑;每逢這類事件之後,「檢查工具」網站都是屢見不鮮的釣魚套路。

常見問題

什麼是錢包的熵?

錢包的熵,是用來建立助記詞的隨機性。一組標準的 12 字 BIP39 種子編碼了 128 位元的熵——即 2¹²⁸ 種可能的種子。如果產生器是可預測的,實際可能的種子數量便會急遽塌縮,攻擊者就能將其窮舉——無論種子事後被保存得多麼妥當。

我的 Coldcard 受影響嗎?

根據 Coinkite 的安全通告,缺陷始於 2021 年 3 月的韌體 4.0.0,受影響的 Mk3 種子只攜帶約 40 位元的有效熵,而非 128 位元。以 BIP39 密語建立、或由 50 次以上擲骰結果生成的種子不受威脅。若有疑慮,請更新到修正韌體——Mk4/Mk5 為 5.6.0,Q 為 1.5.0Q——並把資金轉移到新生成的種子。

薄弱的種子能靠肉眼看出來嗎?

不能。薄弱的種子照樣產出十二個正常的單詞與有效的校驗碼,統計測試也無法揭露可預測的來源。強度是生成程式碼的性質,而不是單詞本身的性質——這正是受影響的錢包五年多都無人察覺的原因。

多簽能防範薄弱的熵嗎?

從結構上說,能——前提是各把金鑰在彼此獨立的裝置上生成。一把薄弱的金鑰只給攻擊者一個簽名——低於 M-N 門檻——資金因此不會移動。在同一款有缺陷裝置上生成的金鑰可能一起失守,這正是獨立性與門檻同等重要的原因。

我該停用硬體錢包嗎?

不必。這次的教訓更為具體:「硬體錢包」這個詞本身不是保證——種子如何生成才是。請繼續使用維護良好的裝置、及時套用韌體更新、在支援的裝置上加上 BIP39 密語,並把大額資產放在多簽門檻之後,而不是任何單一種子之後。

如果這次事件讓你重新檢視自己的配置,結構性的解法是:不再讓任何單一種子獨自站在你的資金與攻擊者之間。Ownbit 的多簽錢包把 M-N 門檻架設在多把於獨立裝置上生成的金鑰之上,每一把都是標準的 BIP39 助記詞。每位新使用者都享有 7 天免費試用,而無論如何,你的金鑰始終屬於你。