你看到冷錢包顯示一組沒有規則的單字,可能會以為它很安全。可是這組單字從哪裡來,才決定別人有沒有機會猜中。
這次出問題的是Coldcard,一種保管加密貨幣鑰匙的硬體錢包。製造它的公司Coinkite在2026年7月公布安全公告。
部分裝置一直做出看似正常、其實比較好猜的數字。裝置沒有被打開,裡面也沒有跑進惡意程式。
看似正常的單字,怎麼變成錢包鑰匙?
設定新錢包時,裝置先做出一組「種子」。這是產生私鑰的起點,裝置會從它算出必須保密的數字。誰拿到私鑰,誰就能動用錢包裡的資產。
裝置會用「亂數」做種子,也就是別人事先猜不到的數字。可是數字外表很亂,來源仍可能只有少數幾種。
如果起點種類少,攻擊者就能叫電腦一個一個試。後來再把數字打散,也不會增加新的起點。
寫成0的開關,怎麼反而打開另一條路?
工程師做出裝置程式時,會用「建置旗標」選擇功能。它像程式裡的開關。這次出錯的開關名為MICROPY_HW_ENABLE_RNG。
Coldcard把這個開關設成0,表示不使用那條程式。可是另一套程式只查看名稱在不在,沒有查看數值。名稱還在,它便誤以為功能已經打開。
裝置於是轉用較容易預測的備用程式。但是它沒有停機,也沒有跳出警告。畫面仍顯示一組看似正常的單字。
128位元降到72位元,少了多少可能?
用來估計一個結果有多難猜的數字,叫做「熵」。熵用「位元」表示,一個位元只有0或1兩種選擇。
Coinkite的公告說,部分機型應有128位元。出錯後只剩大約72位元。少掉56位元,就像把可能答案連續對半刪掉56次。
Coinkite公告列出受影響機型與修正版。安裝新版「韌體」,也就是裝置裡的程式,只能保護新種子。以前做出的種子不會跟著變安全。
為什麼只看最後的數字會漏掉錯誤?
你把一疊牌洗開,牌面看起來沒有規則。可是如果別人早知道原本只有哪些牌,仍能縮小答案。
Coldcard的數字也是如此。較弱程式的輸出仍像亂數,所以一般外觀檢查可能通過。
美國國家標準與技術研究院負責訂出科技測量與安全標準。這個單位常被簡稱為NIST。
NIST的亂數文件要求檢查熵的來源,也要求做健康測試。所以檢查不能只盯著最後吐出的數字。
備用程式原本只在主要程式失效時接手。因為平常很少跑到這裡,測試也容易漏掉它。這次裝置卻一直走這條路,使用者仍看不到警告。
工程師怎麼讓下一次錯誤早點被看見?
第一,預定的亂數來源失效時,裝置應該停下來。畫面要說明錯誤,不能安靜換成較弱的來源。
第二,裝置開機時要確認自己正用哪個來源。檢查結果要留在紀錄裡,工程師之後才能追查。
第三,審查程式時也要核對建置旗標的數值。只看程式句子正不正確,仍可能漏掉開關設定。
三種檢查其實都在問同一件事。裝置實際走的路,和工程師以為的一樣嗎?
這起事件能說明什麼,又不能說明什麼?
這是Coldcard特定版本的程式錯誤。它不能證明每個硬體錢包都有同樣問題。
Coinkite表示調查還在繼續。之後公布的新資料,可能補上更多原因與影響。
網路上還有人把功勞算給AI工具,也就是會分析資料的電腦程式。有人宣稱它只花八分鐘就找到錯誤。本稿查不到能說明這八分鐘怎麼算的官方報告。
這起事件把問題指向數字的起點。結果看起來像亂數,只能說明外表沒有明顯規則。要知道它安全不安全,還要檢查來源有多少種可能。
這些資料是從哪裡來的
- Coldcard Security Advisory(Coinkite)
- NIST SP 800-90B:亂數使用的資訊來源建議(美國國家標準與技術研究院)