Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2008-0166-BTC-satoshi-mining-wallets — Bitcoin 2009-2012におけるCVE-2008-0166の技術的分析。OpenSSL 0.9.8cのPRNG脆弱性、Windowsのエントロピー障害、および鍵空間の再構築を検証。 | Kitploit
ツール/GitHubGitHub/ethicbrudhack/cve-2008-0166-btc-satoshi-mining-wallets
脆弱性分析エクスプロイトハッシュ分析リバースエンジニアリング暗号化論文と研究学習と教育
GitHubethicbrudhack/cve-2008-0166-btc-satoshi-mining-wallets

CVE-2008-0166-BTC-satoshi-mining-wallets

Bitcoin 2009-2012におけるCVE-2008-0166の技術的分析。OpenSSL 0.9.8cのPRNG脆弱性、Windowsのエントロピー障害、および鍵空間の再構築を検証。

リポジトリを見る
114時間49分前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

GhostRNG — 脆弱性分析: Bitcoin 2009-2012 における OpenSSL 0.9.8c (CVE-2008-0166)

著者: bitcoin-code-r252 (0.1.5 / 0.2.0 / 0.3.24) および オリジナルの make-OpenSSL-0-9-8c-vulnerable-again.diff (THC) に基づく分析 日付: 2026-09-10


1. はじめに

Bitcoin 0.1.5 (2009年1月) は Windows 専用で動作し、EC 鍵生成 (EC_KEY_generate_key) に OpenSSL 0.9.8c を使用していた。2008年、 CVE-2008-0166 は Debian の OpenSSL パッケージで発見されたが、Windows では問題の根本原因は異なっていた — /dev/urandom の欠如ではなく、 Bitcoin のソースコード自体における RandAddSeed() の実装であった。


2. 鍵生成前の PRNG 状態 (0.1.5)

bitcoin-code-r252 (tags-0.1.5) では、RNG 初期化シーケンス (util.cpp) は次のとおり:

root@kitploit:~
CInit::CInit() {
    RAND_screen();                    // (a) screen bitmap scrape
    RandAddSeed(true);                // (b) QPC + PerfMon
}

RandAddSeed (util.cpp:57-92):

  • QueryPerformanceCounter -> RAND_add(&PerformanceCount, 8, 1.5)
  • RegQueryValueEx(HKEY_PERFORMANCE_DATA, "Global", ..., buf=250000) -> ERROR_SUCCESS の場合: SHA256(pdata) -> RAND_add(&hash, 32, entropy)

鍵生成 (key.h:75-78):

root@kitploit:~
CKey::MakeNewKey() {
    EC_KEY_generate_key(pkey);  // internally: RAND_bytes(32)
}

重要: バージョン 0.1.5 から 0.3.24 には keypool が存在しなかった。GetRand() は他の目的 (ネットワーク nonce、IRC ニックネーム) で RAND_bytes(8) を使用するため、 連続する GenerateNewKey() 呼び出しの間で PRNG 状態が乱される。

バージョン 0.4.0 (2011年9月) で TopUpKeyPool() が導入され、デフォルトで 100 鍵のプール (GetArg("-keypool", 100)) を持つようになった。


3. パッチ: make-OpenSSL-0-9-8c-vulnerable-again.diff

THC グループ (The Hackers Choice) は、改変された OpenSSL 0.9.8c を用いて thc-btc-rng-bruteforce を開発した。3つの重要な変更点:

A. THC_hitme() の導入 (md_rand.c:133-180)

  • THC_hitme(0): state_num、state_index、entropy、 initialized、stirred_pool、md_count[0..1]、md[]、state[] をゼロクリア — PRNG の完全リセット。
  • THC_hitme(pid): pid を静的変数 thc_pid に格納する。

B. ssleay_rand_add() — バッファ内容が無視される (344行目)

root@kitploit:~
- MD_Update(&m, buf, j);
+ //MD_Update(&m, buf, j);   // commented out!

RAND_add は依然として state_index を num だけ進め、md_count[1] を インクリメントするが、バッファ内容は PRNG 状態に影響を与えない。

C. ssleay_rand_bytes() — PID 置換 (550-561行目)

  • 元の getpid() 呼び出しが削除されている。
  • curr_pid = thc_pid — THC_hitme からの定数値。
  • 追加の MD_Update(&m, &curr_pid, sizeof(curr_pid)) が PID を唯一の外部変数入力として注入する。

結論

パッチ適用済みの OpenSSL では、PRNG 状態は以下にのみ依存する:

  1. PID 値 (THC_hitme 経由)
  2. RAND_add 呼び出しの順序とサイズ (num パラメータ、バッファ内容ではない)
  3. 鍵生成前の RAND_bytes 呼び出し回数

4. アーキテクチャの違い: le32 対 le64

OpenSSL 0.9.8c では、BN_ULONG は opensslconf.h によって定義される:

root@kitploit:~
#ifdef SIXTY_FOUR_BIT_LONG   -> BN_ULONG = unsigned long (64-bit)
#ifdef THIRTY_TWO_BIT        -> BN_ULONG = unsigned long (32-bit)

