Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2008-0166-BTC-satoshi-mining-wallets — Technische Analyse von CVE-2008-0166 in Bitcoin 2009-2012, Untersuchung von OpenSSL 0.9.8c PRNG-Schwachstellen, Windows-Entropieausfällen und Schlüsselraum-Rekonstruktion. | Kitploit
Tools/GitHubGitHub/ethicbrudhack/cve-2008-0166-btc-satoshi-mining-wallets
SchwachstellenanalyseExploitationHash-AnalyseReverse EngineeringKryptographiePapers & ForschungLernen & Bildung
GitHubethicbrudhack/cve-2008-0166-btc-satoshi-mining-wallets

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

Technische Analyse von CVE-2008-0166 in Bitcoin 2009-2012, Untersuchung von OpenSSL 0.9.8c PRNG-Schwachstellen, Windows-Entropieausfällen und Schlüsselraum-Rekonstruktion.

Repository anzeigen
vor 10h 10mNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

GhostRNG — Schwachstellenanalyse: OpenSSL 0.9.8c (CVE-2008-0166) in Bitcoin 2009-2012

Autor: Analyse basierend auf bitcoin-code-r252 (0.1.5 / 0.2.0 / 0.3.24) und dem ursprünglichen make-OpenSSL-0-9-8c-vulnerable-again.diff (THC) Datum: 2026-09-10


1. Einleitung

Bitcoin 0.1.5 (Januar 2009) lief ausschließlich unter Windows und verwendete OpenSSL 0.9.8c für die EC-Schlüsselgenerierung (EC_KEY_generate_key). Im Jahr 2008 wurde CVE-2008-0166 im OpenSSL-Paket von Debian entdeckt, doch unter Windows hatte das Problem eine andere Ursache — nicht ein fehlendes /dev/urandom, sondern die Implementierung von RandAddSeed() im Bitcoin-Quellcode selbst.


2. PRNG-Zustand vor der Schlüsselgenerierung (0.1.5)

In bitcoin-code-r252 (tags-0.1.5) lautet die RNG-Initialisierungssequenz (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) -> if ERROR_SUCCESS: SHA256(pdata) -> RAND_add(&hash, 32, entropy)

Schlüsselgenerierung (key.h:75-78):

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

Wichtig: Die Versionen 0.1.5 bis 0.3.24 hatten keinen Keypool. GetRand() verwendet RAND_bytes(8) für andere Zwecke (Netzwerk-Nonces, IRC-Nicknames) und stört dadurch den PRNG-Zustand zwischen aufeinanderfolgenden GenerateNewKey()-Aufrufen.

Version 0.4.0 (September 2011) führte TopUpKeyPool() mit einem Standard- Pool von 100 Schlüsseln ein (GetArg("-keypool", 100)).


3. Der Patch: make-OpenSSL-0-9-8c-vulnerable-again.diff

Die Gruppe THC (The Hackers Choice) entwickelte thc-btc-rng-bruteforce unter Verwendung eines modifizierten OpenSSL 0.9.8c. Drei kritische Änderungen:

A. Einführung von THC_hitme() (md_rand.c:133-180)

  • THC_hitme(0): setzt state_num, state_index, entropy, initialized, stirred_pool, md_count[0..1], md[], state[] auf null — vollständiger PRNG-Reset.
  • THC_hitme(pid): speichert pid in der statischen Variable thc_pid.

B. ssleay_rand_add() — Pufferinhalt ignoriert (Zeile 344)

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

RAND_add erhöht weiterhin state_index um num und inkrementiert md_count[1], aber der Pufferinhalt hat keine Auswirkung auf den PRNG-Zustand.

C. ssleay_rand_bytes() — PID-Substitution (Zeilen 550-561)

  • Ursprünglicher getpid()-Aufruf entfernt.
  • curr_pid = thc_pid — konstanter Wert aus THC_hitme.
  • Zusätzliches MD_Update(&m, &curr_pid, sizeof(curr_pid)) injiziert PID als einzige externe variable Eingabe.

Fazit

Im gepatchten OpenSSL hängt der PRNG-Zustand ausschließlich ab von:

  1. PID-Wert (über THC_hitme)
  2. Reihenfolge und Größe der RAND_add-Aufrufe (num-Parameter, nicht Pufferinhalt)
  3. Anzahl der RAND_bytes-Aufrufe vor der Schlüsselgenerierung

4. Architekturunterschied: le32 vs le64

In OpenSSL 0.9.8c wird BN_ULONG durch opensslconf.h definiert:

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

