この記事では、CVE-2008-0166脆弱性を使用してビットコインアドレス(P2PKH)を生成するツールを作成します。これは、Bitcoin Coreソフトウェアクライアントの初期バージョンでBTCコインを見つけるための研究プロジェクトです。
乱数生成器 が生成する 予測可能な数値 CVE-2008-0166
深刻な脆弱性バージョン OpenSSL 0.9.8 CVE-2008-0166 was プロセスIDのみで生成されました。エンディアンとsizeof(long)の違いにより、出力はアーキテクチャに依存します: 32ビットビッグエンディアン(例: i386)、 64ビットビッグエンディアン(例: amd64, ia64)、 32ビットビッグエンディアン(例: powerpc, sparc)。PID 0 はコアであり、 PID_MAX(32768)は移植によって到達されないため、各アーキテクチャに対して 32767 の可能な乱数ストリームがありました。
Bitcoin Coreソフトウェアクライアントは OpenSSL を使用します。具体的には、関数 «EC_KEY_generate_key()» を使用して、支払いを受け取るためのビットコインアドレス (鍵のようなもの) を生成します。古いバージョンのBitcoin Coreは wallet.dat に 100 個の鍵を生成して保存します。
新しい鍵は、ビットコインの支払いが受け取られたときにのみ生成されます。したがって、Bitcoin Coreソフトウェアクライアントは 100 個の未使用のビットコイン鍵 (アドレス) のプールを維持します。内部乱数生成器の状態は、ライブラリ OpenSSL への 呼び出しの前に 'EC_KEY_generate_key()' に対して行われた他の呼び出しに依存します。RNGの内部状態に影響を与える課題:«RAND_add(8)», «RAND_bytes(8)» и «RAND_bytes(32)».
そこで、研究では多くの古いビットコインソースを調べて、呼び出し «EC_KEY_generate_key()». の前にRNGの内部状態に影響を与える呼び出しが何であったかを特定しました。呼び出しパスはBitcoin Coreソフトウェアクライアントのバージョン間で異なります。
研究は以下のバージョンに焦点を当てました:
| リリース日 | バージョン |
私たちの目標は、深刻な脆弱性 OpenSSL 0.9.8. からの乱数を使用して、各アーキテクチャ (le32/le64)、各プロセスID、およびビットコインアドレス (P2PKH) に対して、Bitcoin Coreソフトウェアクライアントの各バージョンの秘密鍵を生成することです。
最終的に、ビットコインアドレスジェネレーター (P2PKH) を作成し、すべてをファイル result.txt に保存します。
すべてはGoogle Driveファイルストレージに保存されます
これには Google Colabの«Ubuntu 18.04.5 LTS» ディストリビューションキット を使用します。
以前に «Google ColabのTERMINALがGITHUBでの作業に便利な機能をすべて作成する» というビデオチュートリアルを録画しました。
Google Colabを Terminal [TerminalGoogleColab] で開く
コマンドを実行しましょう:
cat /etc/lsb-release
«Ubuntu 18.04.5LTS»
«CryptoDeepTools» リポジトリに移動して詳細を見てみましょう。
git clone https://github.com/demining/CryptoDeepTools.gitcd CryptoDeepTools/05VulnerableOpenSSL/
ls -lh
更新してインストール: g++ libgmp3-dev libmpfr-dev
apt-get update
sudo apt-get install g++ -y
g++をインストール
sudo apt-get install libgmp3-dev libmpfr-dev -y
パッケージ libgmp3-dev libmpfr-dev をインストール
OpenSSL を再び CVE-2008-0166 のように脆弱にするために
openssl-0.9.8c.tar.gz をダウンロードし、システムファイルにパッチを当てます。
wget https://ftp.openssl.org/source/old/0.9.x/openssl-0.9.8c.tar.gz
tar xfz openssl-0.9.8c.tar.gz
mv openssl-0.9.8c openssl-0.9.8c-vuln