完整事故報告 · 16 個資料來源 · Anzen Lab

四行代碼。
1,596+ 枚 BTC 消失。

2021 年 3 月,某個 COLDCARD 韌體版本停止向硬體晶片索取亂數,改由普通軟體計算亂數。這件事五年來都沒有人發現。直到 2026 年 7 月,攻擊者算出了規律,並開始清空錢包。

這次設定付出的代價
5 年
漏洞隱藏在完全公開的代碼中,無人察覺1
1,596+ BTC
確認從大約 7,300 個地址中被盜,且數字仍在上升7
41 分鐘
單筆最大掃蕩金額:1,083 BTC,當時約合 7,000 萬美元9
1 萬億分之 1
攻擊者在 Mk3 上必須克服的機率。原設計要求達到 78 位數分之一的機會1
問題出在哪裏

一個形同虛設的 安全檢查

01

錢包所有的防護,都押在一個猜不到的數字上

硬體錢包有幾項工作。它向你展示你實際簽署的內容,而不是讓你去信任受感染電腦的螢幕,並將你的金鑰保存在專門設計來防止被打開的晶片中。所有這些防禦都假設你的金鑰所產生的數字是不可能被猜到的。如果可以的話,攻擊者就永遠不必突破其中任何一道防線。 生成 24 個單字助記詞的來源大約包含可觀观测宇宙中每千個原子對應一個數字的數量。這樣大小的空間是無法被窮舉搜尋的。這就是整個安全模型。

技術詳情

12 個單詞承載 128 位熵,24 個單詞承載 256 位熵,外加由該熵的 SHA-256 計算出的校驗和。BIP-39 將結果擴展為 BIP-32 主密鑰。

技術詳情

12 個單詞承載 128 位熵,24 個單詞承載 256 位熵,外加由該熵的 SHA-256 計算出的校驗和。BIP-39 將結果擴展為 BIP-32 主密鑰。

02

COLDCARD 不再從那個數字池裡抽數

2021 年的一次固件更新悄然停止了錢包向其專用隨機性晶片索取該數字的行為,轉而讓普通軟件計算一個數字取而代之。對比來看,這就是整個事件的全部經過:

這不是削減三分之二的安全。每一個位元都會使工作量加倍,因此減少 88 個位元會以 2⁸⁸ 的倍數縮小工作量。對個人而言,一兆是一個很大的數字,但對租用高效能機器來處理這項工作的人來說,只是一個小數字。

技術詳情

種子生成從 ckcc.rng_bytes() 轉移到了 ngu.random.bytes()。Coinkite 估計 Mk3 上剩餘的搜尋空間約為 40 位元,Mk4/Mk5/Q 上約為 72 位元,而目標是 128 位元。Block 的獨立分析得出相同數量級(小於 2⁴⁰·⁷ 且小於 2⁷³·³),並發現了剩餘空間更小的極端條件。2

技術詳情

種子生成從 ckcc.rng_bytes() 轉移到了 ngu.random.bytes()。Coinkite 估計 Mk3 上剩餘的搜尋空間約為 40 位元,Mk4/Mk5/Q 上約為 72 位元,而目標是 128 位元。Block 的獨立分析得出相同數量級(小於 2⁴⁰·⁷ 且小於 2⁷³·³),並發現了剩餘空間更小的極端條件。2

24 個單詞本應從中抽取的密鑰空間
115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936
COLDCARD 實際抽取的密鑰空間
1,099,511,627,776
03

因為軟件無法做到真正的隨機

想想是什麼讓擲硬幣變得不可預測。投擲的力量、重力、冷氣機的氣流、地面的微幅震動。你可以說出名字的幾十種影響,以及你說不出名字的幾十種影響。沒有人能計算出軌跡,所以沒有人能預先叫出結果。 軟體的工作方式則不同。它在一小部分起始值上運行固定的公式,並產生固定的答案。在這裡,這些值是晶片的序號以及設備通電運作的時間。一個得知配方和原料的攻擊者會重新計算輸出,而不是去猜測它。

技術詳情

在硬體 RNG 被停用的情況下,rng_get() 連結到了 MicroPython 的 Yasmarang PRNG,並從非機密狀態(UID、SysTick、RTC)獲取種子,此後它沒有收集任何新的亂數,因此候選項目可以在離線狀態下被窮舉。Coinkite 認為,與 50 個或更多公平、私密的擲骰相混合的種子,不受此問題單獨威脅:50 × log₂6 ≈ 129 位元。3

