Il funzionamento del mondo si basa sui dati, e ogni singolo bit o byte è potenzialmente il bersaglio di un attacco. Al tempo stesso, sia i sistemi software che quelli hardware stanno diventando molto più complessi, connessi e interdipendenti. E la complessità porta vulnerabilità. Miliardi o addirittura migliaia di miliardi di righe di codice e moduli hardware, sottosistemi e partizioni, tutti stipati su sottili fette di silicio: una preda prelibata per gli hacker. E ovviamente gli hacker non stanno a guardare. Le segnalazioni di vulnerabilità nei sistemi embedded si susseguono in continuazione: sistemi di comunicazione satellitare, stazioni base wireless, stampanti laser in ambito domestico e lavorativo, reti elettriche intelligenti, dispositivi medici come i defibrillatori e molti altri sistemi sono a rischio. La necessità di sicurezza nei System-on-Chip embedded multicore non ha fatto che aumentare. I dispositivi embedded, come le apparecchiature cardiache, gli smartphone e le centraline automobilistiche, si basano su più componenti, inclusi i SoC integrati, per proteggere il centro di controllo. In questo articolo verrà esaminato il boot sicuro, il livello fondamentale di sicurezza per i processori embedded. Con il boot sicuro, il sistema è protetto sin dall’accensione. Senza boot sicuro, il sistema presenta una lacuna vulnerabile a partire dall’accensione e durante l’utilizzo.
Considerazioni per l’architettura
La sicurezza embedded inizia all’interno dell’hardware. L’accoppiamento fra software e caratteristiche di sicurezza hardware consente un livello di protezione più sicuro rispetto a una delle due soluzioni che funzioni in modo indipendente. Gli strumenti messi a disposizione dai fornitori possono semplificare lo sviluppo dei sottosistemi di sicurezza e garantire che l’architettura risultante soddisfi i requisiti degli sviluppatori. Ad esempio, gli acceleratori di sicurezza basati sull’hardware possono ridurre il costo delle prestazioni di un sottosistema di sicurezza. Naturalmente, la forza di un’architettura di sicurezza dipenderà dalle sue fondamenta. Sono essenziali tre aspetti dello strato fondamentale: un processo di boot sicuro, ID/chiavi del dispositivo basati sull’hardware e accelerazione crittografica.
La piramide della sicurezza
La piramide della sicurezza illustra i vari strati e le parti costitutive di un sottosistema di sicurezza completo per un processore embedded SoC multicore.
- Boot sicuro - Un processo di boot sicuro stabilisce una root-of-trust per il sistema embedded. Anche lanciando il boot da una memoria flash esterna un processo di avvio sicuro verifica l’integrità del firmware di avvio attraverso una quantità di meccanismi a piacere, incluse le chiavi crittografiche embedded e altri. Uno strato di boot sicuro protegge il sistema dall’occupazione da parte del malware, da eventuali clonazioni della proprietà intellettuale sul sistema, dall’esecuzione involontaria di applicazioni indesiderate e da altri rischi per la sicurezza. Il boot sicuro aiuta anche a fornire un ulteriore livello di protezione crittografando la proprietà intellettuale ed eseguendone una copia al sicuro per proteggere le memorie interne. La possibilità di crittografare fornisce anche un’ulteriore sicurezza per la base di codice, in quanto impedisce l’esecuzione di attacchi di esplorazione diretta.
- Accelerazione crittografica - L’elaborazione crittografica, che prevede la generazione, la verifica e la certificazione di varie chiavi pubbliche e private, può penalizzare le prestazioni e il throughput di un sistema embedded. Alcuni SoC sono dotati di acceleratori o co-processori basati su hardware che accelerano enormemente i processi di codifica/decodifica. È disponibile anche l’accelerazione basata su software, ma il software non è intrinsecamente sicuro quanto l’accelerazione crittografica basata su hardware. Esempi di funzioni crittografiche comuni includono Advanced Encryption Standard, Triple Data Encryption Algorithm, Secure Hash Algorithm, Rivest Shamir Adleman e la crittografia a curva ellittica.
- Debug della sicurezza - Durante lo sviluppo del sistema è necessario accedere a processori multicore embedded per eseguire il debug di firmware e software e risolvere eventuali problemi hardware. Nella maggior parte dei casi, la porta che fornisce questo accesso è la porta Jtag. In un ambiente operativo, la porta di debug deve essere chiusa da una sorta di fusibile o essere accessibile solo tramite chiavi crittografiche certificate. In caso contrario, la porta di debug potrebbe fornire agli hacker un modo semplice per accedere al sistema.
Ambiente di esecuzione affidabile
Il livello di sicurezza run-time comprende diverse funzionalità distinte che svolgono tutte un ruolo nella protezione del sistema dopo il processo di boot e l’esecuzione del sistema operativo. Un aspetto importante della sicurezza del run-time è il monitoraggio di tutti gli aspetti del sistema per determinare quando si è verificata o è stata tentata un’intrusione. La sicurezza dell’ambiente di esecuzione affidabile o Tee (Trusted execution environment), consente a un sistema di ospitare contemporaneamente applicazioni sicure e non sicure e di mantenere una partizione sul sistema in modo tale che non vi siano perdite di dati. Un Tee fornisce essenzialmente una partizione protetta all’interno di un sistema multicore che consente soltanto l’esecuzione di firmware, software e applicazioni sicuri e certificati, e l’archiviazione dei soli dati certificati. La chiusura del Tee rispetto al resto del sistema multicore/multiprocessing impedisce al codice sospetto, alle applicazioni e ai dati che potrebbero attraversare il sistema di contaminare software, dati e altra proprietà intellettuale fondamentale per l’attività.
- Archiviazione sicura - Le chiavi di crittografia e i dati di sicurezza devono essere archiviati nella memoria di sistema in luoghi preclusi all’accesso indesiderato. Un certo numero di funzionalità è in grado di fornire un’archiviazione sicura, incluso un blob crittografato di chiavi, una protezione anti-manomissione che può essere sbloccata solo da una chiave master, un bus di chiavi privato tra la memoria non volatile e i motori crittografici e altro.
- Protezione della memoria esterna - Quando si aggiunge un’ulteriore applicazione o sottosistema, di solito è necessario aggiungere memoria esterna al processore principale e connettersi ad essa tramite un bus di memoria. È necessario proteggere i dati archiviati nella memoria esterna da manomissioni o sostituzioni in modo da garantire che la memoria esterna archivi solo i dati attendibili o il codice dell’applicazione. Esistono numerosi metodi che proteggono il contenuto della memoria esterna, inclusa l’esecuzione protetta in locale direttamente dalla memoria esterna (senza caricare i dati nella memoria integrata del processore), e la decodifica on-the-fly, che può mantenere la riservatezza consentendo al tempo stesso l’esecuzione delle applicazioni sul processore principale.
- Sicurezza di rete - Gli hacker sono piuttosto abili nell’intercettare le comunicazioni di rete wireless e cablate. In effetti, alcuni protocolli di comunicazione presentano punti deboli noti nella sicurezza, che gli hacker hanno saputo sfruttare. L’implementazione di protocolli di comunicazione altamente sicuri implica spesso un numero significativo di cicli di elaborazione per crittografare e decrittare il flusso di comunicazione, nonché per verificare l’autenticità del mittente o del destinatario. I progettisti potrebbero dover bilanciare throughput e sicurezza delle comunicazioni, ma alcuni processori embedded evitano questo dilemma integrando acceleratori basati su hardware per gli algoritmi crittografici utilizzati in combinazione con i protocolli di comunicazione standard.
- Sicurezza fisica e protezione antimanomissione - È noto che le organizzazioni di hacking sofisticate e meno sofisticate sono in grado di rimuovere i chip da un sistema o una matrice di silicio dal package di un chip per accedere alle risorse embedded (Fig. 4). Una volta rimosso il dispositivo o il die, gli hacker possono bombardare i dispositivi con dei laser, alimentarli oltre i limiti di potenza specificati o impiegare altri mezzi. Il loro obiettivo è osservare come il dispositivo reagisce allo stimolo, poiché questa risposta potrebbe svelare le vulnerabilità che gli hacker potranno quindi sfruttare per accedere al dispositivo. I moduli di protezione contro le manomissioni integrati nei processori embedded multicore possono contenere monitor di alimentazione e temperatura, funzionalità di ripristino, monitor di frequenza e funzionalità di protezione anti-manomissione programmabili.
- Protezione della custodia - Le caratteristiche di protezione della custodia sono misure fisiche che proteggono la custodia che racchiude un sistema. Queste caratteristiche possono andare da meccanismi con serratura a interruttori elettronici, meccanismi di interruzione del filo e altri.
Le basi della sicurezza nei processori embedded
La base fondamentale per la sicurezza di un processore multicore embedded parte dall’hardware. Se l’hardware non è sicuro, non esiste quantità di software di sicurezza che aiuterà a proteggerlo. Supponendo che le funzionalità di sicurezza siano già integrate nell’hardware, il primo punto da cui iniziare a costruire un sottosistema di sicurezza è all’interno del primo software che viene eseguito dopo l’accensione: il codice di boot. Se non è possibile autenticare il processo di boot, non è possibile farlo con nessun altro software in esecuzione sul sistema. Pertanto, la sicurezza del processo di boot è il fulcro da cui dipende tutta la sicurezza del sistema. Un processo di boot sicuro stabilisce la root-of-trust, che è l’obiettivo di ogni sottosistema di sicurezza. Di solito, un processo di boot sicuro prevede la programmazione di una chiave crittografica pubblica in una memoria non volatile e programmabile una volta sola in qualche punto del sistema. Questa chiave pubblica deve corrispondere alle chiavi private/pubbliche associate al codice di boot per autenticare la validità del codice di boot crittografato prima che inizi l’esecuzione. Il firmware di avvio può essere caricato nella memoria ad accesso casuale del processore embedded o, per una maggiore sicurezza, protetto ed eseguito nella memoria esterna al processore embedded. Alcune immagini del firmware sono composte da vari componenti o moduli. Richiedere l’autenticazione prima della decrittazione e dell’esecuzione di ogni modulo migliora la sicurezza di boot. Un esempio di processore embedded che offre un processo di boot sicuro sono le famiglie di processori Sitara AM43x, AM335x e AM57x di Texas Instruments.