
7分で読めます
Coldcardハック解説:RNG欠陥、影響を受けるファームウェアと移行手順
誰もデバイスに触れていません。
フィッシングメールも、悪意あるアプリもありません。盗まれたラップトップも、漏えいしたバックアップも、偽のサポートページに入力されたシードフレーズもありません。7月31日のColdcardハックでビットコインを失った人々は、標準的な助言に従ってすべて正しいことをしていました。鍵はオフラインで、専用ハードウェア上で、他の何ものも信用しないことを売りにして評判を築いたデバイス上で生成されていたのです。
UTCの01:31から01:56の間に、CoinDeskが最初の一掃を計測したところでは、1,324件のトランザクションと3ブロックの時間枠で、約500のウォレットから594 BTCが流出していました。25分間です。その後数日かけてさらなる波が続きました。
この件について、次に取るべき行動を変える点が1つあります。攻撃者は誰のColdcardへのアクセスも必要としませんでした。シードフレーズをゼロから導き出したのです。
Coldcardハックで実際に壊れたもの
まずシードフレーズが何であるかから始めましょう。物語の全体がこの1つの事実の上に成り立っているからです。
12語または24語の単語はパスワードではありません。それは、人間がミスなく書き写せる形式で記された、非常に大きな数です。あなたを守っているのはその数です。そして、その数を安全にしている唯一のものは、誰も探索できないほど莫大なプールから予測不可能に選ばれたという事実です。
そのプールはビットで測られます。1ビット増えるごとに2倍になります。正しく生成されたシードは128ビットの予測不可能性を持ち、およそ340アンデシリオン(3の後ろに38桁のゼロが続く数)通りの可能性に相当します。存在するどのマシンも、どの技術ロードマップ上のどのマシンも、その規模のプールを探索し切ることはできません。これが、セルフカストディが安全であることの根拠のすべてです。
つまり、ハードウェアウォレットの最も重要な仕事は、何かに署名する前の、その生涯の最初の数秒で行われます。本当に予測不可能な数を生成しなければならないのです。Coldcardはまさにこのために専用ハードウェアを搭載しています。物理ノイズから取り出す真の乱数生成器です。
影響を受けたファームウェアでは、5年間、そのハードウェアは一度も使われませんでした。
たった1つのビルドフラグが、ハードウェアウォレットを予測可能なものに変えた経緯
原因は1文に収まるほど小さく、だからこそ理解する価値があります。
ColdcardのコードはMICROPY_HW_ENABLE_RNGという設定を定義し、それをゼロにしていました。MicroPython内蔵のものではなく自社のハードウェア生成器を使っていたためです。2021年の移行で持ち込まれた補助的な暗号ライブラリは、その設定が存在するかどうかを確認しただけで、有効になっているかどうかは確認しませんでした。設定は存在しました。値はゼロでした。チェックは通り、ビルドを止めるはずの安全エラーは発火せず、コードは静かにMicroPythonのソフトウェアフォールバックへ落ちていきました。
Coinkite自身の言葉によれば「そのガードは#ifndefを使っており、MICROPY_HW_ENABLE_RNGが定義されているかどうかだけを検査していて、その値が非ゼロかどうかは検査していませんでした。私たちはそのマクロをゼロとして定義したため、#errorはビルドを止めませんでした」
そのソフトウェアフォールバックはランダムではありませんでした。Blockの分析によれば、チップのハードウェアIDとタイマー値を組み合わせて起動され、リアルタイムクロックのレジスタで補充され、それらの値は一度読み取られたきり更新されなかったといいます。Coinkiteは同じことを「主にデバイスとタイミングの状態からシードしている」と表現しています。いずれも秘密ではありません。こうした生成器に同じ初期値を与えれば、設計上、毎回同じ出力を確実に生成します。
こうしてプールは縮みました。Mk2とMk3では約40ビットにまで崩壊し、それはおよそ1.1兆通りの可能性です。1兆は膨大に聞こえますが、そうではありません。まともなラップトップでも処理でき、GPUクラスタなら数時間で終わります。
Mk4、Mk5、Qはセキュアエレメントからの追加エントロピーを混ぜており、ここで公表された2つの分析は見解が分かれます。Coinkiteはこれらのモデルの実効的な探索空間を約72ビットと推定しています。Blockは、リシードがセキュアエレメントから4バイトしか取り込まず、生成器の内部状態の1ワードだけを置き換えて残りには手を付けないため、その試算では「安全に識別できる出力ストリームは最大でも2^32」としています。Blockは、悪用可能性を確認する完全な実証テストは行っていないと慎重に述べ、決定版の報告書が公表され次第そちらを参照するよう読者に促しています。
この見解の相違は未解決のものとして扱ってください。Mk4、Mk5、Qをお持ちなら、より悲観的な側を前提にするのが安全です。
そこから先の攻撃は機械的です。候補のシードを生成し、それぞれが生み出すビットコインアドレスを導出し、それらのアドレスを公開ブロックチェーンと照合し、残高のあるものを掻き集める。ブロックチェーンは公開されているので、この過程のどの部分にも、ウォレットもネットワーク接続も人間も必要ありません。
画面上の何ものも、あなたに教えてくれなかった
ファームウェアのバージョン番号よりも長く記憶に残すべき詳細がこれです。
弱い乱数生成器は、弱く見える出力を生みません。セットアップ中にColdcardの画面に表示された単語は、正しく生成されたシードとまったく同じに見えました。正しくフォーマットされ、チェックサムも正しく、統計的に目立たないものだったからです。予測可能な生成器の出力は、ランダム性テストを余裕で通過します。ランダムに見えます。ただ、誰でも再構築できる初期値によって、あらかじめ決められていただけなのです。
注意深くすることでは、これを発見できませんでした。バックアップを確認すること、アドレスを検証すること、まず少額のトランザクションを試すことでも発見できませんでした。それらのチェックはすべて通過していたでしょうから。
この欠陥を発見したのはBlockのビットコインエンジニアリングおよびセキュリティチームで、同社はファームウェア分析を通じてこれを追跡し、公表前にCoinkiteへ開示しました。欠陥は2021年3月のファームウェア4.0.1から出荷され続けていました。
Coldcardハックの影響対象はどこか
これは見出しの数字よりも重要です。このバグが届くのは、影響を受けたファームウェアによって生成されたシードだけだからです。Coinkiteの勧告によれば、次の通りです。
影響を受ける場合、シードを移行してください:
- Mk2およびMk3のファームウェア4.0.1〜4.1.9。約40ビット。緊急として扱ってください。
- 5.6.0未満のMk4およびMk5。約72ビット。
- 1.5.0Q未満のQ。約72ビット。
このバグの影響を受けないもの:
- TAPSIGNER、OPENDIME、SATSCARD。別のコードベースで動作しています。
- Mk1。Coinkiteの勧告はいずれの方針でも明言していませんが、Blockの分析では、Mk1はv3.2.2までSTM32のハードウェア生成器を直接使用しており、この回帰はv4.0.0で初めて入り込んだことが判明しています。
- 少なくとも50回の公正で独立した非公開のサイコロ振りで作成されたシード。Coinkiteはこれらは「このRNG問題単独」では危険にさらされないとしており、問題ないと決めつけるのではなく、移行前に同社の別個の指針を読むよう求めています。
別のデバイスで生成されてColdcardにインポートされたシードも対象外のはずです。バグは生成ではなく保存や署名にあるのではないためです。Coinkiteの勧告はインポートされたシードに直接言及していないため、これは機構上の話であって公式のお墨付きではありません。
ファームウェアを更新しても、すでに存在するシードは修復されません。弱い数は、多くの場合何年も前に、一度だけ作成済みであり、今もあなたのコインを守っているのはその数です。パッチが止めるのは、新しいシードが拙く作られることです。過去には手が届きません。
Coldcardをお持ちの場合の対応方法
Coinkiteの指針を、順に示します:
- 何かを生成する前に、公式ソースから修正済みファームウェアへ更新してください。Mk2とMk3は4.2.0以降。Mk4とMk5 Standardは5.6.0以降。Q Standardは1.5.0Q以降。Edgeビルドは6.6.0X、Qは6.6.0QXです。
- 更新済みデバイスで完全に新しいシードを生成してください。Mk4、Mk5、Qでは、修正済みファームウェア自体のシード生成で十分であり、サイコロ振りは任意です。
- 新しいバックアップ、ウォレットフィンガープリント、受け取りアドレスを記録して検証してください。パスフレーズを設定した場合は、シードワードとは別々に保管してください。
- 残りの資金を移動させる前に、少額のテストトランザクションを送ってください。
- 移行が完了し確認できるまで、古いバックアップを保管してください。
最後のステップは2回読む価値があります。こうした事件の直後の本能は、古いバックアップをすぐに破壊することですが、移行の途中で何かがうまくいかねば、その本能はお金を失わせます。古いシードは侵害されていますが、資金が新しいウォレットで確認されるまでは、いまだそれらに届く唯一のものでもあります。引退させるのはその後であって、その最中ではありません。
2021年以降にシードを作成したMk3をお使いなら、今週末ではなく、今日中にステップ1と2を行ってください。40ビットは本当に低いのです。
報道されている数値について1つ注記します。Galaxy Researchは、8月4日時点でおよそ7,300のアドレスから1,596 BTCが奪われたと集計しました。TRM Labsは、5,200を超えるアドレスにわたって約1,816 BTC(1億1,600万ドル)という数値を公表しました。
誰も検査できないセルフカストディの領域
ホルダー向けのセキュリティ助言の大半は、観察できるものを扱っています。送る前にアドレスを確認する。ドメインを検証する。シードを何にも入力しない。マーケットプレイスではなく製造元から買う。いずれも良い助言であり、いずれもミスが起きている瞬間に捕まえることに関するものです。
鍵生成は違います。一度だけ起こり、自らの品質について何の証拠も残さず、間違っていたときには、システムのどこにもそれを知らせる信号がありません。ウォレットは動きます。トランザクションは承認されます。バックアップは正しく復元されます。その失敗は、そうでなくなるまで完全に無音です。
これがここでの本当の教訓であり、1つのメーカーをはるかに超えて当てはまります。どのウォレットも、ハードウェアであれソフトウェアであれ、あなた自身には監査しようのないランダム性についての約束を行っています。あなたは、決して目にすることのないビルドプロセスを信頼しているのです。
そしてそれは、その信頼が裏切られたときに実際に被害を減らすものを指しています。単一の秘密だけが、それ単独でどれだけの価値を持つかです。
この事件でビットコインを失った人は全員、1回のトランザクションで全額を失いました。攻撃者が洗練されていたからではなく、1つの数がセキュリティモデルのすべてだったからです。その数を当てれば、ウォレットの持ち主になれます。超えるべき第2のステップが存在しなかったのです。
単一の秘密がウォレットのすべてでなくなることで、何が変わるか
CoinWalletはマルチパーティ計算(MPC)に対応しています。すべての背後に1つのシードフレーズが座っているのではなく、署名能力が別々の場所に保持された複数の断片に分割され、そのうち一定数が揃わなければトランザクションを承認できません。
単独の断片では、あなたの暗号資産を動かせません。承認には、必要な断片が揃って協同することが要ります。鍵1つ、デバイス1台、盗まれた断片1つでは、決して足りません。
実運用ではこれは、MPCウォレットを作成して他の人と資産を共同管理できる、招待コード経由でウォレットに参加できる、既存のキーシャードをインポートできる、そしてすべてを解錠する単一のリカバリフレーズではなく、しきい値でゲートされたプロセスを通じて失くしたデバイスを置き換えられる、ということです。
さて、この事件にふさわしい正直な部分です。MPCはランダム性の要件を撤廃しません。キーシャードも生成され、生成の品質は引き続き重要です。分割が取り除くのは、単一の推測可能な秘密です。1つの断片を解明した攻撃者が手にするのは断片1つであり、断片1つでは署名できません。何かを失う前に、失敗は複数の場所で起こる必要があり、それは単一の弱い数よりも明確に仕組みにくいことです。
ビットコインのマルチシグは、別の経路で似た性質をもたらします。複数の独立した鍵、必要とされる署名数、そしてすべてを明け渡す単一のフレーズの不在です。
助言は正確には変わっていません。移動しただけです。長年ホルダーに向けたメッセージは、鍵を取引所から離して自分のハードウェアに移すことでした。そしてそのメッセージは正しかった。この事件が次の1行を加えます。鍵を自分のハードウェアに移す価値はあるものの、それは安全であることと同じではない。なぜなら、あなたは信頼を、ハッキングされ得る企業から、5年間メーカー以外の誰も読んでいなかったビルドプロセスへ移したにすぎないからです。