技術詳情

在硬體 RNG 被停用的情況下,rng_get() 連結到了 MicroPython 的 Yasmarang PRNG,並從非機密狀態(UID、SysTick、RTC)獲取種子,此後它沒有收集任何新的亂數,因此候選項目可以在離線狀態下被窮舉。Coinkite 認為,與 50 個或更多公平、私密的擲骰相混合的種子,不受此問題單獨威脅:50 × log₂6 ≈ 129 位元。3

04

旨在阻止它的檢查提出了錯誤的問題

建置過程中本來有一個防護機制,專門用來阻止在沒有硬體產生器的情況下發布韌體。它檢查的是是否存在某個設定,而不是檢查該設定是否已開啟。 該設定存在,而且它是關閉的。防護機制保持靜默,建置過程回報沒有錯誤,於是韌體就發布了。

技術詳情

#ifndef 只檢查是否有定義。板卡設定將 MICROPY_HW_ENABLE_RNG 定義為 0,既已定義又被停用,因此 #error 從未觸發,連結器將 rng_get() 解析為軟體備用方案。3

技術詳情

#ifndef 只檢查是否有定義。板卡設定將 MICROPY_HW_ENABLE_RNG 定義為 0,既已定義又被停用,因此 #error 從未觸發,連結器將 rng_get() 解析為軟體備用方案。3

引自原始碼的缺陷內容。3

05

五年來一切看起來都正常

一個脆弱的恢復助記詞看起來和一個強健的完全一樣。二十四個普通的單字、正確的校驗和、一個運作正常的設備。螢幕上沒有任何警告,建置過程中也沒有任何錯誤。 原始碼一直都是公開的。但要讀懂它,仍然需要有人打開那個特定的檔案。

技術詳情

輸出長度、非零性和非重複性在脆弱的 PRNG 上都能通過,因此常規的健全性測試也無法檢測出問題。

技術詳情

輸出長度、非零性和非重複性在脆弱的 PRNG 上都能通過,因此常規的健全性測試也無法檢測出問題。

06

然後有人做了一下算術題

他們從未接觸過任何一台裝置。他們在自己的機器上生成了可能的密語,計算出每一個密語會產生哪些比特幣地址,並將這些地址與公開區塊鏈進行比對。每一個持有餘額的地址都被清空了。 一個自 2022 年以來一直拔掉電源放在抽屜裏的錢包,與日常使用的錢包面臨着同樣的暴露風險。

技術詳情

候選者通過 BIP-39/BIP-32 在離線狀態下衍生;只有最終的餘額查詢才會接觸網絡,因此受害者這一端事先不會有任何信號。3

技術詳情

候選者通過 BIP-39/BIP-32 在離線狀態下衍生;只有最終的餘額查詢才會接觸網絡,因此受害者這一端事先不會有任何信號。3

本頁面並非一場勝利巡遊。

Coinkite 披露了這個漏洞,發布了技術報告並推送了修復程式。外部研究人員能夠還原當時的情況,是因為 COLDCARD 是開源的。

關於評估的一點警告:它們描述的是攻擊者在當前假設下需要進行多少次猜解,而不是秒錶計時。沒有人能告訴你破解某個特定錢包需要多長時間。2

如果您擁有 COLDCARD

在做任何事情之前先閱讀本節

你需要做什麼取決於你首次建立恢復助記詞時使用的是哪款設備,而不是你今天手持的是哪款設備。

假設這種情況仍在發生。這些助記詞是在 2021 年變得可被猜測的,且該方法現在已經公開,因此任何人都可以執行相同的搜尋。沒有任何修復程式可以從外部關閉它,攻擊者也沒有理由停手。如果你受到影響,最安全的假設是,時間是介於你和他們之間的唯一緩衝。

Mk2 和 Mk3:立即轉移你的幣

受影響的韌體版本範圍為 4.0.1 至 4.1.9。4.2.0 版本修復瞭如何產生新的助記詞,但任何更新都無法返回並為已經存在的助記詞增加隨機性。請在您信任的裝置上建立新錢包,並將資金轉移過去。1

Mk4 和 Mk5:檢查韌體版本

如果助記詞是在低於 5.6.0(或 Edge 建置版本的 6.6.0X)的韌體版本上建立的,請更新韌體、在更新後的韌體上建立全新錢包,然後轉移你的資金。單獨更新並不能修復舊的助記詞。1

