我看到 COLDCARD 弱亂數事件時,最毛的不是某個錢包被偷,而是那些 seed phrase 外表完全正常。你可以把紙抄得很仔細、鎖進保險箱,甚至從來沒有連網,但如果它出生時就不夠隨機,後面所有小心翼翼都只是在保護一把別人可能猜得到的鑰匙。這種風險真的很反直覺。
硬體錢包離線保存私鑰,通常比把私鑰放在連網電腦安全。但這個前提是私鑰一開始真的夠隨機。如果產生錢包種子的亂數有問題,裝置後來再怎麼離線也無法補救。
部分 COLDCARD 韌體的亂數流程出現缺陷,使某些 seed 的可能範圍比預期小。攻擊者因此有機會在自己的電腦上找出可能的錢包,不用碰到受害者的裝置,也不用偷走寫在紙上的助記詞。
更新韌體只能避免未來繼續產生有問題的 seed,已經建立的 seed 不會突然變得更隨機。受影響使用者必須用安全方式建立全新錢包,再把資產轉走。這起事件提醒我們,「冷」只代表沒有連網,不代表整個金鑰產生流程一定沒有問題。
亂數差一點,安全性不是只差一點
錢包 seed 的安全來自可能性多到無法全部猜完。假設應有 256 bits 的隨機性,攻擊者幾乎不可能窮舉;如果程式錯誤讓真正變化只剩很小的範圍,原本天文數字般的搜尋空間就可能縮到一般硬體也有機會處理。
而且弱 seed 外觀看起來和正常 seed 完全一樣,都是一串普通單字。把同一組助記詞匯入另一台正常硬體錢包也沒用,因為問題在它出生時就已存在,不在目前存放的位置。
硬體錢包仍然需要軟體工程
大家買硬體錢包,是希望把安全交給專用裝置。但裝置裡仍有 firmware、亂數來源、fallback 和錯誤處理。某個硬體來源失效時,程式該停止產生 seed,還是悄悄換成較弱的備援?這種看似底層的決定,最後會直接影響資產安全。
這起事件不是證明硬體錢包都不可信,而是提醒「離線」只是安全設計中的一層。韌體更新、公開稽核、多簽和額外 passphrase 各自降低不同風險,沒有哪一個標籤可以一次包辦全部。
PRNG 和 CSPRNG 差在哪裡?
一般 PRNG 只要產生的數字看起來分散,就能拿來做遊戲或模擬;密碼學使用的 CSPRNG 還要求外部的人無法從已知輸出推回內部狀態,也很難預測下一個結果。錢包 seed 屬於後者,因為「看起來亂」遠遠不夠。
有些裝置會混合多個亂數來源,甚至讓使用者加入擲骰子結果。這能減少單一來源故障的風險,但流程也必須正確:加入的資料怎麼混合、使用者輸入不足時怎麼辦、硬體 RNG 故障時是否直接停止,都需要清楚設計。
額外 passphrase 也常被提到。它可以替 seed 再加一層秘密,但前提是內容夠強、備份方式可靠。若只是加一個常見單字,或最後自己忘記,它就不會變成理想中的保護。安全措施永遠伴隨操作成本,這點在自託管錢包尤其明顯。
遇到這種公告,最重要的是先確認型號、韌體版本和 seed 建立時間,不要只看到品牌就慌著操作。遷移資產本身也有風險,應該依廠商說明建立新 seed、先做小額測試,再處理主要餘額;從不可信的網頁下載「修復工具」反而可能造成第二次損失。
這起事件也很適合提醒軟體團隊:安全失敗應該 fail closed。偵測不到足夠 entropy 時,裝置寧可拒絕建立錢包,也不該為了流程順暢偷偷降級。錯誤畫面難看幾分鐘,總比產生一把外表正常、實際可猜的鑰匙好。