Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2008-0166-BTC-satoshi-mining-wallets — Analisi tecnica di CVE-2008-0166 in Bitcoin 2009-2012, esaminando le debolezze del PRNG di OpenSSL 0.9.8c, i fallimenti di entropia di Windows e la ricostruzione dello spazio delle chiavi. | Kitploit
Strumenti/GitHubGitHub/ethicbrudhack/cve-2008-0166-btc-satoshi-mining-wallets
Analisi delle VulnerabilitàExploitAnalisi HashReverse EngineeringCrittografiaPaper e RicercaApprendimento e Formazione
GitHubethicbrudhack/cve-2008-0166-btc-satoshi-mining-wallets

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

Analisi tecnica di CVE-2008-0166 in Bitcoin 2009-2012, esaminando le debolezze del PRNG di OpenSSL 0.9.8c, i fallimenti di entropia di Windows e la ricostruzione dello spazio delle chiavi.

Vedi Repository
10h 10m faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

GhostRNG — Analisi della vulnerabilità: OpenSSL 0.9.8c (CVE-2008-0166) in Bitcoin 2009-2012

Autore: analisi basata su bitcoin-code-r252 (0.1.5 / 0.2.0 / 0.3.24) e sulla patch originale make-OpenSSL-0-9-8c-vulnerable-again.diff (THC) Data: 2026-09-10


1. Introduzione

Bitcoin 0.1.5 (gennaio 2009) girava esclusivamente su Windows, utilizzando OpenSSL 0.9.8c per la generazione delle chiavi EC (EC_KEY_generate_key). Nel 2008, CVE-2008-0166 fu scoperta nel pacchetto OpenSSL di Debian, ma su Windows il problema aveva una causa radicale diversa — non un /dev/urandom mancante, ma l'implementazione di RandAddSeed() nel codice sorgente di Bitcoin stesso.


2. Stato del PRNG prima della generazione delle chiavi (0.1.5)

In bitcoin-code-r252 (tags-0.1.5) la sequenza di inizializzazione dell'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) -> if ERROR_SUCCESS: SHA256(pdata) -> RAND_add(&hash, 32, entropy)

Generazione delle chiavi (key.h:75-78):

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

Importante: le versioni dalla 0.1.5 alla 0.3.24 non avevano keypool. GetRand() usa RAND_bytes(8) per altri scopi (nonce di rete, nickname IRC), perturbando così lo stato del PRNG tra chiamate successive a GenerateNewKey().

La versione 0.4.0 (settembre 2011) introdusse TopUpKeyPool() con un pool predefinito di 100 chiavi (GetArg("-keypool", 100)).


3. La patch: make-OpenSSL-0-9-8c-vulnerable-again.diff

Il gruppo THC (The Hackers Choice) sviluppò thc-btc-rng-bruteforce, utilizzando una versione modificata di OpenSSL 0.9.8c. Tre modifiche critiche:

A. Introduzione di THC_hitme() (md_rand.c:133-180)

  • THC_hitme(0): azzera state_num, state_index, entropy, initialized, stirred_pool, md_count[0..1], md[], state[] — reset completo del PRNG.
  • THC_hitme(pid): memorizza pid nella variabile statica thc_pid.

B. ssleay_rand_add() — contenuto del buffer ignorato (riga 344)

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

RAND_add avanza comunque state_index di num e incrementa md_count[1], ma il contenuto del buffer non ha alcun effetto sullo stato del PRNG.

C. ssleay_rand_bytes() — sostituzione del PID (righe 550-561)

  • Chiamata originale a getpid() rimossa.
  • curr_pid = thc_pid — valore costante da THC_hitme.
  • Un ulteriore MD_Update(&m, &curr_pid, sizeof(curr_pid)) inietta il PID come unico input variabile esterno.

Conclusione

Nell'OpenSSL modificato, lo stato del PRNG dipende solo da:

  1. Valore del PID (tramite THC_hitme)
  2. Ordine e dimensione delle chiamate a RAND_add (parametro num, non il contenuto del buffer)
  3. Numero di chiamate a RAND_bytes prima della generazione delle chiavi

4. Differenza di architettura: le32 vs le64

