研究・脆弱性

MilkSad:bx シードの脆弱性 (CVE-2023-39910)

libbitcoin-explorerのbx seedコマンドで生成されたウォレットは、真のランダム性ではなく時計からエントロピーを取得していた。そのため、これらのウォレットは予測可能であり、正当な所有者であれば復元が可能である。

2026年7月更新 · KeychainX — 2017年よりウォレット復元サービスを提供

CVE-2023-39910として登録されている「MilkSad」は、仮想通貨の歴史上、最も顕著な「弱いランダム性」の欠陥の一つです。この問題は、libbitcoin-explorerのbx seedコマンドによってシードが生成されたウォレットに影響を及ぼします。この名称は、最も弱いシードのニーモニックが「milk sad…」で始まることに由来しています。このページでは、この欠陥の詳細と、影響を受けたウォレットの所有者がどのように復旧を行うかについて説明します。

MilkSadの脆弱性とは何か

ウォレットを作成するには、真のランダム性が必要です。しかし、bxシードツールは、システム時刻(秒単位)――つまり32ビットの値――を用いて、メルセンヌ・ツイスター擬似乱数生成器(MT19937)にシードを設定していました。これにより、鍵空間全体が大幅に縮小されてしまいます。本来なら天文学的な数のシードが存在するはずですが、実際には約40億個しかなく、作成時刻は通常、ある範囲内で特定できるため、実際にはそれよりはるかに少ない数になります。 ウォレットがいつ作成されたかをおおよそ知っている人なら誰でも、そのウォレットで生成された正確なシードを再生成することができます。

影響を受けるのは誰か

bx seedに由来するシードエントロピーを持つウォレットはすべて、このツールに脆弱性が存在していた期間(おおむね2011年~2023年)に影響を受けます。これには、libbitcoin-explorer を直接使用したユーザーに加え、重要な点として、ニモニックを生成するために内部でbx seed を呼び出していたチュートリアルやスクリプトに従ったすべてのユーザーも含まれます。 もしあなたのBIP39フレーズがそのような方法で生成された場合、そのセキュリティは最初から存在していませんでした。そのフレーズは、列挙可能なごく少数のセットのうちの1つに過ぎなかったのです。

なぜタイムシードが致命的なのか

メルセンヌ・ツイスターは決定論的であり、同じシードからは常に同じストリームが生成されます。したがって、シード値だけが秘密となるのですが、このケースではその値は単なるタイムスタンプに過ぎませんでした。ウォレットを再現するには、妥当な作成期間内の候補となる秒数をすべて洗い出し、それぞれを同じMT19937に通して同じエントロピーを生成し、その結果として得られるニーモニックとアドレスを導出し、既知のアドレスと照合します。 1日はわずか86,400秒、1年は約3,100万秒であるため、通常のハードウェアでも検索はすぐに完了します。これは、別のツールにおけるRandstormと同じ種類の不具合、すなわち「予測可能な乱数」の問題です。

オーナーにとっての回復の仕組み

MilkSadを危険なものにしているその予測可能性こそが、影響を受けたウォレットを正当な所有者が回復できる理由でもあります。影響を受けたツールでウォレットを作成し、その後ニーモニックを紛失した場合でも、当方で再生成することが可能です。おおよその作成日と、そのウォレットの既知のアドレス1つを基に、MT19937の導出プロセスにおけるタイムスタンプの範囲を、アドレスが一致するまで順に調べ、正確なシードを再構築します。 この処理は、お客様が所有し、かつそのウォレットとの関連性を証明できる場合にのみ行います。その目的は、資金を正当な所有者に返還することであり、盗難を助長することではありません。

影響を受けていると思われる場合は

もし、bxシードまたはそれに基づいて構築されたツールを使用して生成されたウォレットを所有しており、そこにまだ資金が残っている場合は、そのウォレットは侵害されたものとみなしてください。他の誰でも古いウォレットを再生成できてしまうため、できるだけ早く、適切にランダムなシードを使用して作成した新しいウォレットに資金を移動させてください。すでにウォレットへのアクセス権を失っている場合でも、この欠陥があるからこそ復旧は現実的です。攻撃者が使用するのと同じ手法こそが、あなたのコインを取り戻す方法となるからです。

