完整事故報告 · 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
信任供應商
設計上為完全隔離(Air-gapped);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。