プレセールにおけるPRNGおよびIVの脆弱性

研究・原著

プレセールにおけるPRNGおよびIVの脆弱性

2014年のプレセール用ウォレットジェネレーターは、本来使用すべきではない場面でブラウザのMath.randomに依存していました。本調査では、その予測可能性によって、本来はロックされているはずのプレセール用ウォレットを復旧できる道が開かれるかどうかを検証しています。

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

これはKeychainXによる独自の調査結果であり、完成したエクスプロイトというよりは、公開調査として発表するものです。2014年のイーサリアムプレセール用ウォレットジェネレーターは、暗号化パラメータの生成プロセスの一環として、ブラウザの乱数生成機能(Math.random())を使用していました。乱数が予測可能な場合、復元が可能となる可能性があります。以下に、我々が発見した内容を示します。

背景:プレセール用ウォレットの制作経緯

プレセール用ウォレットは、PBKDF2とAESを使用してパスワードで秘密鍵を暗号化するJSON形式のキーストアです。暗号化には初期化ベクトル(IV)やその他のウォレット固有の値が必要ですが、これらは作成時にブラウザ内で生成されていました。 適切にランダム化されたIV自体は秘密情報ではありませんが、ジェネレータがランダム性を収集した方法に重要な脆弱性が存在します。その一部が、暗号学的ソースではなくMath.random()に依存していたためです。

なぜ Math.random は頼りないのか!

Math.random()は、限られた(多くの場合、時間に基づいた)状態からシードが設定される擬似乱数生成関数であり、暗号用途を想定して設計されたものではありません。本来は予測不可能なはずの値が、範囲が限定されたものからシードが設定されたMath.random()によって生成された場合、その値の取り得る範囲は十分に狭く、すべて列挙することが可能になります。これは Randstorm や MilkSad の背後にある原理と同じです。アルゴリズム自体は問題ありませんが、シードが予測可能であるという点が問題なのです。

Firefoxの「undefinedundefined」の折りたたみ問題

我々の主な発見は、あるブラウザ特有の挙動に関するものです。ジェネレータはエントロピー源としてマウスの移動座標を組み込んでいましたが、Firefoxでは特定の条件下で、それらの座標がリテラル文字列「undefinedundefined」として返され、実質的なエントロピーを一切もたらしませんでした。これが発生すると、未知のランダム性は残りのエントロピー源であるミリ秒単位のタイムスタンプに偏ってしまいます。 また、そのタイムスタンプには上限があります。なぜなら、プレセール用ウォレットは、その資金調達トランザクションがビットコインチェーンに反映された瞬間前後の時間帯に作成されたからです。

回復にとってどのような意味を持つのか

これにより、影響を受けるウォレットの検索空間が劇的に縮小されることになります。もしエントロピーが、オンチェーンの資金調達時間に制限されたミリ秒単位のタイムスタンプにまで実際に収束するならば、候補空間は列挙可能となり、構造化された検索――つまり、妥当な時間ウィンドウにわたるビーム検索を行い、ジェネレータの状態を再構築する――によって、復号を支援するために必要な値を再現できる可能性があります。 我々は本手法の概要を説明した。これはFirefoxで作成されたウォレットの特定のサブセットに対しては有望であるが、プレセール向けの万能な「マスターキー」ではない。プレセール時の復旧のほとんどは、依然として別途文書化しているパスワードのエンコードの問題に帰着する。

これが、紛失した仮想通貨にとってなぜ重要なのか

2014年のプレセールウォレットは、暗号資産全体の中でも最も価値の高い休眠資産の一つであり、その所有者がもはや復号できなくなったため、かなりの割合がロックされたままとなっています。 1つのウォレットあたりの価値が極めて高いため、その一部であっても検索範囲を狭めることができる信頼できる手法であれば、追求する価値があります。だからこそ、適用範囲は限定的であるにもかかわらず、PRNGの観点に真剣に取り組んでいるのです。エントロピーの崩壊が発生した特定のウォレットにおいて、無制限の検索と制限付きの検索の違いは、回復不能と回復可能の違いに他なりません。回復可能なウォレットの範囲を、たとえわずかなものであっても広げることができる研究は、この分野において計り知れない価値を持つのです。

方法論の詳細

