完全なインシデントレポート · 16の情報源 · Anzen Lab

4行のコード。
失われた1,596 BTC超。

2021年3月、COLDCARDの特定のファームウェアビルドにおいて、ハードウェアチップへの乱数生成の要求が停止し、代わりに通常のソフトウェアが乱数を生成する仕様に変更されました。この問題は5年間誰にも気づかれませんでした。2026年7月、攻撃者が計算を実行し、ウォレットからの資金流出が始まりました。

この設定がもたらした代償
5年
この不具合は完全に公開されたコードの中に、誰にも気づかれずに存在し続けました1
1,596+ BTC
約7,300のアドレスから確認された盗難被害(現在も増加中)7
41 min
単一のウォレットからの最大規模の被害: 1,083 BTC(当時の価値で約7,000万ドル)9
1兆分の1
Mk3において攻撃者が突破しなければならなかった試行回数。本来の設計では78桁の数字の確率が想定されていました1
何が起きたのか

存在しながらも、 機能していなかった安全性チェック

01

すべての防御は、誰にも推測できない一つの数に懸かっている

ハードウェアウォレットにはいくつかの役割があります。感染したパソコンの画面を信頼するのではなく、実際に署名しようとしている内容をユーザーに表示すること、そして物理的な開封に耐えるよう構築されたチップの内部に秘密鍵を保持することです。これらすべての防御機能は、秘密鍵の生成元となった数字が予測不可能であることを前提としています。もし予測可能であれば、攻撃者はどの防御機能も迂回する必要がなくなります。 24単語のフレーズの組み合わせ元となるプールには、観測可能な宇宙にある原子の総数の約1000倍に相当する数の組み合わせが存在します。それほどの規模のプールを総当たりで検索することは不可能です。それがセキュリティモデルの全体像です。

技術詳細

12単語には128ビット、24単語には256ビットのエントロピーが含まれ、さらにそのエントロピーのSHA-256によるチェックサムが付加されます。BIP-39によってこの結果が拡張され、BIP-32のマスターキーが生成されます。

技術詳細

12単語には128ビット、24単語には256ビットのエントロピーが含まれ、さらにそのエントロピーのSHA-256によるチェックサムが付加されます。BIP-39によってこの結果が拡張され、BIP-32のマスターキーが生成されます。

02

COLDCARDはそのプールからの抽出をやめていました

2021年のファームウェア変更により、ウォレットは専用の乱数生成チップにその数字を求めることを密かに停止し、代わりに通常のソフトウェアに計算させるようになりました。これを並べて示したものが、インシデントの全容です:

これはセキュリティが3分の2に低下したという話ではありません。1ビット増えるごとに必要な作業量が倍増するため、88ビット減るということは、作業量が2の88乗分の1に縮小することを意味します。1兆という数字は人間にとっては大きなものですが、高性能マシンをレンタルして処理を行う者にとっては小さなものです。

技術詳細

シード生成処理が ckcc.rng_bytes() から ngu.random.bytes() に変更されました。Coinkite社は、Mk3では約40ビット、Mk4/Mk5/Qでは約72ビットの検索空間が残されていると見積もっています(128ビットのターゲットに対して)。Blockによる独立した分析でも同等の規模(2の40.7乗未満および2の73.3乗未満)が算出されており、さらに残存空間が大幅に減少する限定的な条件も特定されています。2

技術詳細

シード生成処理が ckcc.rng_bytes() から ngu.random.bytes() に変更されました。Coinkite社は、Mk3では約40ビット、Mk4/Mk5/Qでは約72ビットの検索空間が残されていると見積もっています(128ビットのターゲットに対して)。Blockによる独立した分析でも同等の規模(2の40.7乗未満および2の73.3乗未満)が算出されており、さらに残存空間が大幅に減少する限定的な条件も特定されています。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

5年間、何の問題もないように見えました

脆弱な復元フレーズは、強固な復元フレーズとまったく同じ見た目をしています。24個の通常の単語、正しいチェックサム、そして正常に動作するデバイス。画面上に警告が表示されることはなく、ビルドでエラーが発生することもありません。 ソースコードは常に公開されていました。それでもそれを確認するには、誰かがその特定のファイルを開く必要がありました。

技術詳細

出力の長さ、非ゼロ性、非重複性は脆弱なPRNGでもすべて満たされるため、通常の簡易テストでは検出できませんでした。

技術詳細

出力の長さ、非ゼロ性、非重複性は脆弱なPRNGでもすべて満たされるため、通常の簡易テストでは検出できませんでした。

06

そして、誰かが計算を実行しました

彼らは1台のデバイスにも触れることはありませんでした。自分のマシン上で可能性の高いフレーズを生成し、それぞれがどのBitcoinアドレスを生成するかを算出し、それらのアドレスを公開ブロックチェーンと照合しました。残高を持つすべてのアドレスが空にされました。 2022年以来引き出しにしまわれたまま電源が入っていなかったウォレットも、日常的に使用されていたウォレットと同等に露呈していました。

技術詳細

候補はBIP-39/BIP-32を通じてオフラインで導出されます。ネットワークにアクセスするのは最後の残高確認のみであるため、被害者側に事前のシグナルは一切残りません。3

技術詳細

候補はBIP-39/BIP-32を通じてオフラインで導出されます。ネットワークにアクセスするのは最後の残高確認のみであるため、被害者側に事前のシグナルは一切残りません。3

