研究 概要
暗号資産ウォレットにおけるランダム性の低さ
ウォレットソフトウェアの10年にわたる歴史において、同じ過ちが繰り返されてきました。暗号技術自体は堅牢だったものの、その根底にある乱数生成に問題があったのです。本稿では、こうした一連の失敗事例を概観するとともに、ユーザーにとって「予測可能性」がいかにして復旧への道筋となるのかを解説します。
ウォレットの損失で最も深刻なケースの多くは、暗号化の破綻ではなく、乱数生成の欠陥によるものです。ウォレットのセキュリティは、予測不可能な数値に完全に依存しており、その数値が予測可能であることが判明した場合、アルゴリズムがどれほど強力であっても、システム全体が崩壊してしまいます。このページでは、私たちが調査した主な事例をまとめています(各事例には個別の詳細ページがあります)。また、それらに共通するパターンと、それが復旧作業にどのような意味を持つのかを解説しています。
ランダム性はウォレットの基盤である
すべてのウォレットは、ある「秘密」から始まります。それは秘密鍵やシードであり、理想的には、誰も推測したり網羅したりすることのできないほど広大な空間から選ばれるものです。その推測不可能性は、完全に「ランダム性」に由来しています。鍵の生成に使用されたランダム性が真に予測不可能なものであれば、たとえ無制限の計算能力が投入されたとしても、ウォレットの安全性は保たれます。 もしそうでなかった場合――つまり、「ランダム」な数値が時計や欠陥のある乱数生成器のような予測可能なものから得られた場合――その広大な空間は、検索可能な小さな空間へと縮小してしまい、世界最強の暗号化技術でさえそれを守り切ることができなくなります。
ランダム性が機能しなくなる2つのケース
ランダム性の低さは、ウォレットに対して2つの異なる点で悪影響を及ぼします。 1つ目は鍵の生成です。シードや秘密鍵が予測可能なエントロピーから生成された場合、攻撃者はその鍵を正確に再現できてしまいます。2つ目は署名です。すべてのトランザクションの署名には新しいランダム値(ECDSAのノンス)が必要ですが、その値が予測可能だったり繰り返し使われたりすると、ブロックチェーン上の公開トランザクションから直接秘密鍵を算出されてしまいます。どちらも致命的な問題であり、現実の世界ではそれぞれのカテゴリーに該当する事例が見られます。
Randstorm — 予測可能なブラウザウォレットの鍵
Randstormは、2011年から2015年頃にかけて、BitcoinJSライブラリを使用してブラウザ上で生成された数百万のウォレットに影響を及ぼしました。このライブラリのSecureRandomルーチンは、想定されていたよりもはるかに少ないエントロピーしか収集できていませんでした。その結果、鍵は著しく縮小された空間から生成されてしまいました。これは鍵生成の不具合であり、初期のウォレットの膨大な数に影響を及ぼしています。詳細については、当社のRandstormに関する調査報告をご覧ください。
『MilkSad』――時計から生まれた種、あるいはそれ以上のもの
MilkSad(CVE-2023-39910)は、libbitcoin-explorerの「bx seed」コマンドからシードを取得したウォレットに影響を及ぼしました。このコマンドは、32ビットのシステム時刻を用いてMersenne Twisterのシードを生成していました。これにより、可能なシードの数は約40億通りしか残されません。通常、生成時刻が判明している場合が多いため、実際にはさらに少ない数となります。広く利用されているツールにおける、もう1つの鍵生成の不具合です。当社のMilkSadに関する調査報告をご覧ください。
AndroidのSecureRandom — 署名時に鍵が漏洩する
2013年に発覚したAndroidのSecureRandomの脆弱性は、classic の事例です。Androidの乱数生成関数が同じ値を繰り返し返す可能性があり、その結果、ビットコインウォレットが署名間でECDSAのノンスを再利用してしまう事態が発生しました。これにより、誰でも2つの公開取引データから秘密鍵を算出できてしまうのです。資金はブロックチェーン上から直接奪い取られてしまいました。当社のAndroid SecureRandomに関する調査報告をご覧ください。
Trust Wallet — 現代版のリメイク
「弱い乱数」は、決して昔だけの問題ではありません。2023年、Trust Walletのブラウザ拡張機能が、予測可能な擬似乱数生成器を使用してニーモニックを生成していることが判明しました。そのため、影響を受けたウィンドウで生成された鍵はすべて列挙可能となっていました。これは、10年後に発生したRandstormやMilkSadと同じ鍵生成の欠陥です。この事実は、開発者が便利ではあるものの暗号学的に適切ではない乱数源に頼ろうとするたびに、この種のバグが繰り返し発生することを改めて示しています。
2014年のプレセールにおけるPRNGの観点
我々の独自調査では、このパターンを2014年のイーサリアムプレセールジェネレーターにまで拡大しています。このジェネレーターは、プロセスの一部でブラウザのMath.random()機能に依存していました。Firefox では、特定のエントロピー崩壊により、未知のランダム性を有限のタイムスタンプに絞り込むことが可能であり、これは非常に価値の高いウォレットの一部について、回復への道筋となり得ます。プレセールにおける PRNG に関する我々の調査をご覧ください。
パターン:堅実な暗号、予測可能なシード
これらの事例のすべてにおいて、暗号技術そのものに問題はありませんでした。AES、ECDSA、およびハッシュ関数は決して弱点ではありませんでした。弱点は常に「入力」にありました。つまり、クロック、欠陥のあるプラットフォームジェネレータ、ブラウザの挙動の癖、あるいは暗号化が必要な場面で非暗号化関数が使用されたことなどにより、予測可能となってしまった乱数値が問題だったのです。 このパターンを認識することで、私たちは「安全な」ウォレットを見て、正しい質問を投げかけることができるようになります。それは「暗号化は強力か?」ではなく、「そのランダム性は実際にはどこから得られたのか?」という質問です。
予測可能性には一長一短がある理由
ここで、所有者にとって重要な点が挙げられます。攻撃者が鍵を再生成したり、署名から鍵を導出したりできるというこの「予測可能性」こそが、正当な所有者のためにウォレットを復旧させることを可能にするのです。もしウォレットが脆弱な乱数生成アルゴリズムで作成され、かつアクセス権を失ってしまった場合でも、そのウォレットを危険にさらしている「検索空間の縮小」こそが、ウォレットを再構築できる理由となります。具体的には、列挙可能なシード空間を網羅的に探索するか、あるいは自身の公開取引から鍵を導出することで復旧が可能になるのです。 これは、クライアントが所有権を証明できるウォレットに対して、本来なら失われてしまうはずの資金を返還するため、あくまで「所有者による復旧」として行われます。
自分が影響を受けている可能性があるかどうかを見分ける方法
以下の条件に該当するウォレットをお持ちの場合、セキュリティ上のリスクにさらされている可能性があります:2011年から2015年にかけてブラウザ上で作成されたもの(Randstorm)、libbitcoinのbxシードまたはそれを基盤としたツールで生成されたもの(MilkSad)、2013年頃の初期のAndroid用ビットコインウォレットで作成されたもの(SecureRandom)、影響を受けるTrust Wallet拡張機能のウィンドウ内で作成されたもの、あるいは2014年のイーサリアムプレセール用ウォレット。 これらすべてに共通する懸念すべき点は、ウォレットが外見上は完全に正常に見えることです。つまり、誰かがその空間を網羅的に調査するまでは、この脆弱性は目に見えないのです。もし、これらのいずれかに該当し、かつまだ資金が残っているウォレットをお持ちの場合は、リスクがあるものと見なし、資金を移動させてください。アクセス権を失っている場合でも、この同じ脆弱性を利用して再びアクセスできる可能性があります。
「良いランダム性」とはどのようなものか
セキュリティ上の教訓は一貫しています。鍵やシードは適切な暗号学的乱数生成源から取得する必要があり、署名時には毎回、一意で予測不可能なノンスを使用しなければなりません(最新のウォレットでは、RFC 6979に準拠した決定論的ノンスを採用し、再利用のリスクを完全に排除しています)。 シードは、信頼できる最新のソフトウェアや評判の良いハードウェアウォレットで生成してください。古いブラウザベースのジェネレーターや開発が中止されたツールには注意してください。また、上記のリストにあるツールで作成されたウォレットがある場合は、新たに生成されたウォレットに移行してください。良質な乱数は、正常に機能しているときは目に見えず、機能しないときは壊滅的な被害をもたらします。だからこそ、これほどまでに注意を払う価値があるのです。
私たちの研究
「弱ランダム性の回復」は、KeychainXの活動の中核をなす分野です。なぜなら、「紛失」したとされる初期の暗号資産の多くは、実際には弱ランダム性の暗号資産であり、所有者のために再構築されるのを待っている状態だからです。上記の各事例にはそれぞれ詳細ページがありますが、この概要ではそれらを一つのカテゴリーとしてまとめています。 この調査は、新たな事例が明らかになるたびに更新・維持されています。ウォレットソフトウェアが世代を重ねるごとに、手軽な乱数生成手段に頼りたくなる誘惑が繰り返されるため、この傾向は今後も続くでしょう。
よくある質問
暗号資産ウォレットにおける「弱いランダム性」とは何ですか?
これは、鍵の生成や取引の署名に使用される乱数が、時計や欠陥のある乱数生成器、あるいは暗号的ではない関数といった予測可能なソースから得られている場合を指します。これにより、膨大な鍵空間が、検索可能な小さな空間へと縮小されてしまいます。暗号化そのものは堅牢ですが、入力側に脆弱性があるのです。
このファミリーにはどのような脆弱性が含まれていますか?
Randstorm(ブラウザウォレット、2011年~2015年)、MilkSad(libbitcoin bxシード、CVE-2023-39910)、2013年のAndroid SecureRandomの脆弱性、2023年のTrust Wallet拡張機能の問題、および2014年のイーサリアムプレセールにおけるPRNGの問題。
ランダム性が低いということは、私の資金がなくなってしまうということですか?
これは、そのウォレットが危険にさらされていることを意味します――誰でも鍵を再生成できる可能性があるからです。しかし、正当な所有者にとっては、多くの場合、復旧が可能であることをも意味します。なぜなら、ウォレットを危険にさらしている検索空間の縮小こそが、ウォレットを再構築することを可能にしているからです。
自分のウォレットが脆弱な乱数を使用していたかどうか、どうすれば確認できますか?
作成方法や時期を確認してください。2011年から2015年にかけて作成されたブラウザウォレット、bx seedで生成されたシード、初期のAndroidウォレット、影響を受けたTrust Walletのウィンドウ、あるいは2014年のプレセール用ウォレットなどが、主なリスク要因となります。ウォレット自体は正常に見えますが、作成履歴を見れば判別できます。
ランダム性の低さの影響を受けたウォレットは復旧できますか?
多くの場合、所有者様のために。ウォレットがいつ、どのように作成されたかという詳細情報(および既知のアドレス)があれば、絞り込まれたシード空間を徹底的に調査するか、公開されている取引記録から鍵を導き出します。成功報酬制で、前払いは一切不要です。
ランダム性の弱いウォレット?
もしお使いのウォレットが以下のいずれかに該当し、アクセスできなくなってしまった場合、多くの場合、その脆弱性こそが再びアクセスを取り戻す鍵となります。その脆弱性がいつ、どのように生じたのかをお知らせください。24時間以内に正直な評価をお知らせします。