Quando si parla di sicurezza delle informazioni e dei sistemi ICT, tra i temi più importanti da tenere in considerazione troviamo senza ombra di dubbio la crittografia. Questa infatti, è alla base della segretezza e sicurezza delle informazioni che viaggiano in rete ma anche, più in generale, di tutte le informazioni gestite da un generico prodotto ICT, hardware o software che sia.
Tuttavia, la crittografia, come in molti sapranno, non è di certo un’invenzione dei giorni nostri. I primi esempi infatti risalgono addirittura agli egizi, passando poi per i Romani ed altre popolazioni che ne facevano uso già all’epoca per nascondere le proprie comunicazioni da occhi indiscreti.
Sicurezza degli algoritmi crittografici
Durante gli anni, di algoritmi crittografici se ne sono susseguiti parecchi e la maggior parte di questi sono stati, ad un certo punto del loro utilizzo, abbandonati perché divenuti ‘insicuri’. Quali sono quindi i criteri che permettono di stabilire se un algoritmo è sicuro o meno? Su cosa si basa la sicurezza di un algoritmo?
Attacchi matematici
In generale, un algoritmo crittografico è sicuro se non è vulnerabile ad attacchi noti. Entra qui in gioco la crittoanalisi, ovvero l’opposto della crittografia. Lo scopo della crittoanalisi è infatti quello di rompere un algoritmo crittografico in modo da recuperare le chiavi che questo utilizza o i messaggi originariamente criptati.
Le tipologie di attacco, che derivano dalla crittoanalisi, alle quali un algoritmo non deve essere vulnerabile per essere sicuro sono:
- Ciphertext-only attack: qui il crittoanalista è in possesso di uno o più messaggi cifrati che può aver facilmente ottenuto dal canale di comunicazione. L’obiettivo è quello di correlare questi testi cifrati in modo da essere in grado di ricostruire i messaggi originari o, nel caso migliore, la chiave di cifratura.
- Adaptive Chosen-plaintext attack: qui il crittoanalista ha a disposizione ad un messaggio in chiaro e al corrispondente messaggio cifrato. In più, egli ha la possibilità di interagire con il dispositivo cifrante e di modificare il contenuto del messaggio in chiaro, ottenendo così una serie di messaggi in chiaro con i corrispondenti messaggi cifrati. L’obiettivo è quello di risalire alla chiave utilizzata per cifrare i messaggi.
- Chosen-plaintext attack: in questo attacco il crittoanalista ha a disposizione uno o più messaggi in chiaro e i corrispondenti messaggi cifrati. Tramite questi, se l’algoritmo è vulnerabile, egli è in grado di risalire al valore della chiave utilizzata per cifrare questo messaggio. Questo permetterebbe all’attaccante di decifrare tutti i messaggi cifrati con la stessa chiave che è stata recuperata.
- Related-key attack: questo tipo di attacco è molto simile al precedente, con la differenza che ora il crittoanalista ha a disposizione una serie di messaggi cifrati con chiavi differenti. Se queste chiavi sono correlate tra di loro, questo permetterebbe all’attaccante di recuperare le chiavi stesse in parte o totalmente.
- Known-plaintext attack: qui il crittoanalista ha a disposizione un messaggio noto o parte di esso ed il corrispondente messaggio cifrato. Tramite la conoscenza dell’algoritmo che è stato utilizzato, esso può essere in grado di risalire alla chiave utilizzata per cifrare il messaggio. Questo permetterebbe all’attaccante di decifrare tutti i messaggi cifrati con la stessa chiave che è stata recuperata.
- Chosen-ciphertext attack: questa volta il crittoanalista sceglie un insieme di messaggi cifrati e ottiene i corrispondenti messaggi in chiaro. Tramite queste informazioni, egli prova a ricostruire la chiave che è stata utilizzata per cifrare i messaggi.
Un esempio di algoritmo vulnerabile a questo tipo di attacchi analitici è l’algoritmo di cifratura a chiave simmetrica RC4 utilizzato nel protocollo WEP di cifratura delle reti wireless. Questo algoritmo è stato infatti dimostrato essere vulnerabile a related-key attacks. In pratica, un potenziale attaccante, semplicemente ascoltato i messaggi cifrati di passaggi sulla rete wireless, è in grado di correlarli e risalire alla master WEP key utilizzata per la cifratura. Questa chiave infatti doveva essere cambiata manualmente nel protocollo WEP. Il motivo risiede nel fatto che la master WEP key è concatenata ad un IV (initialization vector) noto e questa concatenazione di valori viene usata per derivare la chiave simmetrica utilizzata da RC4 per cifrare i messaggi. Quello che accade nella pratica è che le chiavi degli access point sono cambiate molto di rado (la famosa password del router che non cambiamo praticamente mai in un utilizzo comune), risultando nell’utilizzo della stessa mater key per tutte le comunicazioni wireless all’interno della rete. È facile quindi capire come le chiavi derivate da quest’ultima siano correlate tra loro e permettano ad un attaccante in ascolto di risalire alla WEP key. Esso sarà da questo momento in grado di decifrare qualsiasi messaggio inviato sulla rete fino a quando la master key non verrà cambiata.
Attacchi all’implementazione
Oltre ad attacchi di tipo analitico, un algoritmo crittografico può essere soggetto anche ad attacchi di tipo pratico, legati all’implementazione dell’algoritmo stesso, del protocollo in cui questo viene utilizzato o dell’ambiente di esecuzione in cui risiede. Alcuni esempi di questi attacchi sono:
- Dictionary attack: l’attaccante costruisce un dizionario di messaggi in chiaro e corrispondenti messaggi cifrati e utilizza questo dizionario per decifrare immediatamente i messaggi che ha già visto. Questo attacco viene solitamente utilizzato per recuperare password di accesso note che sono solitamente offuscate tramite algoritmi di hashing.
- Chosen-key attack: l’attaccante è in grado di sfruttare una vulnerabilità del sistema che ospita l’algoritmo di generazione delle chiavi crittografiche. Avendo accesso al sistema, l’attaccante è in grado di controllare la generazione delle chiavi e quindi anche di avere accesso a tutte le informazioni in chiaro.
- Man-in-the-middle attack: in questo caso l’attacco viene portato sul protocollo di comunicazione che utilizza uno specifico algoritmo crittografico. In particolare, l’attaccante si inserisce nel canale di comunicazione e negozia i parametri di cifratura con entrambe le parti, gestendo due sessioni parallele. In questo modo, egli è in grado di decifrare i messaggi in arrivo da entrambe le sessioni.
- Side-channel attacks: questi mirano a sfruttare l’operational environment dove viene eseguito l’algoritmo crittografico. Tramite la misurazione di vari fattori come il consumo elettrico, i campi elettromagnetici, tempi di esecuzione, etc., l’attaccante prova a dedurre informazioni utili a rompere l’algoritmo di crittografia stesso.
Gli attacchi che abbiamo appena descritto sono solitamente legati a vulnerabilità note o a debolezze dei protocolli e/o sistemi dove gli algoritmi sono utilizzati. È quindi generalmente possibile mitigare le vulnerabilità in modo da rendere questi attacchi molto più difficili da effettuare o, in alcuni casi, impossibili.
Un esempio di algoritmo vulnerabile a questo tipo di attacchi è RSA. Esso infatti è vulnerabile a timing side-channel attacks. In particolare, un attaccante, misurando i tempi di esecuzione dell’esecuzione dell’algoritmo di decifratura, può essere in grado di individuare i bit della chiave segreta utilizzata. Il motivo risiede nel fatto che l’algoritmo utilizzato richiede tempi leggermente diversi ad eseguire a seconda di quanti bit della chiave sono ad 1 e quanti di bit sono a 0.
La possibilità di subire questo attacco può però essere completamente eliminata implementando il metodo di RSA blinding che prevede l’aggiunta di un elemento di randomicità nell’esecuzione dell’algoritmo RSA, atto a mascherare i bit della chiave segreta, che lo rende non più vulnerabile a timing attacks.
Attacchi alle chiavi
Tuttavia, un attacco a cui gli algoritmi crittografici saranno sempre vulnerabili è il brute-force attack, che mira a recuperare le chiavi crittografiche tentando di utilizzare tutti i possibili valori che queste posso assumere all’interno del loro spazio.
Per poter essere sicure, le chiavi devono essere abbastanza lunghe e generate in modo imprevedibile da un attaccante.
È facile intuire come una chiave molto corta sia facilmente soggetta a brute-force attacks. Un attaccante può infatti essere in grado di coprire facilmente tutto lo spazio di possibili chiavi provando tutti i possibili valori e finendo per trovare con certezza il valore corretto in un tempo ragionevole.
La lunghezza non è però l’unico fattore che rende una chiave sicura. Questa deve essere infatti generata in modo imprevedibile ad un possibile attaccante.
Facciamo un esempio per capire bene questo concetto. Supponiamo che un algoritmo a chiave simmetrica utilizzi chiavi di 256 bits e non sia vulnerabile ad attacchi noti (tra quelli descritti in precedenza). Lo spazio delle chiavi di cui questo algoritmo dispone è 2256 possibili valori. Questo sarebbe teoricamente sufficiente per rendere questo algoritmo sicuro e non vulnerabile a brute force attacks.
Tuttavia, se l’utilizzatore di questo algoritmo genera le chiavi in modo deterministico o prevedibile (e.g., parte della chiave generata è fissata oppure le chiavi sono generate tramite un algoritmo deterministico), l’attaccante sarebbe in grado di diminuire in maniera drastica il numero di valori possibili che questa chiave può avere, rendendo l’algoritmo vulnerabile ad un brute-force attack in quella specifica circostanza.
Un altro fattore da tenere in considerazione riguardo la sicurezza delle chiavi è la costante evoluzione tecnologica dei calcolatori. Con l’aumento del numero di operazioni al secondo che una CPU o GPU è in grado di eseguire, aumentano anche le possibilità che questi possano esser utilizzati da potenziali attaccanti per effettuare brute-force attacks sulle chiavi crittografiche e non solo.
Il modo migliore per capire questo concetto è tramite un esempio pratico: il cifrario simmetrico DES. Tale algoritmo fu scelto come standard FIPS (Federal Information Processing Standard) nel 1976 e successivamente anche utilizzato come standard di crittografia simmetrica a livello internazionale. L’algoritmo utilizza chiavi simmetriche di 64 bit, si cui 8 sono bit di controllo e 56 sono effettivamente utilizzati come chiave. Lo spazio di chiavi a sua disposizione era quindi di 256 possibili valori.
Ai tempi in cui questo algoritmo venne adottato, le capacità computazionali dei calcolatori non erano sufficiente a permettere ad un potenziale attaccante di coprire facilmente questo spazio di chiavi, portando a compimento un attacco a forza bruta in un tempo ragionevole.
Tuttavia, già nel 1999 venne dimostrato un attacco in grado di individuare la chiave dell’algoritmo in un tempo di circa 22 ore. Appena dieci anni dopo, nel 2009, l’evoluzione della tecnologia ha reso possibile lo stesso attacco in un tempo molto inferiore di appena qualche ora.
Questo fu il motivo per il quale l’utilizzo di questo algoritmo fu progressivamente abbandonato ed oggi è stato soppiantato dall’algoritmo AES, il quale utilizza chiavi molto più lunghe (128, 192, 256 bits) che lo rendono, anche ai giorni d’oggi, molto resiliente a brute force attacks.
Panoramica odierna sugli algoritmi
Questa breve panoramica sui possibili attacchi e le possibili vulnerabilità che un algoritmo crittografico può esporre, dovrebbe chiarire gli aspetti che devono essere considerati quando si vuole sviluppare un applicativo che implementi uno o più algoritmi crittografici che siano effettivamente sicuri.
Per quanto riguarda gli attacchi matematici (legati alla crittoanalisi pura) agli algoritmi, la fonte di informazione principale da tenere in considerazione sono i paper scientifici che li espongono e dimostrano. Molti di questi paper basano le loro esposizioni solo su dimostrazioni teoriche che evidenziano come, in linea di principio, un algoritmo crittografico possa essere matematicamente vulnerabili a certi tipi di attacchi. A livello pratico, molti di questi attacchi risultano difficilmente realizzabili.
Alcuni però, mostrano anche esempi pratici (sviluppati in codice) degli attacchi che descrivono. Questi hanno una più alta valenza inquanto dimostrano come l’attacco sia effettivamente fattibile nella pratica, evidenziando la sua difficoltà computazionale e le tempistiche necessarie perché l’attacco abbia successo se portato sfruttando la tecnologia disponibile nel momento in cui il paper viene pubblicato.
In generale però, tutti i paper mostrano anche le possibili soluzioni che possono rendere l’algoritmo sicuro contro gli attacchi che evidenziano, oppure mostrano un algoritmo alternativo, da poter utilizzare in luogo a quello vulnerabile, che non evidenzia le stesse debolezze. Per questo motivo, è sempre utile essere informati su queste pubblicazioni.
Dal lato degli attacchi alle implementazioni degli algoritmi, la migliore fonte di informazione sono naturalmente i database di vulnerabilità note come NVD (National Vulnerability Database) che mantengono un elenco aggiornato di queste ultime. Questo elenco è naturalmente in continua evoluzione e viene aggiornato ogni qual volta che una nuova vulnerabilità viene segnalata.
Per questo motivo, un potenziale vendor che desideri fornire un prodotto che implementa algoritmi crittografici ai propri clienti è quindi sempre fortemente invitato a monitorare costantemente questi database, così come farebbe per qualsiasi altro prodotto informatico da mettere in commercio.
Allo stesso tempo, gli acquirenti di prodotti ICT, sono invitati a non fidarsi ciecamente del prodotto che acquistano. Al contrario, sarebbe sempre buona pratica verificare che questo non sia esposto a nessuna vulnerabilità nota.
Il discorso degli attacchi a forza bruta sulle chiavi è un po’ più complesso da affrontare. L’unica possibile cosa da fare è monitorare con costanza l’evoluzione delle unità di calcolo che vengono messe in commercio (principalmente CPU e GPU) tenendo in considerazione, in termini di numero di operazioni al secondo che queste possono effettuare, il tempo che impiegherebbero a individuare la chiave di uno specifico algoritmo.
È In questo ambito che ultimamente entra in gioco anche il discorso quantum computing. A livello teorico, l’applicazione del quantum computing porterebbe le capacità computazionali dei calcolatori ad aumentare in maniera esponenziale, rendendo vulnerabili ad attacchi a forza bruta tutti gli algoritmi crittografici attualmente in uso.
L’unico modo per poter contrastare questa evoluzione tecnologica è quindi quello di prepararsi sviluppando nuovi algoritmi specifici che siano abbastanza complessi da rendere il compito dei brute force attacks non raggiungibile anche considerando una capacità computazionale molto elevata come quella dei futuri quantum computers.
Cosa fare quindi?
È chiaro come siano tanti gli elementi da tenere in considerazione quando si vuole essere sicuri che gli algoritmi utilizzati e le loro implementazioni tecnologiche siano sicuri. Perciò, il miglior modo per essere “al passo con i tempi” quando si tratta di crittografia e sicurezza è quello di affidarsi alle raccomandazioni che arrivano dagli enti di standardizzazione che forniscono indicazioni in materia.
Al giorno d’oggi, uno dei maggiori enti di standardizzazione da tenere in considerazione è il FIPS (Federal Information Processing Standard), gestito dall’ente americano NIST (National Institute of Standard and Technology) tramite il programma dedicato nominato CMVP (Cryptographic Module Validation Program). Nel contesto di questo programma, il NIST mantiene una serie di standard chiamati Special Publications dove descrive e regolamenta l’utilizzo degli algoritmi crittografici. In parallelo, il CMVP si occupa tramite i laboratori di test accreditati, di fornire ai vendor un processo di certificazione crittografica che evidenzia come un prodotto IT implementi protocolli crittografici che sono compliant con tutte le SP del NIST.
Questa compliance garantisce a chi acquista e utilizza un prodotto IT che tale prodotto utilizza protocolli crittografici aggiornati e in modo sicuro. Tale garanzia nasce dal fatto che il NIST aggiorna in maniera costante le sue Special Publications in modo da mantenere gli standard crittografici e il loro utilizzo aggiornati e sicuri, sulla base dello stato dell’arte degli attacchi e delle vulnerabilità conosciuti.
Nello scopo di fare una breve panoramica su cosa è considerato sicuro (e quindi “approvato”) al giorno d’oggi, nel contesto delle certificazioni FIPS, i riferimenti da poter prendere sono le SP 800-140C e SP 800-140D. All’interno di queste SP, troviamo un elenco comprensivo di tutti gli algoritmi che sono considerati approvati per diversi utilizzi.
Per fare alcuni esempi, troviamo:
- Symmetric encryption: qui troviamo algoritmi come AES e tutte le mode of operations, che sono poi descritti in modo più comprensivo nella serie di SP 800-38 e nello standard FIPS 197;
- Digital Signatures: qui troviamo algoritmi come RSA ed ECDSA, i cui utilizzi nel contesto delle firme digitali sono descritti nello standard FIPS 186-5 (che recentemente ha sostituito lo standard FIPS 186-4);
- Random number generation: qui vengono descritti i generatori di numeri casuali utilizzati per generare i segret che vengono poi sfruttati dagli algoritmi crittografici (come ad esempio le loro chiavi). In questo contesto la serie di Special Publications di riferimento è la serie SP 800-90 (A-B-C).
Questi sono solo alcuni esempi e, per l’elenco comprensivo, si rimanda alla lettura delle SP 800-140C e SP 800-140D.
Conclusioni
Da questo articolo è chiaro come il mondo della crittografia e degli algoritmi che utilizza è in costante evoluzione, soprattutto dal punto di vista della sicurezza.
Appoggiarsi agli standard e alle certificazioni dei prodotti IT (in questo mondo come in tanti altri) aiuta ad avere una garanzia in più sulla sicurezza degli algoritmi e delle implementazioni che si utilizzano.
Ovviamente, nel mondo della sicurezza informatica, niente può mai essere considerato sicuro al 100% per sempre. L’evoluzione della tecnologia sarà sempre in constante crescita e, nel futuro, nuove vulnerabilità e frontiere di attacco potranno aprirsi.
Per questo motivo, avere una panoramica e un’idea dei possibili pericoli a cui la crittografia è esposta può aiutare sviluppatori e utilizzatori ad essere consapevoli della sicurezza dei prodotti che rispettivamente vendono ed utilizzano.