Quando si invertono le smart card, gli attacchi al canale laterale sono noti per essere abbastanza efficaci sull'hardware. Ma cos'è e può essere utilizzato nel reverse engineering del software e come?
Quando si invertono le smart card, gli attacchi al canale laterale sono noti per essere abbastanza efficaci sull'hardware. Ma cos'è e può essere utilizzato nel reverse engineering del software e come?
Un " attacco a canale laterale " definisce qualsiasi tecnica che consideri canali di informazione non intenzionali e / o indiretti per raggiungere il suo obiettivo. È stato definito per la prima volta nella crittografia delle smart card per descrivere gli attacchi che utilizzano la fuga di informazioni involontarie dal chip incorporato nella scheda e che possono essere utilizzati per il recupero di chiavi e dati. Ad esempio, può essere utilizzato monitorando:
Execution Time (Timing attack): per distinguere quali operazioni sono state eseguite e indovinare, ad esempio, quale ramo del codice è stato selezionato (e, quindi, il valore del test).
Consumo energetico (attacco di monitoraggio dell'alimentazione): Per distinguere con precisione quale sequenza di istruzioni è stata eseguita e poter ricomporre i valori delle variabili. Si noti che esistono diverse tecniche di analisi che utilizzano lo stesso input ma con un modo leggermente diverso di analizzarlo. Ad esempio, possiamo elencare: Single Power Analysis (SPA), Differential Power Analysis (DPA), High-order Differential Power Analysis (HO -DPA), Attacchi modello , ...
Radiazione elettromagnetica (attacchi elettromagnetici): strettamente correlata al consumo di energia , ma può anche fornire informazioni che non si trovano nel consumo di energia, specialmente su chip RFID o NFC.
Se sei più interessato a imparare a sfruttare queste informazioni, allora io Suggerisco di iniziare leggendo Attacchi di analisi del potere. Non lasciarti "spaventare" dal fatto che il libro parla di smart card. La maggior parte delle informazioni si applica anche 1 a 1 su dispositivi embedded "normali" (SoC).
Ho dimenticato di menzionare che esiste una piattaforma open source chiamata OpenSCA e alcuni hardware open source chiamato FOBOS (Flexible Open-source BOard for Side-channel) per il quale non riesco a trovare un collegamento adeguato da casa.
Parlando ora dell'applicazione degli attacchi side-channel nel reverse engineering del software, sono più o meno gli attacchi che si baseranno sull'utilizzo di fughe di informazioni non intenzionali o indirette. Il miglior esempio recente è questo post di Jonathan Salwan che descrive come ha indovinato la password di un crackme semplicemente contando il numero di istruzioni eseguite su vari input con Pin.
Più in generale, questa tecnica è stata utilizzata da molto tempo nel reverse engineering del software senza nominarla, o avrebbe potuto migliorare molte analisi. L'idea di base è prima considerare che se un pezzo di software è troppo oscuro per capirlo rapidamente, possiamo considerarlo come una scatola nera e pensare di utilizzare una tecnica a canali laterali per indovinare i dati inclusi attraverso una prova ed errori guidati tecnica.
L'elenco dei canali secondari disponibili nel reverse engineering del software è molto più lungo di quello che abbiamo nell'hardware. Perché racchiude l'elenco precedente e aggiunge alcuni nuovi canali come (elenco non esaustivo):
Conteggio istruzioni : consente di identificare comportamenti diversi a seconda del input.
Conteggio lettura / scrittura : come sopra, con più possibilità di identificare i modelli perché include anche la lettura delle istruzioni.
Conteggio interruzioni aumentato : a seconda del tipo di interruzione generato, quando e come, potresti identificare comportamenti diversi ed essere in grado di determinare il buon percorso verso il tuo obiettivo.
Indirizzi di istruzione accessibili : consentono di ricostruire le parti del programma che sono attive in un momento preciso.
Indirizzi di memoria a cui si accede : consente di ricostruire pattern di dati o strutture di dati complesse archiviate o accessibili in memoria (ad es. nell'heap).
Questo elenco è lungi dall'essere esaustivo, ma fondamentalmente strumenti come Valgrind VM o altri possono essere utilizzati per eseguire tale analisi e dedurre rapidamente informazioni sul comportamento di un determinato programma, accelerando così il reverse engineering.
Cercare di costruire un software che resista a tali attacchi prenderà molto in prestito anche dall'industria delle smart card. Ma non solo. Ecco alcuni trucchi a cui potrei pensare (ma lungi dall'essere completo su tutto ciò che possiamo trovare).
Il conteggio delle istruzioni è estremamente efficiente per rilevare quale ramo è stato preso in un codice come questo:
if (value) ret = foo (); else ret = bar ();
Con foo ()
e bar ()
con conteggio delle istruzioni diverso.
Questo può essere annullato eseguendo foo ()
e bar ()
qualunque sia value
e decidere successivamente qual è il valore di ret
.
tmp_foo = foo (); tmp_bar = bar (); if (value) ret = tmp_foo; else ret = tmp_bar;
Questa tecnica rende il tuo programma molto più difficile da indovinare da un attacco di canale laterale, ma anche molto meno efficiente. Bisogna trovare un giusto compromesso.
Gli attacchi a tempo sono estremamente facili da eseguire e difficili da aggirare perché sleep ()
non può essere un'opzione (troppo facile da rilevare in un codice e, comunque, non si può assumere una velocità specifica per il processore). Il programmatore deve identificare il tempo di esecuzione di ogni ramo del suo programma e bilanciare ogni ramo con operazioni extra non utili che hanno la stessa potenza di calcolo di quelle degli altri rami. Il punto è rendere ogni ramo indistinguibile dagli altri solo in base al tempo di esecuzione.
Un altro modo per diluire il canale laterale è eseguire massicciamente il multi-thread del programma. Immagina che ogni ramo del tuo programma venga eseguito in un thread separato e una variabile dica in quale thread si trova realmente il programma corrente (se possibile in modo criptico). Quindi l'analisi del canale laterale sarà molto più difficile da eseguire.
Gli attacchi del canale laterale sono stati ampiamente sottovalutati per il reverse engineering del software, può drasticamente accelerare il contrario di molti programmi. Ma, allo stesso tempo, esistono tecniche di offuscamento che devono essere sviluppate specificatamente per il reverse engineering del software. Quindi, non stupirti se vedi sempre più novità legate a questo campo.