2026年7月31日 01:31 UTC、持ち主が何ひとつ操作していないウォレットから、ビットコインが流出し始めました。25分後の 01:56 までに、約500の単一署名ウォレットから、およそ594 BTC——約3,800万ドル——が抜き取られていました。その後の Galaxy Research の分析と Chainalysis の報道は、約1,196のアドレスにまたがる最大およそ1,083 BTC をこの事件に関連づけています。誰もフィッシングに遭っていません。誰もマルウェアをインストールしていません。誰もトランザクションを承認していません。被害者たちが共有していたただ1つの特徴は、ウォレットを作成した日付でした——破綻したのがウォレットのエントロピー、すなわちシードフレーズの材料となるランダム性であり、それはウォレットが生まれた最初の1秒で固定されるものだからです。
これらのウォレットは Coldcard のハードウェアデバイスで生成されており、その背後にある欠陥は、出荷済みファームウェアの中に5年以上も潜んでいました。本稿では、何が起きたのか、なぜこのクラスのバグは見えないままでいられるのか、この事件がハードウェアウォレットについて何を語り、何を語らないのか——そして、私たちのものを含むあらゆるウォレットのランダム性について何を問うべきかを取り上げます。
2021年の欠陥が、2026年に換金された
Coinkite のアドバイザリによれば、この欠陥は2021年3月にリリースされた Coldcard ファームウェア 4.0.0 で入り込みました。影響を受けたデバイスでは、シード生成がハードウェア乱数生成器をスキップし、秘密ではないチップデータから導かれた鍵素材にフォールバックしていたのです。BIP39 のシードフレーズは本来、128ビットのエントロピー——2¹²⁸ 通りのシードという、どんな攻撃者にも探索できない空間——を符号化するはずのものです。ところが、影響を受けた Mk3 デバイスで生成されたシードが実際に持っていたのは、およそ40ビットの実効エントロピーでした。2⁴⁰ は約1.1兆の候補——人間には途方もない数ですが、機械には完全に探索し尽くせる数です。Coldcard の脆弱性を一文で説明するなら、こうなります。デバイスは自らのランダム性を使うのをひそかにやめており、目に見えるものは何ひとつそれを明かさなかった、と。
一度も危険にさらされなかったグループが2つあります。BIP39 パスフレーズを併用してシードを作成した人と、50回以上のサイコロ振りからシードを生成した人です。Coinkite はこの問題を開示し、修正済みファームウェア——Mk4 と Mk5 向けの 5.6.0、Q 向けの 1.5.0Q——を出荷しました。その間の5年間、影響を受けたウォレットは何の問題もなく動作し、安全なウォレットと見分けがつきませんでした。今回の一斉流出を実行した者は、被害者に触れる必要すらありませんでした。弱いキースペースを列挙し、アドレスを導出し、チェーン上のアドレスと突き合わせ、25分の窓ですべてを動かす——それだけです。
静かなエントロピーの劣化:なぜシードはランダムに見えたのか
不気味なのは、影響を受けたシードのどこにも、おかしく見えるところが一度もなかったことです。40ビットの予測可能な入力から作られたシードも、有効なチェックサムを持つ、どこまでも普通の12個の BIP39 単語として出てきます。ウォレットはそれを受け入れ、アドレスを導出し、トランザクションに署名します。すべての画面が、強いウォレットが表示するのとまったく同じものを表示するのです。
統計的な検定も役に立ちません。予測可能なデータでシードされた決定論的な生成器の出力も、ランダム性の検定を通過します——ビットの分布は良好で、ただ、ありうる系列の集合が破滅的に小さいだけなのです。弱さが宿るのは、どんな出力からも明かされない性質——「代わりに他のどれだけのシードが生成されえたか」——です。その答えを知っているのは、生成コードだけです。
弱いシードは、弱く見えない。2¹²⁸ と 2⁴⁰ の違いは、その単語列を作ったコードの中にしか存在しない。
だからこそ、このクラスのバグは何年も生き延び、そして Coldcard インシデントは1つの系譜に属しています。Libbitcoin の bx ツールにおける Milk Sad、Trust Wallet ブラウザ拡張の MT19937 生成器、Cake Wallet、バニティアドレスツールの Profanity、初期のブラウザウォレットにおける Randstorm——これらはすべて同じ形をしています。CSPRNG が予測可能なソースに無音で置き換えられ、エラーも警告も見た目の違いもないまま、誰かがキースペースを列挙するその時まで続くのです。
不都合な教訓
「ハードウェアウォレット」という言葉が指すのはフォームファクタであって、保証ではありません。7月31日に流出したウォレットは、署名専用に作られたハードウェアの上で作成されていました——そして、破綻したのはその層ではありませんでした。生死を分けたのは、何年も前に固定された性質——ウォレットが作成されたその日に、シードがどう生成されたか——です。その下流にあるすべて——コールドストレージ、エアギャップされた署名、慎重な検証——は、鍵が盗まれることを防ぐものです。鍵が再生成できてしまうなら、そのどれも役に立ちません。
Coinkite が欠陥を開示し、修正済みファームウェアを速やかに出荷したことも、同じだけ重要です。これは不注意なベンダーの物語ではありません。ハードウェアでもソフトウェアでも、業界が繰り返し再発見してきた故障モードなのです。どんなウォレットも——私たちのものを含めて——同じクラスのバグまで、無音のフォールバック1つ分の距離しかありません。誠実な問いは「どのベンダーなら無敵か」ではなく、「このウォレットはどのように壊れうるのか、そして誰かがそれに気づけるのか」です。
あらゆるウォレットのランダム性について問うべき5つの質問
水準を引き上げるのに、暗号学者である必要はありません。次の5つの質問が、ウォレットを意味のある形でふるい分けます。
- エントロピー源は何か。シードは CSPRNG から来るべきであり、タイムスタンプやデバイス識別子など、部外者が再構成できるものから来てはなりません。
- そのソースが機能しなくなったら何が起きるか。許容できる答えは、ウォレット作成を停止させるハードエラーです。許容できないのは静かな代替——無音のフォールバックこそ、このバグクラスを定義づける特徴です。
- 生成経路はオープンソースで検証可能か。弱いエントロピーは出力からは見えないため、それを捕まえられる場所はコードレビューしかありません。
- ウォレットは BIP39 パスフレーズに対応しているか。パスフレーズは、デバイスの生成器が一度も触れていない秘密の素材を追加します。影響を受けた Coldcard のパスフレーズ利用者が何も失わなかった理由が、これです。
- マルチシグでは、鍵は独立したデバイス上で生成されるか。独立したデバイスは、独立したランダム性を意味します。欠陥のある生成器1つが侵害するのは鍵1本であって、クォーラムではありません。
Ownbit はどうエントロピーを生成しているか
こうした質問には、私たち自身の製品についての具体的な答えが返されるべきです。Ownbit のニーモニック生成は2つの層からなります。アプリ層では、generateMnemonicRandom(entropy, langIndex) が標準の bip39 ライブラリの generateMnemonic を呼び出します——デフォルトで128ビットのエントロピー、対応する BIP39 ワードリストは英語、簡体字中国語、繁体字中国語、日本語、フランス語、イタリア語、韓国語、スペイン語の8つです。ライブラリ層では、bip39 の randomBytes が crypto.getRandomValues——プラットフォームの CSPRNG——から乱数を引き出します。
ここで重要なのは、そのソースが利用できないときに何が起きるかです。ライブラリはエラーを投げます。時計もチップ識別子も、いかなる二次的なソースも参照しません——コードにフォールバック経路が存在しないのです。故障モードは作成時の大きなエラーであって、無音で弱くなったシードでは決してありません。この性質——大きな音を立てて失敗し、決してフォールバックしない——は、生成が予測可能なソースから静かに続行されてしまった Coldcard インシデント、Milk Sad、Randstorm の背後にある欠陥の、正確な裏返しです。
これで Ownbit がバグと無縁になる、と主張するつもりはありません。誠実なベンダーなら誰もそうは言えません。構造上取り除かれているのは、この失敗の形です。Ownbit のウォレットが無音で弱いシードを生成するコードパスは存在しません。モデルの残りの部分はセキュリティページにまとめてあります。
独立して生成された鍵がこのバグクラスを生き延びる理由
7月31日の一斉流出が直撃したのは単一署名ウォレットでした。シードは1つ、署名も1つ、そして資金は消える——単一障害点としてのシードフレーズの、教科書どおりの事例です。マルチシグはこの算術を変えます。Ownbit のマルチシグウォレットでは、すべての鍵がそれぞれ標準的な BIP39 シードフレーズであり、その参加者自身のデバイス上で生成されます。仮に1台のデバイスが、まさにこのクラスの欠陥を抱えていたとしましょう。2-of-3 のウォレットでは、弱いキースペースを列挙した攻撃者が手にするのは鍵1本——しきい値未満です。何も動きません。弱い鍵は、損失ではなく、ローテーションすればよいメンテナンス作業になるのです。
この保護は独立性から来るのであって、「マルチシグ」という言葉から来るのではありません。同じ欠陥を抱えた同一機種のデバイスで生成された3本の共同署名鍵は、一緒に破綻します。本当に異なるデバイス——日常使いのスマホ、QR 署名のコールドウォレットとしてオフラインに保った余ったスマホ、家族のデバイス——で生まれた3本の鍵は、生成器を共有しないため、バグも共有しません。同じ論理が、BIP39 パスフレーズが影響を受けた Coldcard の利用者を救った理由も説明します。パスフレーズはデバイスの RNG が一度も生成していない秘密の素材であり、2⁴⁰ 通りのシードを列挙するだけでは、資金を動かすのに足りなかったのです。
影響を受けた Coldcard をお持ちなら
取るべき行動は3つです。
- ファームウェアを更新する。Coinkite のアドバイザリに記載された修正済みリリースは、Mk4 と Mk5 向けの 5.6.0、Q 向けの 1.5.0Q です。
- 修正済みファームウェアで生成した新しいシードへ資金を移す。更新が守るのは将来のシードであり、既存のシードを強くすることはできません。およそ40ビットで生まれたシードは、永遠に列挙可能なままです——完全に引退させ、決して再利用せず、そのアドレスへ資金を送り返さないでください。
- 既存のシードフレーズを、脆弱かどうかを「チェック」すると称するウェブサイトに決して入力しない。オンラインの何かにシードを入力することこそ、残った資金が奪われる経路です。「チェッカー」サイトは、この種のインシデントの後に決まって現れるフィッシングの常套パターンです。
よくある質問
ウォレットのエントロピーとは何ですか?
ウォレットのエントロピーとは、シードフレーズの作成に使われるランダム性のことです。標準的な12単語の BIP39 シードは、128ビットのエントロピー——2¹²⁸ 通りのシード——を符号化します。生成器が予測可能であれば、ありうるシードの実際の数は崩壊し、その後シードがどう保管されていたかにかかわらず、攻撃者はそれらを列挙できてしまいます。
自分の Coldcard は影響を受けていますか?
Coinkite のアドバイザリによれば、この欠陥は2021年3月のファームウェア 4.0.0 で入り込み、影響を受けた Mk3 のシードは128ビットではなく、およそ40ビットの実効エントロピーしか持っていませんでした。BIP39 パスフレーズを併用して作成したシードや、50回以上のサイコロ振りから生成したシードにリスクはありません。疑わしい場合は、修正済みファームウェア——Mk4/Mk5 向けの 5.6.0、Q 向けの 1.5.0Q——へ更新し、新しく生成したシードに資金を移してください。
弱いシードは、見ただけで検出できますか?
できません。弱いシードも、有効なチェックサムを持つ普通の12個の単語を生成しますし、統計的な検定では予測可能なソースを暴けません。強さは単語の性質ではなく、生成コードの性質です——影響を受けたウォレットが5年以上も気づかれずにいたのは、そのためです。
マルチシグは弱いエントロピーから守ってくれますか?
構造的には、守ってくれます——ただし、鍵が独立したデバイス上で生成されている限りにおいてです。弱い鍵1本が攻撃者に与えるのは署名1つ——M-of-N のしきい値未満——であり、資金は動きません。同じ欠陥を抱えた同一機種のデバイスで生成された鍵は一緒に破綻しうるため、独立性はしきい値と同じだけ重要なのです。
ハードウェアウォレットの使用はやめるべきですか?
いいえ。教訓はもっと狭いものです。「ハードウェアウォレット」という言葉それ自体が保証なのではなく、シードがどう生成されたかが保証なのです。よく保守されたデバイスを使い続け、ファームウェア更新を適用し、対応していれば BIP39 パスフレーズを追加し、そして本格的な残高は、どれか1つのシードではなくマルチシグのしきい値の後ろに置いてください。
このインシデントを機にご自身の構成を見直しているなら、構造的な修正は、どれか1つのシードだけが資金と攻撃者のあいだに単独で立つ状態をやめることです。Ownbit のマルチシグウォレットは、独立したデバイス上で生成された鍵——それぞれが標準的な BIP39 シードフレーズ——に M-of-N のしきい値をかけます。すべての新規ユーザーが7日間の無料トライアルを利用でき、どちらにしても、鍵はあなたのものであり続けます。