Coldcard 的存在意義,就是讓私鑰永遠不必碰網路。加拿大創業家 Jonathan Goodman 照著這套規則做到極致:存放私鑰的 Coldcard 從未連過網,鎖進銀行保險箱;種子助記詞另外放進第二個保險箱,從沒讓任何人看過。但 7 月 29 日,他的錢包仍被一掃而空,損失 18.25 枚比特幣,以當時幣價計超過 117 萬美元。「也許最難受的是,我做對了所有事。」他 8 月 1 日在 X 上寫道。

Goodman 不是唯一一個。研究機構 Galaxy Research 表示,高度信心認為約有 1,596 枚比特幣、價值逾 1 億美元,從約 7,300 個地址在連串攻擊中被竊走;該機構研究主管 Alex Thorn 於 8 月 4 日估計,至少 15 組不同攻擊者利用了同一個漏洞,而且沒有任何一組需要實際碰觸裝置。

問題不在硬體,在種子怎麼被生出來

Block 的調查指出,這起事件的關鍵不是 Coldcard 裝置本身被入侵,而是保護資金的種子助記詞在生成階段就出了錯。比特幣錢包的隨機性(entropy)決定了種子有多難被猜中,每多一位元,可能的組合就翻一倍。Coldcard 原本應從裝置內建的硬體亂數產生器取得隨機性,卻因組態錯誤改用較簡單的軟體產生器,這套軟體依賴裝置資訊與時間戳,並非完全隨機、可被縮小範圍甚至重現。

Coldcard 種子生成漏洞內幕:鎖進保險箱也擋不住的比特幣竊案

受影響程度並不一致。Mk2 與 Mk3 裝置在這個流程中完全沒有取得安全隨機性;Mk4、Q 與 Mk5 雖有取得一部分,軟體卻只保留其中一小段。Coinkite 估計,這些較新裝置實際只產出 72 位元隨機性,遠低於設計目標的 128 位元,等於把種子的可能組合縮減到原本的 2 的 56 次方分之一以下。

藏了四年的錯誤,來自韌體 4.0.0

這個缺陷是 2021 年 3 月 17 日隨韌體 4.0.0 一起進入 Coldcard 的,Coinkite 當時的版本說明寫著「All New Code, Same Great Features」,並在致謝名單感謝一個名為「switck」的帳號提供新的原始碼函式庫。比特幣開發者 James O'Beirne 在審計中比對了 58 處以「switck」帳號發布的程式碼變更,發現這些變更帶有 Coinkite 共同創辦人 Peter Gray 以本名發布時所使用的同一組密碼學簽名,等於指認 switck 就是 Gray 本人。switck 開發的 libngu 程式庫被整合進使用者裝置的 Coldcard 韌體,其中一項工作正是協助產生建立錢包所需的隨機性。

O'Beirne 說他今年 5 月審計時就對這套流程提出質疑,向 Coinkite 反映可能存在缺陷,得到的回覆是「如果真有問題,大概早就被發現了」。Coinkite 事後表示,公司自己做的 AI 輔助審查在事發前也沒抓出這個錯誤;漏洞曝光後再用多個主流 AI 模型測試,同樣沒能揪出問題。

Coinkite 已對所有受影響型號與發行軌道發布修正韌體,但修正只對「未來」生成的種子有效,無法補救已經用有缺陷軟體產生出來的舊種子。受影響使用者必須安裝修正韌體、重新生成新的種子,再把比特幣轉移到新地址——Goodman 這類把私鑰與助記詞分開鎖進不同保險箱的使用者,防的是實體層的竊取,卻擋不住種子在誕生那一刻就已經不夠隨機。