Q:相同,截止版本為 1.5.0Q

請更新至 1.5.0Q 或更新版本,或 Edge 組建的 6.6.0QX,建立新錢包、寫下並測試備份、發送一筆小型測試交易,然後轉移其餘資產。1

更新 COLDCARD 韌體能否修復我現有的恢復密語?

我如何得知建立 COLDCARD 恢復密語時使用的是哪個韌體版本?

我該如何檢查自己的地址是否受此波及?

擲骰子或密語(Passphrase)能否保護 COLDCARD 復原助記詞?

Coinkite 的公告涵蓋了所有受影響的 COLDCARD 嗎?

Coinkite 官方技術通知轉移至你已經信任的設備上的一個全新錢包,並在遷移所有內容之前發送一筆小型測試交易。保留公開證據(交易 ID、地址、時間戳記),絕不保留私密資訊。任何聲稱可以幫你找回資金的人都是正在進行的第二次盜竊,而且根本沒有這類服務。要購買哪種硬體可以等你的幣安全之後再說。
如果您使用的是 OneKey

沒有任何 OneKey 裝置受影響

沒有一款我們曾發布過的型號受影響。我們的韌體不包含任何 libngu、Coinkite、COLDCARD 或 CKCC 依賴項,因此出問題的程式碼路徑根本不存在,你可以在我們的儲存庫中親自檢查這一點。在我們當前的硬體上,金鑰來自經過認證的安全元件內部的真正的亂數產生器,絕不是來自主處理器上的軟體。這種替代行為正是此次故障的本質。

均未受影響
OneKey Pro
OneKey Classic 1S
OneKey Classic 1S Pure
OneKey Touch
OneKey Classic
OneKey Mini

我們也沒有盲目信任這點。當消息傳出時,Anzen Lab 端到端追蹤了我們的亂數來源(它來自哪裡、是什麼在呼叫它,以及決定哪個版本會到達你設備的建置設定),並發布了他們檢查過的確切檔案。12

閱讀 Anzen Lab 的重新檢查報告
您真正想問的問題

這會不會發生在 OneKey 身上?

這個故障需要同時滿足三個不同的條件。在 OneKey 上,這三個條件都不成立,而且你可以親自檢查這三點。

我們的隨機數來源

那麼 OneKey 的隨機性 究竟來自哪裏?

於 EAL 6+ 認證晶片內部生成

您的私鑰是在專用且具防篡改能力的晶片內生成並保存,而非在運行其他所有功能的通用處理器中。EAL 6+ 是支付卡與身分證所使用的保證等級。

自我監測的隨機性

該晶片從真實的物理雜訊中生成亂數,並持續測試自身的輸出。如果亂數開始出現異常,晶片會注意到,而不是默默繼續運作。

我們主動重新檢查了自己的代碼

在 COLDCARD 事件爆發後,Anzen Lab 全程追蹤了我們自己的亂數(它來自哪裡、實際上是什麼在呼叫它,以及決定哪個版本最終會到達你設備上的建置設定),並發布了他們查閱過的確切檔案。11

OneKey Pro's EAL 6+ certified secure element
EAL 6+ Badge
每筆交易, 都由 EAL 6+ 安全晶片保護
隨機性的生成位置
安全晶片
THD89
保證級別
通過 EAL 6+ 認證
熵源
硬件 TRNG,具備自檢功能
輸出認證依據
BSI AIS 20 / 31
事件後重新審計
Anzen Lab,源代碼已公佈
OneKey 如何構建,由誰驗證

每一台 OneKey 都要通過四重檢查, 而每一重都不盲目信任其他三重

任何單一檢查都可能有遺漏,關鍵在於四重檢查同時遺漏同一問題的機率微乎其微——而 COLDCARD 的教訓正是,只要一個無人覆核的構建設定就足以釀成事故。

01

您可以實際驗證的開源代碼

我們的韌體和應用程式都在 GitHub 上公開,且我們的建置是可重現的,這意味著你可以親自重新建置程式碼,並確認它產生的軟體與你設備上執行的完全一致。這就是捕捉「程式碼正確,版本錯誤」問題的步驟。

GitHub 上的 OneKey
02
SlowMist

外部機構的公開審計