Unter 64-Bit-Linux verwendet OpenSSL standardmäßig SIXTY_FOUR_BIT_LONG, wodurch sizeof(BN_ULONG) von 4 auf 8 Bytes geändert wird. Dies beeinflusst:

  • Größe von static long md_count[2] (8 vs. 16 Bytes)
  • Interne Bignum-Darstellung in SHA
  • Den gesamten PRNG-Ausgabestrom

THC-SelfCheck-Testvektor (Profil 0.3.24, PID 31337):

  • le32: 1FkLYqPpfKPAR6EZh2RC6sDwTUA6Axb1XQ
  • le64: 1JbxBrkBiSwpJUJN2bXrYJc51pH5rjrzTD

Bitcoin 2009 lief auf Windows XP 32-Bit, daher erfordert die korrekte Schlüsselrekonstruktion eine Kompilierung mit erzwungenem THIRTY_TWO_BIT (bearbeiten Sie include/openssl/opensslconf.h vor dem Build).


5. Sergio Lerners Bug (Bitcointalk 2012)

In einem Beitrag vom 27. September 2012 (topic=113496) beschrieb Sergio Lerner:

(a) RandAddSeed() ruft QueryPerformanceCounter() auf — erfordert QWORD-Ausrichtung seines Arguments. Der gcc-Compiler unter Windows konnte die Stack-Variable möglicherweise nicht auf 8 Bytes ausrichten, was zu einem stillen Fehler führte.

(b) RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", ...) verwendet einen festen Puffer von 250.000 Bytes. Unter Windows XP betrugen die Performance-Daten ~280 KB — die Funktion gab ERROR_MORE_DATA zurück und wurde nie erneut mit einem größeren Puffer aufgerufen. debug.log enthielt keine Warnung.

Wenn beide Mechanismen fehlschlugen, war die einzige Entropiequelle RAND_screen() (Screen-Bitmap). Im gepatchten OpenSSL ist sogar RAND_screen irrelevant, da der Pufferinhalt ignoriert wird.

Lerner empfahl, diese Fehler in debug.log zu protokollieren — dieser Fix wurde in spätere Bitcoin-Core-Versionen aufgenommen.


6. Entwicklung der RNG-Initialisierung in Bitcoin Core (2009-2012)

Verifiziert in bitcoin-code-r252 (Tags: 0.1.5, 0.2.0, 0.3.0) und dem bitcoin/bitcoin-Repository (Tags: 0.3.24, 0.4.0, 0.5.0, 0.6.0):

VersionDatumInit RNG (Windows)Keypool
0.1.52009-01RAND_screen + RandAddSeed(true)none
QPC->RAND_add(8) + perfmon->SHA256->RAND_add(32)
0.2.02009-12RAND_screen (__WXMSW__ only)none
QPC->RAND_add(8), perfmon separate every 10 min
0.3.02010samenone
0.3.242011-07perfmon every 10 min, RegQueryValueExAnone
0.4.02011-09sameTopUpKeyPool 100
0.5.02011-12same100
0.6.02012-03same100

Zentrale Erkenntnisse

  • RAND_screen() wurde auf allen Windows-Versionen bis 2012 verwendet.
  • Der Keypool (100 vorab generierte Schlüssel ohne PRNG-Reset) erschien erst in 0.4.0 — frühere Versionen generierten einen Schlüssel pro Anfrage.
  • Perfmon: 0.1.5 verwendete SHA256(pdata) -> RAND_add(32), spätere Versionen übergaben rohe pdata an RAND_add (unterschiedliche num-Größe ist im gepatchten OpenSSL relevant, da nur die Größe, nicht der Inhalt, den Zustand beeinflusst).

7. Schlussfolgerungen

Der Schlüsselraum für den Angriff (im gepatchten OpenSSL):

root@kitploit:~
  PID (1..32767)
  x poll (count of RAND_add calls in init, modeling Toolhelp32 on WinXP)
  x keypool position (1 for pre-0.4.0, 100 for 0.4.0+)
  x profile (RAND call sequence for each Bitcoin version)
  x architecture (le32 / le64)

Die Parameter tick, screen, cursor, hwnd, queue sind in diesem Modell irrelevant, da der RAND_add-Pufferinhalt ignoriert wird.

Die ursprünglichen THC-Autoren schrieben: „We did not find any." — sie fanden keine Schlüssel auf der Blockchain. Die Analyse bestätigt ihre Feststellung: Die Wahrscheinlichkeit, dass ein anfälliger Schlüssel on-chain existiert, hängt vollständig davon ab, ob tatsächlich eine Bitcoin-Wallet auf einem Windows-XP-System mit dem defekten OpenSSL und still fehlschlagendem perfmon/QPC generiert wurde.


Referenzen

[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 — Technischer Bericht, 2026-09-10

Tool herunterladen