Come proteggersi dagli "attacchi oracle di padding".

8

Ho bisogno di crittografare qualcosa sul mio server e salvare il risultato. Poiché non sono un esperto di sicurezza, voglio implementare il maggior numero possibile di codice esistente.

Ho trovato una funzione di compilazione completa su php.net ma dice che " non è protetto contro gli attacchi di oracle. "

Che cosa sono "padding oracle attack" e cosa dovrei fare al riguardo?

    
posta phduser 15.07.2013 - 01:11
fonte

4 risposte

14

Il padding oracle è una miscela di un difetto di protocollo e un difetto di implementazione. Vale a dire, un "oracle padding" perde alcune informazioni sui dati segreti attraverso il modo in cui reagisce all'input non valido elaborato in modo pericoloso. Un protocollo buono prima convaliderà i dati di input attraverso un MAC prima considerando la decrittazione e il suo corollario, l'elaborazione delle imbottiture. Questo è ciò che riguarda la costruzione "encrypt-then-MAC". Un protocollo cattivo farà le cose nell'ordine sbagliato e potrebbe soffrire di perdite applicando prima la decrittografia; questo è ciò che accade in SSL con le modalità di crittografia CBC.

Se il protocollo non è valido, l'implementazione deve essere particolarmente protetta dal tipo di messaggi non validi che gli autori degli attacchi tenteranno di eseguire manualmente per trasformare un'implementazione (ad esempio un server) in un oracle di riempimento. Tale schermatura è difficile (ad esempio l'attacco Lucky Thirteen dimostra, in condizioni di laboratorio, la possibilità teorica di perdite anche con implementazioni completamente schermate).

Anche la funzione PHP che colleghi è solo sulla crittografia; per definizione, non può fare nulla contro gli oracoli di imbottitura. La protezione contro gli oracoli di imbottitura è più al livello del protocollo . Come tipico di PHP, la funzionalità pericolosa viene fornita con un piccolo avvertimento e un'API subottimale.

Progettare il proprio protocollo sicuro è ancora più difficile della protezione contro gli attacchi dei canali laterali, quindi non farlo. E anche se fai , non farlo in PHP.

    
risposta data 16.07.2013 - 16:39
fonte
11

Per proteggerti dagli oracoli di imbottitura, assicurati che l'applicazione non restituisca un errore diverso quando il padding è sbagliato. Il modo migliore per farlo è un Encrypt-then- Costruzione MAC , dove viene applicato un codice di autenticazione dei messaggi (MAC) al testo cifrato. Se il MAC fallisce, non hai nemmeno bisogno di guardare il padding. Se il MAC è corretto, è crittograficamente improbabile che il padding sia stato manomesso.

    
risposta data 15.07.2013 - 07:29
fonte
2

Il Padding Oracle Attack è un attacco di canale laterale che può essere utilizzato per decifrare i cifrari simmetrici di ECB o CBC. Questo attacco funziona a perdita di informazioni sul padding durante la decodifica del testo cifrato. Per evitare ciò, è possibile aggiungere l'autenticazione al testo cifrato, ad esempio utilizzando HMAC. La tecnica più utilizzata è Encrypt-then-MAC .

In PHP, puoi usare Zend \ Crypt \ BlockCipher componente di Zend Framework 2, che implementa Encrypt-then-MAC utilizzando HMAC, fornendo un'API molto semplice:

use Zend\Crypt\BlockCipher;

$blockCipher = BlockCipher::factory('mcrypt', array('algo' => 'aes'));
$blockCipher->setKey('encryption key');
$ciphertext = $blockCipher->encrypt('this is a secret message');
echo "Ciphertext: $ciphertext \n";
$plaintext = $blockCipher->decrypt($ciphertext);
echo "Plaintext: $plaintext \n";
    
risposta data 28.05.2014 - 11:41
fonte
1

Per dirla a modo mio, in primo luogo, un "oracolo" in crittografia si basa sul concetto di un oracolo mitologico; una persona con una linea diretta a una divinità, e quindi con accesso a informazioni che i comuni mortali non hanno. Nella crittografia, gli oracoli sono "scatole nere" in grado di eseguire compiti che sarebbero difficili per l'aggressore e possono quindi fornire a un utente malintenzionato le informazioni che sono normalmente difficili da ottenere.

Un oracle di riempimento, in particolare, può dire al malintenzionato se un messaggio che inserisce in esso è adeguatamente riempito (la maggior parte delle modalità di cifratura utilizza una forma di riempimento rimovibile dei dati per garantire che la lunghezza del messaggio sia un multiplo esatto della dimensione del blocco della cifra ). Lo fa tentando di decrittografare il messaggio e comportandosi in modo diverso quando un blocco è o non è riempito correttamente, tali differenze di comportamento sono visibili all'attaccante. L'oracolo di imbottitura è di solito un partecipante inconsapevole; l'attaccante in genere dirotta un'implementazione cifrata inizializzata, alimentando messaggi appositamente predisposti di sua scelta in quello che è noto come un attacco di testo cifrato scelto.

Un tipo di attacco correlato è un attacco a tempo; è un modo in cui un'implementazione di decrittografia può essere trasformata in un oracle di riempimento, misurando il tempo necessario per determinare se il blocco è adeguatamente riempito. Alcune modalità di cifratura, come CBC, possono essere decifrate in qualsiasi ordine, quindi alcune implementazioni decodificheranno l'ultimo blocco per controllare il riempimento del messaggio, nel tentativo di "fallire velocemente" sui messaggi corrotti. Tuttavia, la differenza tra il tempo necessario per controllare il padding e per tentare di decrittografare il messaggio completo può essere utilizzata da un utente malintenzionato per determinare quale dei due è successo, anche se l'errore mostrato all'attaccante è lo stesso in entrambi i casi.

Per proteggersi da questi tipi di attacchi, non deve esserci differenza di comportamento distinguibile tra un tentativo di decifrare un messaggio che non è adeguatamente riempito rispetto a uno che è. Il modo più noto per farlo è quello di incorporare un checksum sicuro noto come un codice di autenticazione dei messaggi. Questo MAC è tipicamente prodotto da un sicuro "hash con chiave", utilizzando la stessa chiave che ha crittografato il messaggio. Il messaggio viene prima crittografato e quindi il testo cifrato, insieme alle informazioni su come è stato crittografato, come l'algoritmo di cifratura, la modalità di cifratura, la dimensione della chiave, la dimensione del blocco e IV, viene sottoposto a hash utilizzando l'algoritmo MAC e la stessa chiave.

Per decrittografare, l'algoritmo ricalcola innanzitutto il MAC dato il testo cifrato e le informazioni di cifratura condivise tra i due computer. Se il MAC calcolato non corrisponde a quello incluso nel testo cifrato, la decrittografia fallisce; o il messaggio, MAC o entrambi sono stati cambiati in transito con qualche mezzo, o benigno (corruzione dei dati) o malevolo (tentativo di attacco).

Le probabilità che un utente malintenzionato, non conoscendo la chiave, sia in grado di cambiare il testo cifrato e il suo MAC in modo coerente è ritenuto difficile, e con questo intendo approssimativamente 1 su 2 ^ (keysize) possibilità, quindi la strategia di cambiare sistematicamente il messaggio diventa meno efficiente di provare semplicemente ogni possibile chiave. Inoltre, poiché la stessa operazione, che richiede sempre lo stesso tempo, è in grado di rilevare qualsiasi problema di dati post-crittografia che renderebbe il messaggio non valido, un utente malintenzionato non può rilevare la differenza apportata da qualsiasi modifica sistematica al testo cifrato e al MAC ; o corrisponde (estremamente improbabile; vedi sopra) o non ( molto più probabile).

    
risposta data 16.07.2013 - 17:30
fonte

Leggi altre domande sui tag