安全公司 SlowMist 對我們進行了審計並發布了報告。獨立評估涵蓋了 OneKey Pro、Classic 1S 和我們的 SDK。我們的安全實踐通過了 ISO/IEC 27001 認證,Pro 和 Classic 1S 產品線也獲得了歐盟指定機構的 EN 18031 認證。所有內容均已公開,絕非自我評估。13

閱讀 SlowMist 審計彙總
03

專門受薪來破壞自家產品的團隊

Anzen Lab 是我們的內部安全團隊,由硬體、韌體和應用程式安全工程師組成,並與輪替的外部研究人員合作。他們的工作是在任何產品出貨之前破解硬體錢包,包括我們自己的。當這個消息爆發時,他們重新端到端審查了 OneKey 自身的亂數,並發布了他們檢查過的確切檔案。11

閱讀 Anzen Lab 分析報告
04

我們付費邀請陌生人找出我們的失誤

任何人都可以透過 BugRap 的公開計畫或直接發送郵件至 [email protected] 私下向我們回報漏洞,並獲得報酬。嚴重程度決定了獎金多寡,並依據 CVSS 進行評分。其核心宗旨是讓通報我們比出售漏洞更具吸引力。15

BugRap 上的 OneKey
entro.tools · 由我們的創始人構建

測試你手上的錢包

entro.tools 是一個免費的開源工具,它能讀取硬體錢包中實際產生的亂數,並在你的瀏覽器中透過 USB 對其執行標準的統計健康測試,過程中不會上傳任何資料,也無需更新韌體。

它同時適用於 Trezor、KeepKey 以及我們自己的裝置,因此您可以進行並排對比,而不必盲目相信任何單一廠商的說法。
運行方式
在您的瀏覽器中,通過 WebUSB
應用的測試
FIPS 140-2、NIST SP 800-22 / 90B
您的數據
絕不會離開網頁
固件更新
無需
熵檢查

在本地透過 WebUSB(桌面版 Chrome 或 Edge)執行 FIPS 140-2、NIST SP 800-22 和 SP 800-90B 健康測試。設備會要求匯出亂數、即它剛剛生成的一批亂數,絕不會匯出你的恢復助記詞。16

Maurer's universal 統計檢測需要至少 387,840 bit,資料不足時報告會明確標記為 skipped,而不是悄悄略過。16

哪些錢包可以進行檢查

外部人員是否能夠讀取設備的原始亂數。這只是一個狹隘的面向。請參閱下方的註解。

OneKey
可自行驗證
所有型號,官方原廠固件16
Trezor
可自行驗證
所有型號,共享連線協議16
KeepKey
可自行驗證
Trezor 連線協議系列16
Ledger
信任供應商
封閉式安全晶片;沒有主機命令暴露原始隨機數16
BitBox02
信任供應商
供應商已移除協議中的隨機數請求功能16
Blockstream Jade
信任供應商
主機只能添加熵;無法將隨機源讀取出來16
COLDCARD
信任供應商
帶有 USB,但其協議中根本不包含熵命令16
Keystone
信任供應商
按設計採用氣隙隔離;USB 僅傳輸裝置信息和固件更新16
「無法測試」與「不安全」是不同的說法。封閉的安全元件遵循其自身的認證路徑。通過的結果僅證明今天沒有出現統計缺陷。它無法證明密碼學上的不可預測性,也沒有說明建立錢包當天所使用的亂數情況。
仍有疑問

這為其他人引發的問題

OneKey 是否受到 COLDCARD 熵值故障的影響?

哪些硬體錢包會受到 COLDCARD 熵值故障的影響?

我可以測試自己錢包的隨機性嗎?

我該如何判斷一款硬體錢包是否值得信賴?

您可以親自核查的安全, 而非要求您盲目相信的安全。

開源且可重現,經過外部審計,由我們自己的實驗室進行攻擊測試,並在有人發現漏洞時給予獎勵。這些就是這場爭論所圍繞的設備。

Cold Storage Weeks
購買任意裝置,即可獲得高達 $50 的比特幣,活動截至 8月17日。

參考資料

以下為資料來源,檢索於 2026 年 8 月 6 日。Coinkite 自身的公告與技術報告排在最前面,接著是獨立的原始碼級分析與鏈上統計。損失數字仍在向上修正:Galaxy Research 在 8 月 4 日確認了 1,596 BTC,並將疑似損失推估接近 2,055 BTC。