今週、ビットコイン関連の技術者にとって衝撃的なニュースが発表されました。Libbitcoin Explorer (bx)というツールにシード生成の脆弱性があり、このツールを利用して生成されたウォレットから資金が盗難されているというのです。

Trust Walletなども最近シードの生成に関する脆弱性で大きな流出を起こしている中、ノンカストディアルウォレットで同じような問題が相次いでいることになります。せめてもの救いは人気のウォレットであるTrust Walletと比較してLibbitcoinは老舗ながら近年ほとんど使われていないことでしょう。

Milk Sad脆弱性について解説していきます。

・Libbitcoinはビットコイン関連のウォレットやアプリケーションの作成に使える老舗C++ライブラリ
・エントロピー不足とMilk Sad…で始まるシードフレーズ
・意図的に仕込まれていた?という疑惑について

milksad.info

Libbitcoinはビットコイン関連のウォレットやアプリケーションの作成に使える老舗C++ライブラリ

まずはLibbitcoinについて説明します。

Libbitcoinはビットコインを扱うアプリケーションを作るのに利用できるC++ライブラリで、大部分は2011年から2014年にかけて開発されたものです。当時は比較的広く利用されていた可能性がありますが、2017年にバージョン3.0がリリースされて以降は下火になっており、Libbitcoinという名称自体それほど聞くこともなくなっていした。

Libbitcoin自体にはいくつかの機能がパッケージされており、今回脆弱性が発覚したのはLibbitcoin Explorer (bx)というコマンドラインツールでした。実はこのコマンドラインツール、ビットコイン開発や技術に興味がある読者向けの名著であるMastering Bitcoinにも利用例が掲載されているなど、実は触ったことのある人も少なくないかもしれません。

ところが今回、その利用例として掲載されていたシード生成コマンドbx seedに致命的な脆弱性が露見したのです。

エントロピー不足とMilk Sad…で始まるシードフレーズ

このbx seedコマンドの脆弱性とは秘密鍵生成時のエントロピー不足でした。エントロピーとは「ランダム性の大きさ」を示すと考えてください。

ビットコインの公開鍵から秘密鍵を逆算することはできませんが、ある公開鍵の対となる秘密鍵をたまたま引き当てる可能性はおよそ2の128乗分の1とされます。仮に秘密鍵の生成アルゴリズムに偏りがあってランダムではなかったとします。極端な例えをすると、秘密鍵の元となるエントロピーが3ビット(10進数で表すと0〜7)しかなかったとすると、たまたま秘密鍵を引き当てる確率は8分の1(2の3乗分の1)になります。

このようにエントロピーが128ビットより少ないと秘密鍵の脆弱性が増すと言えそうです。

また、現在のビットコインウォレットはほぼ全てがBIP32階層的決定性ウォレットという規格に基づき1つのマスターシードから多数の秘密鍵とアドレスを導出する仕組みになっています。(1つのBIP39シードフレーズをバックアップすれば多数のアドレスからなるウォレットが復元できる方式です。) BIP32ではマスター鍵生成時のエントロピーを最低128ビット、推奨256ビット、最大512ビットと規定しています。

シードフレーズには12単語(128ビット)、24単語(256ビット)のものがあるにも関わらず「12単語で十分だ!」とする意見があるのはマスターシードを256ビットにしても攻撃者は128ビットの各アドレスの秘密鍵を狙うと考えられるためです。

しかし、今回のMilk Sad脆弱性においてはbx seedコマンドが32ビットの値、しかもシステム時間というランダム性の低い数値を元に秘密鍵を生成していたため、最近のデスクトップPCなら1週間以内にbx seedで生成できるすべてのアドレスを探索できてしまうことになりました。そして何らかの攻撃者がこれに気づき、bx seedコマンドで生成したウォレット内の資金を盗み始めたのです。

Milk Sad脆弱性という名前はシステム時間を0.0に設定したときに必ずMilk Sad…で始まる同一の12単語が出力されるという(ランダム性のない)特徴から付きました。

意図的に仕込まれていたという疑惑について

Libbitcoinの開発者のGitHubアカウントのアクティビティが最初にMilk Sad脆弱性が悪用されたのと同時期にめっきり途絶えていることが余計に疑心暗鬼を呼びました。

もちろん、被害にあった主体から通報を受けて分析と対応に追われていた可能性や、たまたま長期休暇をとっただけという可能性もあります。(過去にも数ヶ月空白が空くことはあったようです。)

さらに、仮に彼自身が犯人であるとして、何年も前から計画的に準備しているのであれば犯行前に発覚と対策されないように秘密鍵を多数入手してから同時多発的に盗難するのが合理的なので、既知の最初の盗難から最大の盗難まで2ヶ月以上かかっていることから個人的には意図的に仕込まれた脆弱性の可能性は高くないと感じます。

昨年末から続いていたTrust Walletの資金流出問題もシード生成時のエントロピー不足が理由と発覚するなど、秘密鍵の生成にまつわるバグは珍しくありません。一部のビットコイナーは前々からハードウェアやソフトウェアの問題への対策としてサイコロを使ったシード生成など、DIYできる手段でエントロピーを用意するなどしています。ランダム性を担保するためには厳密にはカジノダイスと呼ばれる各面の出る確率が等しいように製造されたサイコロを準備する必要がありますが、もし次に新しいシードフレーズを生成する機会があればチャレンジしてみるのもありかもしれません。

以下に印刷可能な11ビットとBIP39単語の対照表があります。

BIP39-wordlist-printable-en/BIP39-en-printable.txt at master · hatgit/BIP39-wordlist-printable-en
A handy compact printable BIP39 mnemonic wordlist containing index values in base 10 and 11-bit binary base 2 format - hatgit/BIP39-wordlist-printable-en

おまけ

Entropiaというカワイイ商品もあります。これはBIP39単語が書かれたプラスチックの小板が瓶詰めになっています。転がせばいいサイコロと比べていかにランダムに取り出すかが難しいような気はしますが…。(重量は全部等しいのか?などの疑問もあります)

Entropia v2 Seed Tablets | BTC Hardware Solutions
Functional art that can help secure your bitcoin! Entropia is a BIP39 lottery system that you can use to trustlessly create secure bitcoin private keys. Choose 11 or 23 words at random, and then use a bitcoin signing device like SeedSigner to calculate the final checksum word that completes your see…