64ビット Linux では、OpenSSL はデフォルトで SIXTY_FOUR_BIT_LONG となり、 sizeof(BN_ULONG) が 4 バイトから 8 バイトに変わる。これは以下に影響する:

  • static long md_count[2] のサイズ (8 対 16 バイト)
  • SHA における内部 bignum 表現
  • PRNG 出力ストリーム全体

THC SelfCheck テストベクタ (プロファイル 0.3.24、PID 31337):

  • le32: 1FkLYqPpfKPAR6EZh2RC6sDwTUA6Axb1XQ
  • le64: 1JbxBrkBiSwpJUJN2bXrYJc51pH5rjrzTD

Bitcoin 2009 は Windows XP 32ビットで動作していたため、正しい鍵の再構築には THIRTY_TWO_BIT を強制してコンパイルする必要がある (ビルド前に include/openssl/opensslconf.h を編集する)。


5. Sergio Lerner のバグ (Bitcointalk 2012)

2012年9月27日の投稿 (topic=113496) で、Sergio Lerner は次のように述べた:

(a) RandAddSeed() は QueryPerformanceCounter() を呼び出す — これは 引数に QWORD アラインメントを要求する。Windows 上の gcc コンパイラは スタック変数を 8 バイトに整列できず、サイレントに失敗する可能性があった。

(b) RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", ...) は 250,000 バイトの固定バッファを使用する。Windows XP では、パフォーマンスデータは 約 280 KB であり、この関数は ERROR_MORE_DATA を返し、より大きなバッファで 二度と呼び出されることはなかった。debug.log には警告が一切なかった。

両方のメカニズムが失敗した場合、唯一のエントロピー源は RAND_screen() (スクリーンビットマップ) であった。パッチ適用済みの OpenSSL では、バッファ内容が 無視されるため RAND_screen さえも無関係である。

Lerner はこれらの失敗を debug.log に記録することを推奨した — この修正は 後の Bitcoin Core バージョンに取り込まれた。


6. Bitcoin Core における RNG 初期化の変遷 (2009-2012)

bitcoin-code-r252 (tags: 0.1.5, 0.2.0, 0.3.0) および bitcoin/bitcoin リポジトリ (tags: 0.3.24, 0.4.0, 0.5.0, 0.6.0) で確認済み:

バージョン日付RNG 初期化 (Windows)Keypool
0.1.52009-01RAND_screen + RandAddSeed(true)なし
QPC->RAND_add(8) + perfmon->SHA256->RAND_add(32)
0.2.02009-12RAND_screen (__WXMSW__ のみ)なし
QPC->RAND_add(8)、perfmon は 10 分ごとに個別
0.3.02010同じなし
0.3.242011-07perfmon は 10 分ごと、RegQueryValueExAなし
0.4.02011-09同じTopUpKeyPool 100
0.5.02011-12同じ100
0.6.02012-03同じ100

主な知見

  • RAND_screen() は 2012年までのすべての Windows バージョンで使用されていた。
  • keypool (PRNG リセットなしで事前生成された 100 鍵) は 0.4.0 にのみ登場した — それ以前のバージョンはリクエストごとに 1 鍵を生成していた。
  • Perfmon: 0.1.5 は SHA256(pdata) -> RAND_add(32) を使用し、後のバージョンは 生の pdata を RAND_add に渡した (パッチ適用済みの OpenSSL では内容ではなく サイズのみが状態に影響するため、num サイズの違いが重要となる)。

7. 結論

攻撃の鍵空間 (パッチ適用済み OpenSSL において):

root@kitploit:~
  PID (1..32767)
  x poll (init における RAND_add 呼び出し回数、WinXP 上の Toolhelp32 をモデル化)
  x keypool 位置 (0.4.0 以前は 1、0.4.0 以降は 100)
  x プロファイル (各 Bitcoin バージョンの RAND 呼び出しシーケンス)
  x アーキテクチャ (le32 / le64)

tick、screen、cursor、hwnd、queue パラメータは、RAND_add の バッファ内容が無視されるため、このモデルでは無関係である。

オリジナルの THC の著者たちは次のように書いている: 「我々は何も見つけられなかった。」 — 彼らは ブロックチェーン上で鍵を一切見つけられなかった。この分析は彼らの発見を裏付ける: 脆弱な鍵がオンチェーンに存在する確率は、壊れた OpenSSL とサイレントに失敗する perfmon/QPC を備えた Windows XP システム上で、Bitcoin ウォレットが実際に 生成されたかどうかに完全に依存する。


参考文献

[1] Sergio Lerner, "Possible new vulnerability: poor entropy in Windows generated keypairs", Bitcointalk 2012-09-27: link

[2] Bitcoin StackExchange — "Was Satoshi using Windows or Linux?": link

[3] THC, thc-btc-rng-bruteforce: link

[4] Bitcoin Core tags (0.1.5, 0.2.0, 0.3.0, 0.3.24, 0.4.0, 0.5.0, 0.6.0): link

[5] OpenSSL 0.9.8c + patch make-OpenSSL-0-9-8c-vulnerable-again.diff

[6] Analiza_entropy_win.txt — technical report, 2026-09-10

ツールをダウンロード