In OpenSSL 0.9.8c, BN_ULONG è definito da 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)

Su Linux a 64 bit, OpenSSL usa per impostazione predefinita SIXTY_FOUR_BIT_LONG, cambiando sizeof(BN_ULONG) da 4 a 8 byte. Questo influisce su:

  • Dimensione di static long md_count[2] (8 vs 16 byte)
  • Rappresentazione interna dei bignum in SHA
  • L'intero flusso di output del PRNG

Vettore di test SelfCheck di THC (profilo 0.3.24, PID 31337):

  • le32: 1FkLYqPpfKPAR6EZh2RC6sDwTUA6Axb1XQ
  • le64: 1JbxBrkBiSwpJUJN2bXrYJc51pH5rjrzTD

Bitcoin 2009 girava su Windows XP 32-bit, quindi la corretta ricostruzione delle chiavi richiede la compilazione con THIRTY_TWO_BIT forzato (modificare include/openssl/opensslconf.h prima della build).


5. Il bug di Sergio Lerner (Bitcointalk 2012)

In un post del 27 settembre 2012 (topic=113496), Sergio Lerner descrisse:

(a) RandAddSeed() chiama QueryPerformanceCounter() — richiede l'allineamento a QWORD del suo argomento. Il compilatore gcc su Windows poteva non allineare a 8 byte la variabile sullo stack, causando un fallimento silenzioso.

(b) RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", ...) usa un buffer fisso di 250.000 byte. Su Windows XP, i dati sulle prestazioni erano ~280 KB — la funzione restituiva ERROR_MORE_DATA e non veniva mai più chiamata con un buffer più grande. debug.log non conteneva alcun avviso.

Se entrambi i meccanismi fallivano, l'unica fonte di entropia era RAND_screen() (bitmap dello schermo). Nell'OpenSSL modificato persino RAND_screen è irrilevante perché il contenuto del buffer viene ignorato.

Lerner raccomandò di registrare questi fallimenti in debug.log — questa correzione fu incorporata nelle versioni successive di Bitcoin Core.


6. Evoluzione dell'inizializzazione dell'RNG in Bitcoin Core (2009-2012)

Verificato in bitcoin-code-r252 (tag: 0.1.5, 0.2.0, 0.3.0) e nel repository bitcoin/bitcoin (tag: 0.3.24, 0.4.0, 0.5.0, 0.6.0):

VersioneDataInit RNG (Windows)Keypool
0.1.52009-01RAND_screen + RandAddSeed(true)nessuno
QPC->RAND_add(8) + perfmon->SHA256->RAND_add(32)
0.2.02009-12RAND_screen (solo __WXMSW__)nessuno
QPC->RAND_add(8), perfmon separato ogni 10 min
0.3.02010ugualenessuno
0.3.242011-07perfmon ogni 10 min, RegQueryValueExAnessuno
0.4.02011-09ugualeTopUpKeyPool 100
0.5.02011-12uguale100
0.6.02012-03uguale100

Risultati chiave

  • RAND_screen() fu usato su tutte le versioni di Windows fino al 2012.
  • Il keypool (100 chiavi pre-generate senza reset del PRNG) apparve solo nella 0.4.0 — le versioni precedenti generavano una chiave per richiesta.
  • Perfmon: la 0.1.5 usava SHA256(pdata) -> RAND_add(32), le versioni successive passavano pdata grezzo a RAND_add (una dimensione num diversa conta nell'OpenSSL modificato perché solo la dimensione, non il contenuto, influisce sullo stato).

7. Conclusioni

Lo spazio delle chiavi per l'attacco (nell'OpenSSL modificato):

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)

I parametri tick, screen, cursor, hwnd, queue sono irrilevanti in questo modello perché il contenuto del buffer di RAND_add viene ignorato.

Gli autori originali di THC scrissero: "We did not find any." — non trovarono alcuna chiave sulla blockchain. L'analisi conferma il loro risultato: la probabilità che esista una chiave vulnerabile on-chain dipende interamente dal fatto che qualche wallet Bitcoin sia stato effettivamente generato su un sistema Windows XP con l'OpenSSL difettoso e perfmon/QPC che fallivano silenziosamente.


Riferimenti

[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

Scarica lo strumento