Gli RNG sicuri comunemente usati come / dev / random di Linux, ChaCha20 o RdRand funzionano bene per molti casi convenzionali. Tuttavia, sono tutt'altro che a prova di idiota. Supponiamo che tu faccia qualcosa di divertente come non impostare il tuo orologio in tempo reale quando generi numeri casuali all'avvio. Se non capisci come questo influenzerà il tuo RNG, qualcuno che lo fa potrebbe andarsene con la tua chiave privata. C'è poco spazio per errori qui perché una piccola quantità di non casualità può compromettere un intero protocollo crittografico come la generazione di chiavi.
Sebbene i problemi con implementazioni personalizzate di generatori di numeri casuali o interferenze fisiche nel tuo hardware ingenui siano fonte di buone discussioni, la maggior parte delle vulnerabilità nelle notizie con generatori di numeri casuali, come il problema Debian che hai citato, non è dovuto a questi problemi. I problemi più grandi che ho riscontrato ripetutamente sono gli sviluppatori che pensano di avere una buona fonte di entropia per seminare il generatore di numeri casuali quando in realtà non lo fanno, consentendo erroneamente di scoprire e sfruttare lo stato del generatore casuale, o la mancanza di test rigorosi del generatore di numeri casuali stesso. L'NSA non ha bisogno di backdoor per la generazione delle chiavi se sei uno dello 0,75% dei client TLS che utilizza chiavi a bassa entropia. In sintesi, gli sviluppatori ignorano i pochi avvertimenti e presumono che il loro RNG funzionerà in qualsiasi applicazione.
Cos'è l'entropia e dove la trovo?
Poiché tutti i programmi per computer producono gli stessi output dati gli stessi input, devono essere letti da una fonte di entropia (o dati imprevedibili) nel sistema operativo o hardware. Oggigiorno abbiamo cose come il comando RdRand che può generare decine o centinaia di MB di entropia ogni secondo. Tuttavia, i dispositivi con generatori di numeri casuali hardware come Ferranti Mark 1 nel 1951 o Intel 82802 Firmware Hub nel 1999 rappresentavano l'eccezione piuttosto che la regola fino al 2010.
Quindi, i generatori di numeri storicamente casuali si basano su fonti di entropia relativamente lente come l'input umano o i tempi del computer, ei sistemi legacy potrebbero non avere quasi nessuna funzione incorporata con buone fonti di entropia disponibili. / Dev / random di Linux, ad esempio, può utilizzare l'ora di avvio, la temporizzazione dei dispositivi di input umani, le temporizzazioni del disco, le temporizzazioni IRQ e persino la modifica del pool di entropia da parte di altri thread
In molti modi generatori di numeri casuali sono fragili perché questi metodi standard per ottenere l'entropia non sono infallibili. Tutto ciò che rende queste fonti di entropia prevedibili o limitate comprometterà il tuo RNG, ad esempio:
- Il bug Debian che hai notato utilizzava solo l'ID del processo per l'entropia.
- Se si utilizza un sistema operativo headless e preconfigurato che genera chiavi all'avvio, molte delle fonti di entropia di Linux potrebbero essere prevedibili. fonte
- Java Cryptography Architecture di Android è risultato richiedere un'inizializzazione esplicita da una buona fonte di entropia su alcuni dispositivi.
- La generazione di numeri casuali troppo rapidamente in Linux esaurirà il pool di entropia più velocemente di quanto possa essere reintegrato, portando a numeri meno casuali.
Capire lo stato e la mancanza di reseeding
Spesso gli RNG non ottengono nuova entropia con ogni chiamata di funzione come fa / dev / random. A volte non puoi ottenere abbastanza entropia abbastanza velocemente, o non ti fidi completamente della fonte di entropia. Quindi, invece, l'RNG viene seminato con una fonte nota di entropia, quindi produce valori indipendenti da quel seme. Tuttavia, quando qualcuno capisce lo stato interno del generatore le cose vanno male, portando a tutto, dalla clonazione delle smart card al imbroglio di una slot machine a Las Vegas.
Un attacco di overflow del buffer o un attacco simile può rivelare lo stato del generatore di numeri casuali. L'apprendimento dello stato può anche essere possibile con un attacco di forza bruta, soprattutto se l'algoritmo è noto ed è reversibile, può essere calcolato rapidamente o è noto un testo in chiaro. Questo era il caso dei problemi con Windows XP, libreria SSH Dropbear, XorShift128 + in Chrome e algoritmo di messerne twister, tra molti altri.
La richiesta di mitigazione avanzata per questi attacchi a stati noti rende fragile l'RNG. Il modo migliore per mitigare gli attacchi a stati noti è non utilizzare un algoritmo vulnerabile (come la maggior parte dei CSRNG). Questa domanda spiega anche in modo più dettagliato esattamente cosa rende sicuro un buon RNG. Tuttavia, anche i CSRNG a volte hanno anche dei punti deboli (per esempio, la vulnerabilità RNG nel kernel Linux 2.6.10). Quindi la difesa in profondità richiede attenuazioni come l'utilizzo di stati separati per generatori di numeri casuali (forse uno per utente), l'aggiornamento frequente del seed e attraverso protezioni da attacchi di canale laterale e buffer overflow.
Passare la colpa tra sviluppatori e utenti
Spesso questi RNG sono fragili a causa della comunicazione errata delle limitazioni tra sviluppatori di librerie o creatori di sistemi operativi che non possono progettare un sistema infallibile e utenti che si aspettano uno. Linux, ad esempio, costringe gli utenti a scegliere tra alta latenza / dev / random e potenzialmente bassa entropia / dev / urandom. Come altro esempio, PHP prima della 5.3 non supportava i PRNG potenti in Windows tramite interfacce come mcrypt_create_iv () e prima della 7.0 non aveva un buon CSPRNG integrato.
Difficoltà nel rilevamento
C'è un punto di discussione popolare quando si discute di numeri casuali che, per un numero veramente casuale, ogni possibilità è ugualmente probabile e ci sono un numero infinito di schemi potenziali. Allora come puoi veramente guardare una sequenza e dire che non è casuale? (pertinente Dilbert)
In realtà, la rilevazione di pattern in numeri casuali è un campo maturo, sebbene imperfetto, e la questione se possa essere rilevata la non casualità è stata affrontata da quando M.G. L'articolo del 1938 di Kendall e B. Babington-Smith. puoi dimostrare che non è molto più probabile che appaiano tipi specifici di modelli rispetto al caso casuale. Ad esempio, posso verificare se la cifra 1 è più comune di altre cifre, con soglie determinate da un test del chi quadrato. Finché questi modelli testati sono almeno remotamente probabili e controlli un insieme sufficientemente lungo di numeri generati, le probabilità di un falso positivo sono basse. Sebbene alcuni problemi nascosti con alcuni generatori di numeri casuali possano passare inosservati per anni, se hai eseguito una crittoanalisi di base e poi applicato test di livello industriale come spiegato in questa domanda, allora non si può sbagliare.
Tuttavia, i progettisti potrebbero anche sottovalutare i loro aggressori (come si poteva prevedere che le persone effettuerebbero il reverse engineering e il tempo della tua slot machine?). Peggio ancora, a volte il generatore di numeri casuali o la generazione di entropia non vengono mai ispezionati da un esperto e viene esaminato solo il risultato dell'utilizzo dell'RNG, come quando le firme del firmware PS3 erano firmate con un output "casuale" costante.
Alla fine della giornata, il problema qui è simile a quello in gran parte della sicurezza informatica: hai un insieme molto complesso di protocolli, requisiti e dispositivi per numeri casuali. Come sempre, se non capisci la complessità, sei vulnerabile a un aggressore che lo fa.