entropia del kernel Linux - ha importanza per / dev / urandom e qual è il minimo?

8

Questa domanda è stata posta più volte, ma ancora qualcosa non è chiaramente compreso da altre risposte

Ho alcuni server in esecuzione con un kernel Linux personalizzato (moduli driver minimi, ecc.) e nessun disco collegato (tutto basato su NAS). Il kernel entropy_avail può essere più spesso 180-200 e può andare fino a 140 altre volte. Le mie applicazioni utilizzano /dev/urandom (un'applicazione java che utilizza SecureRandom() che internamente utilizza /dev/urandom )

  • Da questo bel writeup , a quanto pare, /dev/urandom flusso casuale dipende principalmente dal file seme generato al momento dell'installazione (e successiva ri-semina durante il tempo di avvio). Significa che la percentuale entropy_avail non ha alcun impatto sui numeri casuali generati con /dev/urandom . La domanda è, i numeri casuali di /dev/urandom dipendono in qualche modo dall'entropia disponibile?
  • In caso affermativo, qual è un limite inferiore accettabile per l'entropia disponibile nel sistema? (200, 256? Ce ne sono molti che vengono citati là fuori.)
  • Se no, quindi citando la pagina man.

    A read from the /dev/urandom device will not block waiting for more entropy. If there is not sufficient entropy, a pseudorandom number generator is used to create the requested bytes.

  •   
  Non è contraddittorio?
  • Il significato di entropy_avail . Dalla pagina man comprendiamo che la dimensione del pool di entropia totale è 4096 bit , il che implica che ci sono 2 ^ 4096 possibilità per il risultato. Quindi se entropy_avail è 140 significa che si riduce a 2 ^ 140? Continuo a pensare che sia un numero enorme, da che punto dovrei iniziare a preoccuparmi?
  • Nel mio caso, come potete vedere, il entropy_avail è probabilmente inferiore a quello osservato su un normale sistema desktop. Dovrei considerare gli strumenti di generazione di entropia del software (haveged, rngd, ecc.) O qualche hardware specifico per aiutare a migliorarlo. Avrebbe davvero un impatto sull'output di /dev/urandom ?
posta user3461411 20.04.2015 - 18:17
fonte

2 risposte

16

Entropia è richiesto nel seguente senso: se un PRNG ha solo n bit di entropia, vuol dire che ha (concettualmente) solo 2 < em> n possibili stati interni, e quindi potrebbe essere suddiviso in enumerazione brutale di questi 2 n stati, a condizione che n è sufficientemente basso perché un tale attacco di forza bruta sia fattibile.

Quindi le cose diventano complesse, perché il "livello di entropia" riportato dal kernel NON è l'entropia. Non quello di cui parlo sopra.

Da un punto di vista crittografico , l'algoritmo che calcola l'output di entrambi /dev/random e /dev/urandom è un (presumibilmente) PRNG crittograficamente sicuro . Ciò che conta per la sicurezza pratica è, infatti, l'entropia accumulata dello stato interno. Escludendo le carenze crittografiche in quel PRNG (nessuno è noto al momento), quell'entropia può solo aumentare o rimanere costante nel tempo. Infatti, "entropia" può anche essere chiamata "ciò che l'attaccante non sa" e se il PRNG è effettivamente crittograficamente sicuro, quindi, per definizione, l'osservazione di gigabyte di output produce solo informazioni trascurabili sullo stato interno. Questo è ciò che crittograficamente sicuro significa.

Pertanto, se /dev/urandom aveva 200 bit di entropia a un certo punto dall'ultimo avvio, allora ancora ha 200 bit di entropia, o anche di più.

Dal punto di vista di chiunque abbia scritto quel codice (e la temuta pagina man corrispondente), l'entropia è "depleta" dopo l'uso. Questa è la posizione di qualcuno che assume, per il gusto dell'argomento, che il PRNG è non crittograficamente sicuro, ed è in effetti in qualche modo equivalente a emettere semplicemente lo stato interno così com'è. Da quel punto di vista, se /dev/random inizia con n bit di entropia e output k bit, allora ha ora nk bit di entropia .

Tuttavia, questo punto di vista non è alla fine sostenibile, perché mentre si basa sul presupposto che il PRNG sia completamente rotto e una non-operazione, è anche basato, allo stesso tempo , partendo dal presupposto che il PRNG è ancora crittograficamente abbastanza sicuro da trasformare "l'entropia dell'hardware" (le fonti di elementi di dati che si presume siano in qualche modo casuali) in una sequenza di bit uniforme e omogenea. In poche parole, la nozione di esaurimento dell'entropia funziona solo fino a quando assumiamo l'ipotesi estrema che il PRNG sia del tutto debole, ma sotto questa ipotesi la stima di quanto entropia sia veramente è completamente fuori.

In sostanza, quel punto di vista è contraddittorio. Sfortunatamente, /dev/random implementa una strategia di blocco basata su questa errata stima dell'entropia, il che è piuttosto scomodo.

/dev/urandom non blocca mai , indipendentemente da quanto "entropia hardware" è stata raccolta dall'ultimo avvio. Tuttavia, nelle installazioni "normali" di Linux, un seme casuale viene inserito all'inizio del processo di avvio; quel seme è stato salvato all'avvio precedente e si rinnova immediatamente dopo l'inserimento. Quel seme per lo più estende l'entropia di /dev/urandom tra i riavvii. Quindi l'asserzione diventa: se /dev/urandom aveva 200 bit di entropia in qualsiasi momento da quando il sistema operativo è stato installato per la prima volta , allora ha ancora 200 bit di entropia.

Questo comportamento può ancora essere un po 'problematico per alcuni casi specifici, ad es. avvio senza disco. La macchina di avvio potrebbe aver bisogno di un po 'di prima di avere accesso ai suoi file (ad es. Per stabilire un IPsec contesto necessario per raggiungere il server che contiene i suddetti file). Un'implementazione migliore di /dev/urandom verrebbe bloccata fino a quando non è stata raccolta una quantità sufficiente di entropia hardware (ad esempio 128 bit), ma produrrebbe bit "per sempre", senza implementare una sorta di esaurimento di entropia. Questo è esattamente ciò che fa /dev/urandom di FreeBSD. E questo è buono.

Riepilogo: non preoccuparti. Se il PRNG utilizzato nel kernel è crittograficamente sicuro, come sembra, allora il conteggio "entropy_avail" non ha senso. Se il PRNG utilizzato nel kernel è non crittograficamente sicuro, allora il conteggio "entropy_avail" è ancora imperfetto, e comunque sei nei guai più profondi.

Si noti che le istantanee VM interrompono l'entropia, poiché il comportamento della VM dopo il ripristino funzionerà sempre sullo stato che è stato salvato nell'istantanea e divergerà solo attraverso l'accumulo di nuovi eventi hardware (che possono essere complicati in un VM, dal momento che l'hardware della VM non è vero hardware). Il contatore "entropy_avail" del kernel e il comportamento di blocco /dev/random , cambiano niente affatto . Lo snapshot / ripristino VM è una vulnerabilità di sicurezza molto più plausibile per il PRNG del sistema rispetto allo scenario accademico puramente teorico che "entropy_avail" tenta di acquisire (e in realtà non riesce).

    
risposta data 20.04.2015 - 19:07
fonte
-1

Esiste l'istruzione RDRAND basata su hardware sui processori Intel IvyBridge. Se questo è disponibile (ad es. Il chip è installato e non ha il bug di hardware RDRAND) allora penso che Linux lo usi automaticamente. Significa che dovresti ottenere quantità molto elevate di numeri casuali veri molto velocemente.

    
risposta data 20.04.2015 - 23:56
fonte

Leggi altre domande sui tag