本稿は他社の失敗を非難するものではありません。

Coinkiteはこの欠陥を公表し、技術レポートを公開して修正プログラムを提供しました。COLDCARDはオープンソースであるため、外部の研究者が何が起きたのかを再構築することができました。

推定値に関する1つの注意点:これらはストップウォッチの時間ではなく、現在の前提のもとで攻撃者が直面する総当たり試行の規模を表しています。特定のウォレットが解読されるまでにどれだけの時間がかかるかを断定することは誰にもできません。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のリカバリーフレーズがどのファームウェアで作成されたものかを確認する方法を教えてください。

自分のアドレスがこの影響を受けていないか確認するにはどうすればよいですか?

サイコロの目やパスフレーズはCOLDCARDのリカバリーフレーズを保護できますか?

Coinkiteの警告は、影響を受けるすべてのCOLDCARDを網羅していますか?

Coinkiteの公式技術告知すでに信頼しているデバイス上で新しいウォレットに移行し、すべてを移行する前に少額のテストトランザクションを1件送信してください。公開されている証拠(トランザクションID、アドレス、タイムスタンプ)は保管し、秘密情報は絶対に他人に渡さないでください。資金を回復できると申し出る者は二人目の詐欺グループであり、そのようなサービスは存在しません。次にどのハードウェアを購入すべきかは、コインが安全な状態になってから検討してください。
OneKeyをお使いの場合

OneKeyのデバイスに影響はありません

当社が出荷したモデルには、該当するものは1つもありません。当社のファームウェアには 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でも 起こり得たのか?

この障害が発生するには、3つの異なる条件が同時に成立する必要がありました。OneKeyではそのいずれも成立しておらず、その3つすべてをご自身で確認していただけます。

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に4つの検証。 そのどれもが、他の3つを無条件には信頼しません

いずれか1つが見落とすことはあり得ます。重要なのは、4つすべてが同じ見落としをする確率がきわめて低いということです。COLDCARDでは、誰も検証しなかったビルド設定ひとつで事故が起きました。

01

実際に検証可能なオープンソース

当社のファームウェアとアプリは GitHub で公開されており、ビルドの再現性が確保されています。つまり、ご自身でコードを再ビルドし、デバイス上で実行されているソフトウェアと完全に一致することを確認できます。これこそが「正しいコードだが間違ったバージョン」という問題を阻止するためのステップです。

GitHub上のOneKey
02
SlowMist

外部機関による公式な監査

セキュリティ企業の SlowMist が当社を監査し、そのレポートを公開しています。OneKey Pro、Classic 1S、および当社の SDK はそれぞれ個別の評価を受けています。当社のセキュリティプラクティスは ISO/IEC 27001 の認証を取得しており、Pro および Classic 1S のラインはEUが指定した機関によって EN 18031 の認証を受けています。すべてが公開されており、自社評価のみに依存しているものは一切ありません。13

SlowMistの監査サマリーを読む
03

自社製品をハッキングするために雇われた専門チーム

Anzen Lab は、ハードウェア、ファームウェア、アプリケーションのセキュリティエンジニアで構成される当社の社内セキュリティチームであり、外部の研究者と持ち回りで協力しています。彼らの任務は、出荷前の段階で自社製品を含むハードウェアウォレットの安全性を検証することです。今回の件が報じられた際、彼らはOneKey自身の乱数生成の仕組みを最初から最後まで再検証し、確認に使用した正確なファイルを公開しました。11

Anzen Labの分析を読む
04

外部の第三者に報酬を支払い、脆弱性を発見してもらう

BugRap の公開プログラムまたは [email protected] 宛てに直接、誰でもプライベートに脆弱性を報告し、報酬を受け取ることができます。支払額は CVSS スコアに基づく深刻度によって決定されます。私たちの目的は、脆弱性を外部に売却するよりも、当社に報告することの方が得策となる環境を作ることです。15

BugRap上のOneKey
entro.tools · 開発者による設計

お手元のウォレットをテストする

entro.toolsは、ハードウェアウォレットから出力される実際の乱数を読み取り、標準的な統計的健康性テストを実行するための、無料のオープンソースツールです。ブラウザ内において、USB経由で動作し、どこにもデータがアップロードされることはなく、ファームウェアのアップデートも不要です。

OneKeyだけでなくTrezorやKeepKeyでも動作するため、特定のベンダーの主張をうのみにするのではなく、並べて比較することができます。
実行方法
ブラウザ上でWebUSBを使用
適用されるテスト
FIPS 140-2、NIST SP 800-22 / 90B
ユーザーのデータ
ページ外には一切送信されません
ファームウェアアップデート
不要
エントロピーチェック

デスクトップ版の Chrome または Edge の WebUSB を使用し、FIPS 140-2、NIST SP 800-22、SP 800-90B の健康性テストをローカルで実行します。デバイスは、復元フレーズではなく、生成されたばかりの乱数のバッチであるエントロピーのエクスポートを要求します。16

Maurer's universal 統計テストは最低 387,840 ビットを必要とし、それに満たない場合はレポートに skipped と明示されます(黙って省略はされません)。16

検証可能なウォレットの一覧

外部の人間がデバイスの生の乱数を読み取ることができるかどうかを示しています。これは狭義の1つの側面であり、その下の注記も参照してください。

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に迫ると指摘しています。