Randstorm / BitcoinJS
Randstorm: 古いビットコインウォレットに潜むブラウザの脆弱性
どのソフトウェアが文書化されているか、どのバージョンが重要か、そして脆弱な秘密鍵を持ち歩かずに古いウォレットを手放す方法。
目次
実際に何が問題だったのか
Randstormは古いブラウザソフトウェアにおける鍵生成に関する問題です。JSBNのSecureRandom()は不十分なエントロピー源と予測可能なブラウザのMath.random()を組み合わせていました。Uncipheredは2023年11月14日にこの問題を公表し、2011年から2015年に作成された脆弱なウォレットを報告しました。これは観測された期間であり、その年のすべてのウォレットに対する判決ではありません。
SecureRandomという名前はセキュリティ保証ではありません。Coinpunkの検査されたソースでは、フォールバックはMath.random()を使って256バイトのプールを満たし、クロックを混ぜてArcfourジェネレーターに供給します。大きなプールでも入力に欠ける予測不可能性を供給できません。同じソースにはより強力なWeb CryptoとNode.jsの経路も含まれており、フォールバックに到達するかどうかが重要な違いです。
これは秘密鍵の選択方法の欠陥であり、Bitcoinの署名検証の破損ではありません。新しいアプリで古いバックアップを開くとこれらの鍵は保持されます。資金を独立して生成された鍵に移すと、支出を認可するものが変わります。
ウォレット、バージョン、証拠の限界
ライブラリのバージョンはウォレットのバージョンとは別に読み取ります。ホストされたウェブサイトの場合、鍵作成日のコードが今日のアプリバージョンより重要です。表は文書化された事例とソースコードの発見を区別しています。
| プロジェクト | バージョンまたは期間 | これが確立するもの |
|---|---|---|
| BitcoinJS / bitcoinjs-lib | 0.1.3 | 開示で例として名前が挙げられています。JSBNは2014年3月まで使用されていましたが、すべての派生物に対する完全な影響バージョン範囲を確立するものではありません。 |
| Blockchain.info Blockchain.com | 歴史的なウェブウォレット;番号付きの影響範囲は検証されていません | Uncipheredの調査は顧客ウォレットを出発点としました。これはすべてのBlockchain.comウォレットや現在のアプリを含意するものではありません。 |
| bitaddress.org | 2.6.5 · 2.8.0 2013-12-01 · 2014-01-18 | 2.6.5でJSBNが1.4に更新されました。2.8.0では全プールWeb Crypto初期化と必須のマウス/キーボードエントロピーが追加されました。これらは文書化された変更であり、「すべての以前のバージョンが脆弱/すべての以降のバージョンが安全」という境界を証明するものではありません。 |
| Coinpunk | 0.2.1 63ca325be538 | 検査されたリポジトリのスナップショットは0.2.1とラベル付けされ、Math.random()/Arcfourフォールバックとより強力な経路を含みます。これはコードの発見であり、すべての展開がフォールバックを使用した証明ではありません。開発は停止しています。 |
この概要はここで検証された実装をカバーしており、網羅的な影響ウォレットリストではありません。リストにない製品が自動的に影響を受けていないわけではありません。古い作成日や1で始まるアドレスだけでは生成器を特定できません。
宛先を一度準備する
以下の3つのルートは新しいElectrum Desktopウォレットを宛先として使用します。メニュー名はこの記事で確認した英語版4.8.2デスクトップインターフェースに基づきます。公式サイトから最新リリースをダウンロードしてください。4.8.2は指示の参照用であり、常に最低バージョンではありません。
- 信頼できる最新のコンピューターで、使用しているOS向けのElectrumをダウンロードします。公式の署名手順に従い、署名者のフィンガープリントを独立して確認してからインストールしてください。
- File → New/Restoreを選び、ウォレット名をrandstorm-newにして、Standard wallet → Create a new seedを選択します。新しい単語を紙に記録し確認し、ウォレットファイルのパスワードを設定します。古い秘密鍵はインポートしないでください。
- 入金前に、File → New/Restore → Standard wallet → I already have a seedを使い、NEWの紙のバックアップだけでrecovery-checkを作成します。View → AddressesとAddressesタブで両ウォレットの最初の受信アドレスを比較します。このチェック中は両方のウォレットを保持してください。
- randstorm-newでReceive → Request(Lightningが有効ならOnchain)を使い、ビットコインアドレスをコピーします。以下のウォレット固有ルートはこのアドレスに送金し、手数料と宛先を承認前に完全に確認してください。
Blockchain.info: 古いアドレスを保持するウォレットを使う
このルートはBlockchain.com経由でまだアクセス可能な歴史的Blockchain.infoウォレット向けです。現在の送金手順は今日のウェブインターフェースを説明しており、未検証の2012年画面ではありません。Trading Accountの残高は別製品です。
- 元の暗号化バックアップとログイン記録を保持してください。ウェブウォレットでSettings → Wallets & Addresses → Bitcoinを確認し、別にインポートされたアドレスを調べます。既知の古い公開アドレスと表示された保有を照合し、新しいリカバリーフレーズがインポートされた鍵をカバーすると仮定しないでください。
- ウォレットダッシュボードでSendを開き、Bitcoinを選択し、新しいElectrumアドレスを外部宛先として入力します。少額から始め、Continueを選び、アドレス、金額、手数料を確認してからSendしてください。
- ElectrumのHistoryで確認を待ちます。その後、手数料を考慮して残りの利用可能残高を送金します。個別に資金があるインポート済みアドレスをそれぞれ確認してください。テストが成功しただけでは古いウォレットは空になりません。すべての廃止された受信アドレスの使用を停止してください。
bitaddress.org: Sweepでペーパーウォレットを移行
bitaddressの印刷物は通常単一鍵を表し、現代的なリカバリーフレーズではありません。紙と元のHTMLファイルを保存してください。ファイル名やフッターがリリースを特定する場合があります。バージョン履歴はセットアップの再構築に役立ちますが、個別の鍵を証明するものではありません。
- 秘密鍵を特定し、公開受信用アドレスではありません。メインネットのWIFは通常5、K、Lで始まり、BIP38暗号化鍵は6Pで始まります。接頭辞は形式のヒントに過ぎません。対応するアドレスを決めるため、元の圧縮形式を保持してください。
- BIP38の場合、まず公式bitaddressリポジトリの検証済みコピーを使い、ローカルかつオフラインで復号してください:Wallet Details → 暗号化鍵を入力 → View Details → パスフレーズを入力 → Decrypt BIP38。結果のアドレスを紙と比較し、一致するWIFを進めてください。ライブサイトに鍵を入力したり、この古いツールで代替ウォレットを生成したりしないでください。
- NEW Electrum宛先ウォレットでWallet → Private keys → Sweepを開きます。非暗号化のWIFのみをこのローカルダイアログに入力してください。宛先がrandstorm-newに属することを確認し、トランザクションと手数料を確認してからブロードキャストします。
- Sweepは指定された鍵で制御される利用可能残高を一つのトランザクションで転送します。これはインポートではなく、上記の小額テストシーケンスでもありません。資金がある他のペーパーウォレット鍵についても繰り返し、すべての受領が確認されるまで元の鍵を保持してください。
Coinpunk: 古いサーバーに触れる前にバックアップを確保
Coinpunkはセルフホスト型のため、普遍的な現在のログインサイトやリカバリーサービスはありません。これらのラベルはリポジトリスナップショット63ca325be538からのもので、package.jsonはバージョン0.2.1を宣言しています。修正された展開は異なる場合があります。
- 元の信頼できるインストールがまだ動作する場合、Backup → Downloadを開き、暗号化ウォレットの複数コピーを保持してください。ログイン識別子、パスワード、サーバーバックアップも保存してください。唯一の生存インスタンスを最初に更新や再インストールしないでください。
- 歴史的なSend BitcoinsフォームにはBitcoin address to send to、Amount、表示された手数料があります。元のインスタンスがまだ確実に動作し、宛先アドレスをサポートする場合のみ使用してください。この古いソフトウェアにbc1アドレスを無理に使わないでください。検査されたアドレスパーサーはBase58Checkを使用します。
- 互換性のない宛先やオフラインサーバーの場合、バックアップを保持し、このCoinpunkバージョンを理解する支援を得てローカルで鍵を回復してください。ウォレットモデルはkeyPairs(チェンジ鍵を含む)を暗号化ペイロード内に保存します。これはElectrumのシードやBitcoin Coreのwallet.datではなく、ファイル名の変更で変換できません。
- 回復したWIF鍵が元のアドレスに一致したら、上記のElectrumのSweep手順を資金があるすべての鍵に対して使います。チェンジアドレスを含む完全なセットを確認してください。宛先の受領が期待残高と一致するまで暗号化バックアップとパスワードを保持してください。
新しい宛先として推奨するハードウェアウォレット
この移行には、物理ボタンを好む場合はTrezor Safe 3、大きなタッチスクリーンでアドレス確認が楽な場合はTrezor Safe 5を推奨します。どちらも新しい署名鍵を別デバイスに保持できます。購入は古い鍵の修正にはならず、デバイス上で完全に新しいウォレットを作成してください。
Amazonリンクは地域の製品検索を開き、検証済み販売者リストではありません。販売者はTrezorの公式Amazonストアフロントや認定販売店と照合してください。セットアップ時にデバイス認証チェックを使用し、提供された事前作成ウォレットバックアップは絶対に使わないでください。
- trezor.io/startから始めてTrezor Suiteをインストールします。デバイス固有のセットアップと認証チェックに従い、Create a new walletを選択し、デバイス上のバックアップチェックを完了してください。バックアップはオフラインで保持し、上記の例の古いウォレットやソフトウェアウォレットのシードはこのデバイスに復元しないでください。
- 通常の送金ではTrezor SuiteでBitcoinアカウントを選択し、Receiveを選び、接続されたデバイスで完全なアドレスを検証します。このアドレスをBlockchain.comルートのソフトウェアウォレットアドレスの代わりに使用してください。 入金とその承認は、ElectrumのHistoryではなくTrezor Suiteで確認してください。
- Electrum Sweepルートでは、新たに設定したTrezorを接続し、File → New/Restore → Standard wallet → Use a hardware deviceでElectrumウォレットを作成します。TrezorのElectrumガイドに従い、対応するBitcoinアカウントとアドレスタイプを使用してください。Trezorで受信アドレスを検証し、それをSweepの宛先に使います。Sweepには古いWIF秘密鍵のみ入力し、Trezorのバックアップ単語をElectrumやウェブサイトに入力しないでください。
情報源と範囲
このケーススタディは歴史的なブラウザ実装とその異なる移行ルートをカバーします。エントロピー、シードフレーズ、ハードウェアウォレットの広範な関係については背景記事を参照してください。
- Unciphered — Randstorm開示、2023年11月14日
- bitaddress.org — 署名済みバージョン履歴
- Coinpunk — 検査されたRNGとリポジトリスナップショット · package.json · README
- Electrum — リカバリー、スイープ、プライバシーFAQ
- Electrum 4.8.2 — デスクトップウォレットウィザード · Desktop menus
- Blockchain.com — インポートされたビットコインアドレス
- bitaddress.org — BIP38とWallet Detailsの実装
- Coinpunk — 暗号化ウォレットモデルとチェンジ鍵 · Backup · Send
- Trezor Safe 3
- Trezor Safe 5
- Trezor Suite — trezor.io/start
- Trezor — 公式ストアと認定販売店
- Trezor — 他のウォレットからの移行
- Trezor Suite — アドレスの受信と検証
2026年9月19日に主要な文書とソースコードに対して確認。テストに実際の資金や秘密鍵は使用していません。表は網羅的なリストやウォレットの診断ではありません。
よくある質問
BitcoinJS 0.1.3は私のウォレットバージョンを識別しますか?
いいえ。Randstorm開示で引用されたライブラリの例を識別します。ウォレットはそのライブラリをバンドルまたは修正してもユーザーにバージョンを公開しない場合があります。元のウォレットビルドとブラウザ環境は依然として特定する必要があります。
bitaddress.org 2.8.0は私のペーパーウォレットが安全であることを証明しますか?
変更履歴は2.8.0でより強力なエントロピー収集を文書化しています。個別の鍵がどのように生成されたか、どのブラウザ機能が利用可能だったか、ファイルが改変されたかは証明しません。したがってこの記事は文書化された変更として扱い、普遍的な安全境界とはしません。
なぜペーパーウォレットルートはImportではなくSweepを使うのですか?
Importは元の秘密鍵を使用し続けます。Sweepは利用可能な資金を準備した宛先ウォレットに転送するトランザクションを作成します。新しいウォレットは独立して生成された鍵を持ち、宛先と手数料はブロードキャスト前に確認されなければなりません。
ElectrumはCoinpunkバックアップを直接開けますか?
検査されたCoinpunkバージョンは暗号化されたウォレットペイロードを保存し、Electrumのシードではありません。バックアップ、ログイン識別子、パスワードを保持し、バージョン固有の専門知識でローカルに鍵を回復し、元のアドレスに一致させてからSweepルートを使ってください。