どれほどのリスクがあったのか

シード空間が40億通りであるという事実の結果として、列挙攻撃を実行する者なら誰でも、影響を受けたウォレットを一斉に空にすることが可能となり――実際にそうした事例も発生しました。この欠陥は広く使用されているコマンドラインツールに存在していたため、その影響は、「安全なシードを生成する」ためにそのツールを呼び出していたあらゆるスクリプト、チュートリアル、および下流プロジェクトへと波及しました。 これが、ランダム性の弱さによるバグが持つ「静かな危険」です。バグは自らを露呈せず、ウォレットは正常に見え、ニーモニックも他の12語のフレーズと何ら変わりなく、誰かがシード空間を網羅的に探索するまではその脆弱性は見えません。所有者にとっての実用的な教訓は、残高がいつでも消えてしまう可能性があるということです。したがって、影響を受けたウォレットは直ちに空にして、新しいウォレットに移すべきです。

MilkSadは単発のミスではありません。これは、ウォレットのランダム性が、時計やブラウザの挙動の癖、欠陥のあるプラットフォームジェネレーターなど、予測可能なものから生成されていた一連の失敗の一例です。Randstormは初期のブラウザウォレットのエントロピーを崩壊させました。2013年のAndroid SecureRandomの欠陥は、署名用ノンスの繰り返しによって鍵を漏洩させました。2014年のイーサリアムプレセール用ジェネレーターは、プロセスの一部でブラウザのMath.randomに依存していました。 これらに共通するのは、暗号そのものは堅牢であったものの、シードが不十分だったという点であり、いずれの場合も、盗難を可能にしたのと同じ予測可能性が、正当な所有者による復旧も可能にしている。これは我々の研究の中核をなすテーマである。なぜなら、「紛失」したとされる初期の暗号資産の大部分は、実際には再構築を待つだけの、ランダム性が不十分な暗号資産だからだ。

情報開示と私たちの取り組み

MilkSadは、milksad.infoのアドバイザリを公開したセキュリティ研究者らによって2023年に公表され、CVE-2023-39910が割り当てられました。この発見の功績は彼らにあります。 KeychainXの貢献は復旧の側面にあります。当社は、ランダム性の弱さによる復旧に関する広範な取り組みの一環として(密接に関連するブラウザウォレットの事例については、当社のRandstorm研究を参照)、影響を受けたウォレットの所有者に代わって、タイムシードの再構築を構築・実行しました。技術的な詳細については、元のアドバイザリを参照してください。

よくある質問

MilkSadとは何ですか?

libbitcoin-explorerのbx seedコマンドに存在する弱エントロピー脆弱性(CVE-2023-39910)。このコマンドは、32ビットのシステム時刻を用いてMersenne Twisterのシードを生成していたため、生成されるシードが予測可能かつ列挙可能となっていた。

私の財布にも影響はありますか?

もしシードが「bx seed」や、それを使用したツール・チュートリアルで生成されたものであるなら、その通りです。そのフレーズにはそもそもセキュリティは存在しませんでした。資金はすべて、適切にランダムに生成されたシードを持つウォレットに移してください。

シードを紛失した場合、MilkSadウォレットは復元できますか?

多くの場合、所有者にとってはそうです。おおよその作成日時と既知のアドレスがあれば、アドレスが一致するまで、同じ導出プロセスでタイムスタンプの範囲を順に試していくことで、シードを再生成します。

MilkSadを発見したのは誰ですか?

milksad.infoのアドバイザリを発表した研究者らは、2023年にこの脆弱性を公表しました(CVE-2023-39910)。KeychainXは、影響を受けたユーザー向けの復旧支援を行っています。

回復にはどれくらいの費用がかかりますか?

成功報酬型:ウォレットの回収に成功した場合にのみ、回収額の一定割合を報酬としてお支払いいただき、前払いは一切不要です。

粗末な道具で作られた財布?

もしお持ちのシードがBXシードに由来する可能性があり、アクセスできなくなってしまった場合でも、復元できる可能性が高いです。ウォレットと大まかな日付をお知らせください。24時間以内に正直な評価をお伝えします。

KeychainXへのお問い合わせ →