リサーチャーは、BitcoinJSライブラリに複数の脆弱性を発見し、10年前にオンラインで作成された古い仮想通貨ウォレットがハッキングされる可能性があることを明らかにしました。問題は、仮想通貨ウォレットの秘密鍵が、ライブラリ開発者の予想をはるかに上回るほど予測可能であった点です。
脆弱性「Randstorm」とその影響
仮想通貨ウォレットのアクセス回復を専門とするUnciphered社のリサーチャーは、多くのオンライン暗号通貨プラットフォームで使用されているBitcoinJS JavaScriptライブラリの脆弱性を発見したことを、11月、ブログで発表しました。これらのサービスの中には、Blockchain.info(現在はBlockchain.comとして知られる)など、非常に人気のあるものもあります。この一連の脆弱性は、「Randstorm」と名付けられました。
BitcoinJSライブラリ自体の脆弱性は、2014年に修正済みですが、問題は、このライブラリを過去に一度でも使用したことがあれば、ウォレットが危険にさらされる可能性があるという点です。2010年代初めにBitcoinJSで作成された仮想通貨ウォレットは、予想以上に簡単に秘密鍵が当てられてしまうというのです。
リサーチャーは、総額約140万BTCに相当する数百万のウォレットが、Randstormによって危険にさらされていると推定しています。リサーチャーによれば、実際に攻撃にさらされる可能性があるのは、潜在的に脆弱なウォレットのうち3~5%とのことです。この記事投稿時点でのビットコイン交換レートは約36,500ドルです。これに基づくと、Randstormを使用した攻撃に成功すれば、攻撃者は、総額15億ドルから25億ドルを手にする計算になります。
リサーチャーは、Randstormの脆弱性を実際の暗号ウォレットに対する攻撃に使用できると主張しています。実際テストでこれらの脆弱性を悪用し、Blockchain.infoで作成された複数の暗号ウォレットへのアクセスを回復することに2012年3月以前に成功しています。倫理上の理由から、攻撃の概念実証(PoC)は公開しませんでした。公開すると、数万もの仮想通貨ウォレットが盗難のリスクに直接さらされることになるためです。
リサーチャーは、脆弱なバージョンのBitcoinJS ライブラリを使用していることがわかっているオンライン仮想通貨サービスに研究結果を報告しています。これを受けて、サービス運営者は、Randstormの影響を受ける可能性がある顧客へ注意を促しています。
脆弱性「Randstorm」の性質
これらの脆弱性について詳しく見てみましょう。ビットコインウォレットのセキュリティの核心は秘密鍵です。他の最新の暗号化システムと同様に、ビットコインはこの鍵が秘密であること、解読不可能であることが前提となっています。これも最新の暗号化システムと同じですが、非常に長い乱数の使用を伴います。
そして、秘密鍵によって保護されるデータのセキュリティを確保するために、乱数は可能な限りランダムである必要があります。鍵として使用される数字が簡単に予測できてしまえば、 鍵の生成手順に関する情報を熟知する攻撃者は、乱数の総当たり攻撃をより容易に、かつ短時間で実行できるようになります。
乱数の生成は、公園の散歩のように簡単なことではないということを覚えておいてください。また、コンピューターはその性質上、予測が非常に簡単な乱数しか生成できないため、この作業には極めて不向きです。したがって、通常は擬似乱数による数字を使用します。生成のエントロピー(暗号学者が使う用語で予測の難しさを示す尺度)を高めるために、特殊な関数がよく使用されます。
さて、BitcoinJSライブラリの話に戻りましょう。「高品質」の擬似乱数を取得するために、このライブラリはJSBN (JavaScript Big Number)と呼ばれる別のJavaScriptライブラリ、特にSecureRandom関数を使用します。その名前が示すように、この関数は暗号化での使用に適した擬似乱数を生成するように設計されています。エントロピーを増やすために、 SecureRandomはブラウザー関数window.crypto.randomに依存します。
問題はここにあります。window.crypto.random関数はNetscape Navigator 4.x ブラウザーファミリーに存在していましたが、WebサービスがBitcoinJSライブラリを積極的に使用し始めた頃には、これらのブラウザーは既に古くなっていました。そして、当時人気のあったInternet Explorer、Google Chrome、Mozilla Firefox、Apple Safariなどのブラウザーには、 window.crypto.random関数が実装されていませんでした。
残念なことに、JSBNライブラリの開発者は、チェックや対応するエラーメッセージを何も用意できませんでした。その結果、SecureRandom関数は、そのままエントロピーのインクリメントステップを引継ぎ、秘密鍵を作成する作業を標準的な擬似乱数ジェネレーターであるMath.randomに事実上任せることになりました。
Math.randomは、暗号化する目的には適していません。これは大きな問題です。しかし、状況はさらに悪化します。2011年から2015年にかけて流行したブラウザー、特にGoogle ChromeのMath.randomにはバグがありました。その結果、生成される乱数は、本来生成されて然るべき乱数よりもずっと少なかったのです。
BitcoinJSライブラリは、JSBNから上記の問題をすべて受け継ぎました。その結果、仮想通貨ウォレットの秘密鍵を生成するためにこれを使用したプラットフォームがSecureRandom関数から取得した乱数の数は、ライブラリ開発者の予想よりもはるかに少なくなりました。また、これらの鍵は非常に予測しやすいものを生成するため、総当たり攻撃が非常に容易になり、脆弱な仮想通貨ウォレットが乗っ取られる可能性があります。
前述のように、この危険性は理論上の話ではなく、実際に発生する確率がかなり高いものです。 Uncipheredは、チーム内でこれらの脆弱性を悪用し、Blockchain.infoで作成されたいくつかの古い暗号ウォレットへのアクセスを回復する(言い換えれば、倫理的にハッキングする)ことに成功しました。
Randstorm:誰が危険にさらされているのか
BitcoinJSは、2011年の導入から2014年まで脆弱なJSBNライブラリを利用していました。しかし、暗号通貨プロジェクトの中には、最新バージョンではないライブラリをしばらくの間使用し続けていた者もあるかもしれません。一般的なブラウザーのMath.randomに三見つかったバグに関しては、2016年までに擬似乱数を生成するアルゴリズムを変更することで修正されています。これらを総合すると、潜在的に脆弱な仮想通貨ウォレットが作成されたのは、おおよそ2011年から2015年ということになります。
BitcoinJSは2010年代初期に非常に人気があったため、脆弱なバージョンを使用していた可能性のあるサービスをすべて書き出すのは困難だと、リサーチャーは語ります。ただ、彼らの報告書には、リスクがあると特定できたプラットフォームの一覧が掲載されています。
- BitAddress — 現在も運営中。
- BitCore (BitPay) — 現在も運営中。
- Bitgo — 現在も運営中。
- info — Blockchain.comとして現在も運営中。
- Blocktrail —https://btc.comまたは https://blockchair.com にリダイレクト。
- BrainWallet — サービス終了。
- CoinKite — 現在はハードウェアウォレットを販売中。
- CoinPunk — サービス終了。
- Dark Wallet — https://crypto-engine.org にリダイレクト。
- DecentralBank — サービス終了。
- info (Block.io) — 現在も運営中。
- EI8HT — サービス終了。
- GreenAddress — https://blockstream.com/green/にリダイレクト。
- QuickCon — サービス終了。
- Robocoin — サービス終了。
- Skyhook ATM — https://yuan-pay-group.net にリダイレクト。
ビットコインウォレットだけでなく、Litecoin、Zcash、Dogecoinウォレットも危険にさらされている可能性があります。これらにもBitcoinJSベースのライブラリがあるからです。これらのライブラリは、それぞれの暗号ウォレットの秘密鍵を生成するために使用されると考えるのが自然でしょう。
Uncipheredのレポートには、Randstormに関連する複雑な要素が他にも多数記載されています。しかし、基本的な結論は次の通りです。2011年から2015年の間に脆弱性のあるライブラリを使用して作成されたウォレットは、程度の差こそあれ脆弱である可能性があります。
Randstormからウォレットを保護する方法
リサーチャー自身が述べているように、これはソフトウェアの脆弱性を修正すればそれで済むというケースではありません。 ウォレットの所有者の秘密鍵に 「パッチを適用して」安全なものに置き換えることは不可能です。つまり、バグはとっくに修正されているにもかかわらず、上述のエラーによりBitcoinJSライブラリが悩みの種となっていた頃に作成された暗号ウォレットは、その影響を受け続けることになります。これは、脆弱な仮想通貨ウォレットの所有者自身が保護対策を講じる必要があることを意味します。
脆弱なライブラリを使用した仮想通貨プラットフォームを完全にリストアップするのは困難な作業です。したがって安全を第一に考えて、2011年から 2015年の間にオンラインで作成された仮想通貨ウォレットはすべてセキュアでない可能性があるとみなすことをお勧めします(安全であることが確実にわかっている場合は除く)。そして当然ながら、ウォレットにある資金が高額であればあるほど、犯罪者の標的となる確率も高くなります。
この問題に対する明確で唯一の解決策は、新しい仮想通貨ウォレットを作成し、脆弱な可能性があるウォレットからすべての資金をそちらに移すことです。
これはどのみちやらなければならないことです。したがって、今回は最大限の注意を払って行うのが賢明といえます。暗号による保護には複数のステップがあります。そのためチェックリストを作成しました。リンクからアクセス可能な詳細情報も多数盛り込んであります。
- 主な仮想通貨の脅威と保護方法を詳しく調べます。
- ホットウォレットとコールドウォレットの違いと、それらを攻撃する最も一般的な方法を理解します。
- 主要な暗号資産の長期保管にはハードウェア(コールド)ウォレットを使用し、日々の取引には最小限の資金しか持たないホットウォレットを使用するようにします。
- 古いウォレットから新しいウォレットにすべての資金を移す前に、すべてのデバイスに信頼性が高い保護を導入します。これにより、パスワードや秘密鍵を盗もうとするトロイの木馬や、クリップボードの暗号ウォレットアドレスを置き換えるクリッパーからスマホやパソコンが保護されます。また、悪意のあるマイナーや不正なリモートアクセスからも、パソコンが保護されるようになります。
- 絶対に、シードフレーズの写真やスクリーンショットをスマホに保存したり、シードフレーズをパブリッククラウドにアップロードしたり、メッセンジャーやメールで送信したりしないでください。紛失した秘密鍵を復元する時以外は、決してどこにもシードフレーズを入力しない(英語)でください。
- 秘密鍵とシードフレーズを安全に保管し、復元できるようにします。カスペルスキー プレミアムの身分証ウォレットを使用すれば、安全な保管と復元が可能です。この機能は、保存されているすべてのデータをAES-256を使用して暗号化します。身分証ウォレットのパスワードの保管場所は自分の頭の中のみです(もちろん、付箋に書いてモニターに貼ってある場合は別ですが)。復元することもできません。したがって、個人文書にアクセス可能なのは自分のみです。
- もう1つの選択肢は、秘密鍵をバックアップするためのシードフレーズを必要としないコールドウォレットを使用することです。たとえば、Tangemハードウェアウォレットがこの方法に該当します。