関連記事
Coldcardの乱数生成に5年間の欠陥、約60億円相当のBitcoinが流出

(Coldcard.com)[写真拡大]
Coldcardハードウェアウォレットのファームウェアバグにより、乱数生成器(RNG)が5年間にわたりバイパスされていたことが判明した。この脆弱性を突いた攻撃により、約500のウォレットから約3800万ドル(約60億4000万円)相当のBitcoinが流出した。Mk2およびMk3デバイスのユーザーは、直ちに資金を安全なウォレットに移行することが推奨されている。
■約60億円相当のBitcoinが流出
7月30日夜21時56分(日本時間金曜午前10時56分)に終了した25分間の攻撃で、約500のBitcoinウォレットから約594 BTC(現在の価格で約3800万ドル、約60億4000万円)が流出した。BlockのBitcoinエンジニアリングチームによると、これらのウォレットはすべてColdcardハードウェアウォレットで保護されていたが、2021年3月以降、ファームウェアが専用の乱数生成器(RNG)を密かにバイパスしていたという。これらのデバイスはハードウェアで分離された鍵生成の強みを売りにしていたが、ファームウェアのビルド設定によってそれがオフになっていた。
この窃盗は、BlockのBitcoinエンジニアリングチームとColdcardのカナダの製造元であるCoinkiteによって独立して確認された。この攻撃は、TechTimesの過去の報道を含め、セキュリティ専門家やジャーナリストが、同様のエントロピー障害によって侵害されたソフトウェアウォレットの安全な代替手段として一貫して推奨してきたまさにそのデバイスカテゴリを標的としている。約束されていたのはハードウェアによる乱数生成だったが、ユーザーが実際に得ていたのは、チップのシリアル番号とタイマーレジスタをシードとするソフトウェアのフォールバックであった。
AnchorWatchのCEOであるRob Hamilton氏は、数時間以内にオンチェーンでの動きを分析し、3ブロックの間に500件のトランザクションで1,324のBitcoin出力が移動し、最終的に562 BTCが単一のアドレスに集約されたことを特定した。このアドレスは本記事執筆時点では移動していない。BlockのエンジニアであるClay Garrett氏はその後、確認された窃盗と一致する署名を持つ追加の695件のトランザクションを特定した。Blockのエンジニアリングブログによれば、これが確認されれば、さらに488 BTCが同じエクスプロイトに関連付けられ、潜在的な被害総額は1,082 BTC(約6950万ドル、約110億5000万円)を超える可能性がある。
■ハードウェア乱数をバイパスしたファームウェアバグの解説
根本的な原因は、Blockのエンジニアリングチームが詳細に文書化したファームウェアの統合エラーである。Coldcardのファームウェアは、MicroPythonの組み込みハードウェア乱数パスを無効にするために、ボード設定定数(MICROPY_HW_ENABLE_RNG = 0)を正しく定義している。これは、Coinkiteが独自の専用ハードウェア乱数生成器(TRNG)ラッパーを記述していたためであり、組み込みシステムでは標準的な手法である。
問題は、Coldcardが乱数出力に使用する暗号化サポートライブラリ「libngu」にある。そのガード条件は「#ifndef MICROPY_HW_ENABLE_RNG」となっており、マクロが存在するかどうかだけをテストし、値がゼロでないかどうかはテストしていなかった。マクロが定義されているため(値がゼロであっても)、libnguはハードウェアパスがアクティブであると判断し、MicroPythonのrng_get()関数にバインドする。しかし、MicroPython自体は値がゼロであることを認識し、STM32ハードウェア周辺機器の代わりにYasmarangソフトウェアフォールバックをコンパイルしてしまう。
その結果、Coldcardの乱数生成器へのすべての呼び出しは、専用のハードウェアチップではなく、非暗号論的疑似乱数アルゴリズムであるYasmarangを経由することになった。Yasmarangは、チップの32ビットの一意識別子、SysTickタイマー(最大8万の可能な値を持つ周期的なダウンカウンター)、およびRTC(リアルタイムクロック)レジスタの3つの入力から状態を一度だけ初期化する。Mk3では、Blockのエンジニアリング分析によるとRTCオシレーターが無効になっており、コールドブート時にRTCレジスタが静的またはほぼ静的な値を保持していた可能性が高いと指摘している。
これらの入力が固定されると、ジェネレーターは完全に決定論的になる。自身が所有するデバイスのタイミング分布を特徴づけることができる攻撃者は、同じファームウェアを実行している他のデバイスの検索空間を劇的に狭めることができる。この構造下での有効なエントロピーの上限は約40ビットであり、セルフカストディ型暗号資産ウォレットの90%以上の基盤となっている標準規格BIP-39が12単語のリカバリーフレーズを生成する際に想定する最小128ビットには遠く及ばない。
さらに、libnguはYasmarangの出力を、公開されたハードコードされた定数から初期化された2つ目のYasmarangインスタンスとXOR演算するという問題も重なっている。既知の開始状態を持つ2つの決定論的ストリームのXORは、決定論的な出力を生成する。その後に続くヘルスチェック(隣接する重複値を拒否する)は、退化していないPRNGであれば簡単に通過してしまう。ウォレット生成ステップでは、結果のバイトをSHA256dでハッシュ化する。暗号学的ハッシュ化は入力のエントロピーを増やすことはできないため、候補となる入力が最大2^40個であれば、候補となる出力も最大2^40個となる。
■影響を受けるデバイスと、不完全な修正
Coinkiteのアドバイザリは、確認されたエクスプロイトの範囲を、ファームウェアv4.0.0からv5.0.3を使用してウォレットシードを生成したColdcard Mk2およびMk3デバイスとしている。この脆弱性は2021年3月1日にコードベースに混入した。単一のコミットにより、シード生成の呼び出しが、STM32ハードウェア周辺機器に正しく到達していたckcc.rng_bytesから、壊れたlibnguパスを経由するngu.random.bytesに変更されたためだ。ファームウェアv4.0.0は2021年3月17日に出荷された。Coinkiteのアドバイザリによると、v4.xまたはv5.x(v5.0.3まで)の範囲のファームウェアを使用して作成されたすべてのMk2またはMk3ウォレットは、確認された脆弱な期間に含まれる。
CoinkiteとBlockはともに、Mk4、Q、Mk5デバイスは現在進行中のエクスプロイトの「影響を受けない」と述べている。この表現は、木曜日の夜に行われた特定の攻撃に関しては正確である。しかし、Blockのエンジニアリング分析が明らかにしているように、これには条件が付く。
Mk4は2022年3月に部分的な修正を導入した。起動時に、1つのセキュアエレメントから32バイト、2つ目のセキュアエレメントから8バイトを読み取り、結合した値をハッシュ化し、最初の4バイト(32ビット)をreseed()関数に渡してYasmarang状態の1ワードを置き換える。Blockのエンジニアリング分析は、これが何を達成するかについて明確に述べている。リシードに到達するのは4バイトのみであるため、安全に区別される出力ストリームは最大2^32個であり、列挙するための候補試行回数は平均して約2^31回となる。BIP-39が想定する128ビットのセキュリティ基準には依然として届かない。Coinkite自身の開示でも、パッチ適用前のファームウェアを搭載したMk4およびMk5デバイスは、有効なエントロピーが「約72ビット」のウォレットシードを生成したことを認めている。これはMk3の40ビットの上限よりは意味のある改善だが、それでも基準を約56ビット下回っている。
重要なのは、最新のホットフィックスより前のファームウェアバージョンを使用しているMk4/Q/Mk5の所有者は、シード空間が2^32の可能な値に制限されたウォレットを保持している可能性があるということだ。これは最新のハードウェアであれば列挙可能な数である。Blockのエンジニアは、Mk4/Q/Mk5の状況を「危険なフェイルオープン構造」と表現し、リシードが実行される前の起動シーケンスの早い段階でキャッチ可能な例外が発生した場合、デバイスは追加のエントロピーがゼロの既知の公開初期状態のままになることに言及している。通常の製造上の不具合がこのパスに該当するかどうかは、「証明された32ビットの成功したリシードの弱点とは別に扱うべきである」とBlockは記しているが、未解決の疑問として残っている。
Coinkiteはまた、Tapsigner、Opendime、Satscard製品は異なるコードベースを使用しており、影響を受けないと述べている。
■より広範な影響:ペーパーウォレット、クローンキー、TOTPシークレット
同じ壊れたngu.randomパスは、デバイスの乱数生成器を利用するあらゆる機能に対してColdcardが生成したすべての値を生成した。Blockの開示では、影響を受ける機能として、ペーパーウォレットの秘密鍵、シードXOR分割マスク、デバイスクローンキー、USB暗号化ECDHキー、Key Teleportの一時キー、Web2FA TOTPの共有シークレットとリクエストごとのノンス、Secure Notesのパスワードが挙げられている。
ペーパーウォレットへの影響は特に深刻である。RNG出力が使用可能な秘密鍵になる前に複数の導出ステップを経て処理されるメインのBIP-39ウォレットとは異なり、ペーパーウォレットの生成ではRNG出力を直接secp256k1秘密鍵として使用し、対応するBitcoinアドレスが即時の検証オラクルとして機能する。候補となる秘密鍵を列挙する攻撃者は、導出されたアドレスがオンチェーンのターゲットと一致した瞬間に停止することができる。
脆弱なデバイスのみで構成されるマルチシグ(マルチシグネチャ)構成は、脆弱性を完全に引き継ぐ。参加しているすべての鍵が同じ弱いエントロピー源から抽出された場合、侵害された署名者のクオラムは追加のセキュリティを提供しない。
■Mk3保有者:今すべきこと
Coinkiteのアドバイザリは、2つの明確なリスク階層を設定している。
影響を受けるウォレットがBIP-39パスフレーズ(24単語のシードとは別に入力される追加の単語またはフレーズ)とともに使用されていた場合、そのパスフレーズがコンピュータ、スマートフォン、またはウェブサイトに入力されたことがない限り、この脆弱性による資金へのリスクは「最小限」であるとCoinkiteは述べている。パスフレーズは、デバイスの壊れたRNGパスによって生成されないエントロピーを追加するためだ。
パスフレーズが使用されていない場合、Coinkiteは直ちに資金を移動することを推奨している。最も安全な方法は、Mk4、Mk5、または影響を受けない任意のデバイスで完全に新しいシードを生成し、デバイスの画面でバックアップと受信アドレスを確認し、少額のテストトランザクションを送信してから、残高を転送することである。古いMk3のシードフレーズを新しいウォレットに復元してはならない。シード自体が侵害されたアーティファクトであり、それを別のソフトウェアに移動しても何も変わらない。
Mk3しか利用できないユーザー向けに、Coinkiteは中間的なオプションとして、移行前に強力で一意のBIP-39パスフレーズをMk3に追加することを、代替デバイスを調達するまでの応急処置として説明している。同社はまた、手動で移行を実行する自信のある保有者向けに、デバイスのRNGを完全にバイパスするファームウェア4.1.9でのサイコロのみによるシード生成パスを文書化している。
Coinkiteのアドバイザリは、「リカバリープロセスでの間違いは、脆弱性そのものよりも大きな損害を引き起こす可能性がある」として、急いで行動しないよう明確に警告している。
■「ハードウェアウォレット」のセキュリティの仕組みと、今回の破綻の理由
ハードウェアウォレットのセキュリティの主張は、2つの明確な約束に基づいている。1つは、秘密鍵が物理的に隔離されたデバイスに保存され使用されること(リモートの攻撃者がネットワーク経由で抽出できないようにするため)、もう1つは、それらの秘密鍵が十分にランダムなエントロピーから生成されたこと(デバイスに一度も触れたことのない攻撃者が再現できないようにするため)である。両方の約束が同時に成立しなければならない。
1つ目の約束は損なわれていない。攻撃者がUSBやWi-Fi経由でColdcardデバイスから秘密鍵を抽出することはできなかった。この脆弱性が示しているのは、ウォレット作成の瞬間に2つ目の約束が密かに破られていたということである。デバイスに保存された秘密鍵は決して真にプライベートなものではなく、STM32チップ上で実行されているYasmarang PRNGのタイミング分布を特徴づけることができる者であれば誰でも再現可能であった。
Bitcoin Core開発者のinstagibbs氏は、新しいMk3デバイスで脆弱性を独立して再現し、影響を受けるコードパスを確認した。セキュリティ研究者のJames O'Beirne氏は、パスフレーズ、サイコロの出目、またはマルチシグを使用せずに2021年から2023年の間に生成された単一鍵のColdcard Mk3ウォレットを保持しているユーザーは、資金が差し迫ったリスクにさらされていると見なすべきだと警告した。
脆弱性を含むファームウェアは、5年間にわたりオープンソースコードとして公開されていた。Coinkiteは、資金流出の日までバグに気づいていなかったと述べており、コミュニティのオブザーバーは、高度なコードレビューツールが、製造元よりも先に外部の第三者が脆弱性を特定するのに役立ったのではないかと推測している。
マルチシグのBitcoinカストディツールを構築しているWizardsardineの共同創設者であるKevin Loaec氏は、公式のアドバイザリが出回る前に公に警鐘を鳴らした最初の実務者の一人であった。
■Bitcoin価格と市場への影響
金曜早朝(ET)の時点でBitcoinは約64,315ドル(約1022万円)で取引されており、窃盗に対する目立った市場の反応は見られなかった。単一のオンチェーンアドレスに集約された流出分の562 BTCは、本記事公開時点では移動していない。
■注目ポイントQ&A
●私のColdcardハードウェアウォレットはこのファームウェアバグの影響を受けますか?
確認されたエクスプロイトは、ファームウェアバージョン4.0.0から5.0.3(2021年3月から最後のMk3ファームウェアリリースまでの期間)を使用してウォレットシードを生成したColdcard Mk2およびMk3デバイスを特に標的としています。BIP-39パスフレーズなしでそのファームウェア範囲でMk3ウォレットが作成された場合、Coinkiteは資金が差し迫ったリスクにさらされていると見なし、影響を受けないデバイス上の新しいシードに移行することを推奨しています。Mk4、Q、Mk5デバイスは木曜日の夜の攻撃では悪用されませんでしたが、Blockのエンジニアリング分析によると、これらのデバイスもセキュアエレメントのリシードが基盤となるジェネレーターに最大32ビットしか提供しないため、128ビットのエントロピー基準を満たしていません。Coinkiteのアドバイザリは、Mk4、Q、Mk5は「初期分析に基づき影響を受けない」としていますが、BlockはMk4/Q/Mk5の構造が「危険なフェイルオープン構造」を伴っており、別途評価が必要であると説明しています。
●専用のハードウェアチップがあるのに、なぜ「ハードウェアウォレット」が予測可能な鍵を生成したのですか?
デバイスには専用のハードウェア乱数生成器(STM32マイクロコントローラー上の真の乱数生成器:TRNG)が搭載されています。CoinkiteがTRNGの独自のラッパーを記述したため、ファームウェアはMicroPythonの組み込みハードウェアRNGパスを正しく無効にしました。問題は「libngu」と呼ばれる暗号化サポートライブラリにあり、関連するビルドマクロが有効になっているかどうかではなく、存在するかどうかをチェックしていました。マクロが(未定義ではなく)ゼロとして定義されていたため、libnguはハードウェア乱数が利用可能であると結論付け、MicroPythonのrandom関数にバインドしました。しかし、その関数は値がゼロであることを認識し、代わりにYasmarangと呼ばれるソフトウェアフォールバックをコンパイルしました。ハードウェアチップは物理的に存在し、動作していましたが、ファームウェアのルーティングエラーにより、チップに数値を要求することがありませんでした。
●自分のColdcardが影響を受けるデバイスに含まれているかどうかを確認するにはどうすればよいですか?
影響を受けるかどうかは、現在のファームウェアバージョンやハードウェアの購入時期ではなく、ウォレットシードが最初に生成された瞬間にデバイスで実行されていたファームウェアバージョンに依存します。ファームウェアをアップグレードしても、既存のシードが遡及的に変更または修復されることはありません。ウォレットをセットアップしたときにインストールされていたファームウェアバージョンを確認してください。ファームウェアのバージョン番号はデバイスの「Settings」メニューに表示されます。過去のバージョンは coldcard.com/downloads/all に文書化されています。ウォレット作成時のバージョンがMk2またはMk3デバイスで4.0.0〜5.0.3の範囲であった場合は、blog.coinkite.com にあるCoinkiteのアドバイザリでモデル固有の移行手順を参照してください。コンピュータやオンラインツールに入力したことのないBIP-39パスフレーズを使用した場合、Coinkiteはこの特定の脆弱性による資金へのリスクは最小限であるとしています。
●このインシデントは、より広範な「Not your keys, not your coins(鍵を持たぬ者はコインを持たず)」というセルフカストディの原則にとって何を意味しますか?
取引所の破綻、カストディアンの倒産、資産の凍結から保護するという点において、この原則は依然として有効です。しかし、鍵を生成したコードが暗号学的に健全であったかどうかについては何も語っていません。このインシデントは、セルフカストディのセキュリティには「鍵を管理すること」と「それらの鍵が真の乱数で生成されたことを保証すること」という2つの独立した要件があること、そしてハードウェアウォレットのマーケティングが歴史的に後者よりも前者を強調してきたことを示しています。予測可能なエントロピーから生成された秘密鍵は、それを保持するデバイスが物理的にどれほど隔離されていても安全ではありません。これは、2023年のMilk Sad PRNGインシデント、2026年のIll Bloomモバイルウォレットの脆弱性に続く、このクラスの重大な文書化された障害としては3件目であり、毎回、ユーザーが検証する手段を持たないポイント、すなわちウォレット作成の瞬間に障害が発生しています。
元記事: Coldcard Hardware Wallet Hacked via Firmware Bug That Bypassed RNG for Five Years
※この記事はTech Timesから提供を受けた記事を日本向けに翻訳・編集したものです。
スポンサードリンク
