Attacchi temporali nel codice a livello applicativo
Scopra come i tempi di confronto tra stringhe possano rivelare segreti e come il confronto constant-time prevenga il problema.
Attacchi temporali nel codice a livello applicativo è una lezione Cryptology Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Cryptology Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Cryptology Academy include 4 lezioni in totale.
Confronto tra stringhe non eseguito in tempo costante
L'operatore standard di uguaglianza tra stringhe nella maggior parte dei linguaggi di programmazione termina non appena trova una discordanza. == di Python sugli oggetti bytes, strcmp di C e String.equals di Java restituiscono il risultato immediatamente quando trovano il primo byte diverso. Per un normale confronto tra stringhe questa è un'ottimizzazione, ma nel confronto di valori segreti come tag MAC o password crea un canale laterale temporale misurabile che divulga informazioni.
Misurazione del tempo di confronto degli HMAC
Un attaccante misura il tempo necessario per confrontare un tag HMAC inviato con il valore corretto. L'invio di un HMAC il cui primo byte coincide correttamente richiede leggermente più tempo rispetto a uno in cui il primo byte è errato, perché viene eseguito un confronto aggiuntivo. Inviando molti valori con ogni possibile primo byte e misurando i tempi di risposta, l'attaccante identifica il primo byte corretto. Il processo viene ripetuto byte dopo byte fino a recuperare l'intero tag.
Precisione temporale pratica degli attacchi
I moderni attacchi di temporizzazione sulla rete possono rilevare su Internet differenze temporali dell’ordine di decine o centinaia di nanosecondi. Un confronto HMAC di 32 byte, in cui ogni byte corretto aggiunge circa 10-100 ns al tempo di elaborazione, produce un segnale misurabile se si effettuano abbastanza misurazioni ripetute da mediare il jitter di rete. In una rete locale, anche differenze di un singolo nanosecondo possono essere sfruttate con un campionamento statistico sufficiente.
Vulnerabilità dell’operatore == in Python
In Python, confrontare i tag MAC con == non è sicuro: se mac == submitted_mac restituisce True o False in base alla posizione della prima discordanza. Un attaccante che invia migliaia di tag appositamente creati e misura i tempi di risposta può recuperare il tag atteso byte per byte. Questa vulnerabilità è comparsa in applicazioni web di produzione che implementavano in modo errato il confronto di token di sessione o chiavi API senza funzioni a tempo costante.
hmac.compare_digest in Python
La funzione hmac.compare_digest(a, b) di Python confronta due valori di tipo bytes o stringa in tempo costante, impiegando lo stesso tempo indipendentemente dalla posizione della prima discordanza. È implementata in C per garantire un comportamento a tempo costante anche considerando l’overhead dell’interpretazione del bytecode Python. Utilizzi sempre hmac.compare_digest per confrontare tag MAC, token di sessione, chiavi API o qualsiasi valore per il quale le informazioni temporali potrebbero essere pericolose.
CRYPTO_memcmp in OpenSSL
OpenSSL fornisce CRYPTO_memcmp(a, b, length) per il confronto a tempo costante della memoria. A differenza di memcmp, elabora sempre tutti i byte length, indipendentemente dalle eventuali discordanza iniziali. Il valore restituito è zero se i valori sono uguali e diverso da zero se sono differenti. È importante confrontare sempre l’intera lunghezza attesa: confrontare valori di lunghezza diversa usando quella più breve può comunque rivelare informazioni sulla lunghezza. Utilizzi CRYPTO_memcmp in qualsiasi confronto critico per la sicurezza nel codice C/C++ che usa OpenSSL.
Attacchi di temporizzazione su RSA: Bleichenbacher
Gli attacchi di temporizzazione vanno oltre il confronto di stringhe. L’attacco del 2006 di Bleichenbacher sulla decrittografia RSA PKCS#1 v1.5 ha dimostrato l’esistenza di un oracolo temporale pratico contro le implementazioni SSL/TLS. Il tempo dell’operazione con la chiave privata RSA variava a seconda che il valore decrittografato contenesse o meno un padding PKCS#1 valido. Inviando migliaia di testi cifrati appositamente creati, gli attaccanti potevano recuperare le chiavi private RSA. Questo ha motivato l’adozione di RSA-OAEP e di implementazioni RSA a tempo costante.
Attacchi di temporizzazione della cache su AES
Le implementazioni di AES che usano tabelle di ricerca, comuni per motivi di prestazioni, accedono a voci diverse della tabella in base alla chiave e al testo in chiaro. I riscontri e i mancati riscontri nella cache creano differenze temporali misurabili che rivelano quali voci della tabella sono state consultate. Questo canale laterale può rivelare le chiavi AES. La difesa consiste nell’utilizzare implementazioni di AES che non si basano su ricerche in tabelle, come le istruzioni hardware AES-NI o le implementazioni software bit-sliced.
Principi di implementazione a tempo costante
Per scrivere codice a tempo costante è necessario evitare: i rami condizionali basati su dati segreti, usando invece una selezione senza diramazioni mediante mascheramento; i pattern di accesso alla memoria che dipendono da dati segreti, evitando le tabelle di ricerca indicizzate da segreti; e qualsiasi operazione la cui latenza dipenda da valori segreti, come la divisione su alcuni processori. I compilatori possono ottimizzare eliminandole, quindi nelle sezioni critiche potrebbero essere necessari codice assembly o accessi a memoria volatile.
AEAD elimina il confronto dei MAC a livello applicativo
La migliore difesa contro gli attacchi di temporizzazione nel confronto dei MAC consiste nell’utilizzare modalità AEAD, come GCM e ChaCha20-Poly1305, e delegare la verifica del MAC alla libreria crittografica. Le implementazioni delle librerie eseguono internamente la verifica a tempo costante. Se utilizza correttamente AEAD, ovvero se la decrittografia fallisce in caso di qualsiasi manomissione e non decrittografa mai prima di aver verificato il tag, non dovrà mai confrontare i tag MAC nel codice dell’applicazione, eliminando completamente la vulnerabilità di temporizzazione.
Test per individuare vulnerabilità di temporizzazione
Per testare le vulnerabilità di temporizzazione è necessaria un’analisi statistica delle distribuzioni dei tempi di risposta. Strumenti come tlsfuzzer, gli script per il test degli attacchi di temporizzazione e il framework dudect aiutano a rilevare differenze temporali nelle implementazioni crittografiche. Un t-test sui campioni dei tempi di risposta relativi a input che dovrebbero produrre lo stesso tempo può rivelare differenze statisticamente significative. Sono possibili falsi negativi; oltre ai test è quindi essenziale anche una revisione del codice a tempo costante.
Confronto a tempo costante
Quale funzione Python dovrebbe utilizzare per confrontare in modo sicuro un tag HMAC e prevenire gli attacchi di temporizzazione?
Riepilogo degli attacchi di temporizzazione
Riepilogo degli attacchi di temporizzazione: il confronto di stringhe con uscita anticipata rivela i valori segreti byte per byte attraverso differenze nei tempi di risposta; queste differenze sono misurabili sulla rete con un numero sufficiente di campioni; utilizzi hmac.compare_digest in Python e CRYPTO_memcmp in OpenSSL per i confronti a tempo costante; gli attacchi di temporizzazione sul padding RSA compromettono le chiavi private, quindi utilizzi RSA a tempo costante e OAEP; gli attacchi di temporizzazione sulle ricerche nelle tabelle AES rivelano bit della chiave, quindi utilizzi AES-NI o implementazioni bit-sliced; infine, la verifica AEAD della libreria elimina la necessità di confrontare i MAC a livello applicativo.
Domande Frequenti
La lezione «Attacchi temporali nel codice a livello applicativo» è gratuita?
Sì — il testo completo di «Attacchi temporali nel codice a livello applicativo» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Cryptology Academy, passa a CoddyKit PRO. Il corso Cryptology Academy include 4 lezioni in totale.
Cosa imparerò in «Attacchi temporali nel codice a livello applicativo»?
Scopra come i tempi di confronto tra stringhe possano rivelare segreti e come il confronto constant-time prevenga il problema. Eserciti Cryptology Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Cryptology Academy?
Non è richiesta alcuna esperienza precedente. Cryptology Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Attacchi temporali nel codice a livello applicativo»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Cryptology Academy?
Sì. Ogni lezione Cryptology Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Attacchi padding oracle nel dettaglio
- Attacchi replay e vulnerabilità del riutilizzo dei nonce
- Attacchi temporali nel codice a livello applicativo
- Principali schemi di uso improprio della crittografia