Il progetto si chiama Microcode Decryptor, e permette di fare esattamente quello che il nome suggerisce: è uno strumento, costituito da tre script Python e disponibile su GitHub, che consente di decodificare il microcodice di alcuni processori Intel quali Atom, Pentium e Celeron basati sulle microarchitetture Goldmont e Goldmont Plus. Questo apre le porte a diversi scenari, ad esempio capire come il gigante di Santa Clara abbia implementato alcune funzionalità del processore o implementato varie correzioni e funzionalità di sicurezza.
Nei classici corsi universitari dedicati alle architetture dei calcolatori, viene insegnato che all’interno di un processore è presente un decodificatore di istruzioni (decoder) e un’unità di controllo (control unit). Il compito del decoder e della control unit è, ad esempio, ricevere un’istruzione (dell’utente) come ADD $R3, $R1, $R2 e decodificarla come segue: il register file accede ai valori contenuti in $R1 e $R2 e li fornisce come output nelle due porte di lettura del register file stesso. La porta di scrittura del register file viene abilitata su $R3 e il valore di scrittura sarà l’output dell’ALU (Airthmetic Logic Unit) che nel frattempo è stata impotata dal decoder per effettuare una somma (ADD).
I processori moderni, però, non sono così semplici. L’esempio precedente vede un tipo di control unit definita come hard-wired. Ciò significa che il comportamento della control unit è scritto in hardware e quindi per ogni istruzione viene impostato in modo fisso (in hardware) il comportamento di ogni output della control unit stessa. I processori moderni, invece, basano il loro funzionamento su una control unit basata sul microcodice: ad ogni istruzione utente corrispondono una serie di istruzioni di microcodice (microistruzioni) che fanno sì che le cose giuste accadano al momento giusto.
L’obiettivo è quindi catturare il comportamento di istruzioni molto più complesse (quelle visibili dall’utente programmatore) con una serie di istruzioni molto più semplici. Il microcodice è stato, infatti, originariamente sviluppato come metodo più semplice per sviluppare la logica di controllo per un computer. Sebbene le control unit hardwired siano molto efficienti, la necessità di istruzioni complesse le ha rese difficili da progettare ed eseguire il debug. Il microcodice ha semplificato il lavoro consentendo la definizione di gran parte del comportamento del processore e del modello di programmazione tramite routine di microprogramma anziché tramite circuiti dedicati. Anche alla fine del processo di progettazione, il microcodice poteva essere facilmente modificato, mentre i progetti di CPU cablate erano molto macchinosi da modificare. Pertanto, questo ha notevolmente facilitato la progettazione della CPU.
Ecco quindi che rispondere alla classica domanda “ma i processori Intel sono CISC o RISC” diventa più facile: i processori Intel offrono un’Instruction Set di tipo CISC ma internamente queste istruzioni vengono implementate con una serie di microistruzioni RISC.
A partire da metà degli anni ’90, il microcodice può essere aggiornato dal sistema operativo o dal firmware del BIOS per aggirare i bug rilevati nelle CPU dopo il rilascio. Questo porta con sè diversi vantaggi: ciò consente l’aggiornamento sul campo (in-field) senza dover richiamare il prodotto a seguito di un bug riscontrato nel processore.
Ma ritornando allo scopo principale dell’articolo: gli sviluppatori del tool come sono riusciti ad ottenere il microcodice? Ecco, esso in realtà è criptato ma il trio di ricercatori ha individuato una vulnerabilità nei chipset Intel che consente di attivare una modalità di debug non documentata, chiamata “Red Unlock“, che ha, in seguito, permesso di trovare la chiave di decrittazione per estrarre e decifrare il microcodice.
Tuttavia, fortunatamente, questo non apre le porte a eventuali modifiche malevoli da parte di maltinenzionati, dato che il microcodice ha una firma RSA per la protezione dell’integrità e, di conseguenza, il processore si rifiuterebbe di eseguirlo vedendo che la firma calcolata su nuovi possibili microcodici non corrisponde a quella originale. Questo però apre le porte nel campo di ricerca delle architetture x86, e comprendere come come Intel ha mitigato la vulnerabilità Spectre, o esplorare l’implementazione delle tecnologie Intel TXT, SGX, e VT-x.
Intel ha subito colto la palla al bazzo:
“La capacità dei ricercatori di analizzare il microcodice potrebbe consentire la scoperta di nuove vulnerabilità. Poiché questo microcodice è stato esposto, Intel invita i ricercatori a partecipare al programma di ricompense dei bug del microcodice nel caso in cui vengano scoperti problemi”