具体的には、このアプローチは「有界再構築」と呼ばれる手法です。まず、ウォレットのオンチェーン履歴から、作成時刻を挟む資金調達ウィンドウを特定します。次に、そのウィンドウ内の候補となる各ミリ秒について、圧縮エントロピーを前提として生成器の状態を再構築し、そこから生成されたであろう暗号化パラメータを導出します。 第三に、それらのパラメータを暗号化されたキーストアに対して検証し、導出結果が内部的に整合しているかどうかに基づいて候補を絞り込みます。ビーム検索を用いることで、すべての可能性を盲目的に網羅するのではなく、最も有望な候補状態のみを残すことができます。これは、バッチ攻撃ではなく、ウォレットごとに慎重に行われる作業であり、特定の条件が満たされた場合にのみ適用されるという点で適切です。

率直な状況

これは現在進行中の研究として発表する。特定のブラウザ、特定のエントロピー崩壊、そして資金提供期間が適切に制限されているといった条件がすべて揃う必要があり、各候補ウォレットを個別に評価しなければならない。本稿を公開するのは、現存する最も価値の高い休眠ウォレットの一部について、真に独自でありながら十分に検討されていない視点を提供できるからであり、また、有望ではあるが未完成の手法について透明性を保つことが、過大な主張をしたり沈黙を守ったりするよりも、ウォレットの所有者にとって有益であると考えているからだ。

この対象となるウォレットはどれか

対象範囲を正確に言えば、最も有力な候補は、マウス座標のエントロピーソースが機能しなかった期間にFirefoxで作成され、かつ資金調達トランザクションによって作成時刻の範囲が厳密に特定できるプレセールウォレットです。 他のブラウザで作成されたウォレット、あるいはエントロピーソースが意図した通りに機能していたウォレットでは、この崩壊現象は見られず、この手法では対処できません。そのため、一律の解決策を約束するのではなく、各ウォレットを個別に評価しています。同じプレセール用JSONであっても、エンコーディング手法によって復元できる場合もあれば、このPRNG手法によって復元できる場合もあり、あるいはどちらの手法でも復元できない場合もあります。どのケースに該当するかは、その特定のウォレットとオンチェーンのコンテキストを調査して初めて判明するのです。

当社のドキュメント

この分析はKeychainX独自のものであり、休眠状態のプレセールウォレットの調査(当社の「休眠プレセールETHに関する調査」を参照)およびRandstorm やMilkSadと共同で行った、ランダム性の弱さに関する広範な研究を通じて開発されました。ここでは、この発見を記録するためにその時期を明記しており、同じジェネレータを調査している研究者からの協力を歓迎します。

よくある質問

これは、どのプレセール用ウォレットでも開くことができる方法ですか?

いいえ。これは、特定の種類のウォレット――エントロピーが崩壊したFirefoxで作成されたもの――にとっては有望な研究の切り口ではありますが、普遍的な方法というわけではありません。プレセール時の復旧のほとんどは、むしろパスワードのエンコードに関する問題に起因しています。

「未定義未定義」所見とは何ですか?

Firefox では、ジェネレータのマウス座標エントロピーソースがリテラル文字列「undefinedundefined」を返す可能性があり、その結果、ランダム性が全く生じない――これにより、未知のエントロピーは上限のあるミリ秒単位のタイムスタンプへと収束してしまう。

なぜ資金調達のタイミングが重要なのでしょうか?

ビットコインによる資金調達取引が行われた頃、プレセール用ウォレットが作成されたため、オンチェーン上のタイミングによって、エントロピーが収束しうるタイムスタンプの範囲が限定され、その結果、その範囲を列挙可能となる。

これはすでに完了した研究ですか?

いいえ――これは、明確な方法論(特定の時間枠におけるビーム検索)に基づいたオープンな調査として提示しており、一部のウォレットに適用され、ケースバイケースで評価されるものです。

私のプレセール用ウォレットを評価していただけますか?

はい。お客様の特定のウォレットに、パスワードエンコーディング方式とこのPRNG方式のどちらが適用されるか(あるいはどちらも適用されないか)を評価します。

なかなか空にならないプレセール用ウォレットをお持ちですか?

お客様のウォレットに、エンコーディングの問題やこのPRNGの問題が当てはまるかどうかを診断いたします。お使いのウォレットについてお知らせください。24時間以内に正直な評価をご報告いたします。

KeychainXへのお問い合わせ →