Sfruttare il primo MCU basato su Arm® Cortex®-M33 - Parte 2: Gestione della sicurezza del ciclo di vita
Contributo di Editori nordamericani di DigiKey
2019-07-09
Nota del redattore: la Parte 1 di questo articolo ha illustrato come ottimizzare il microcontroller (MCU) per uso generale LPC55S6x di NXP Semiconductors per ottenere prestazioni elevate con un basso consumo energetico. Qui, nella Parte 2, verrà mostrato come ottimizzare lo stesso microcontroller per la gestione della sicurezza del ciclo di vita.
Per gli sviluppatori di sistemi basati su microcontroller, la vastità dei requisiti di progettazione per applicazioni in rapida espansione come Internet delle cose (IoT), automazione industriale o elettronica personale, troppo spesso costringe a un compromesso tra funzionalità del sistema, prestazioni e consumo energetico. Di fronte alle crescenti minacce alla sicurezza, la necessità di rafforzarla in questi progetti aggiunge un'altra sfida che restringere ulteriormente il numero dei microcontroller idonei. Gli sviluppatori hanno bisogno di un microcontroller in grado di soddisfare non solo requisiti ormai comuni come consumi energetici ridotti e alte prestazioni, ma anche le crescenti richieste di sicurezza in tutte le fasi del ciclo di vita del progetto, compresi il provisioning, le comunicazioni, l'avvio e l'aggiornamento sicuri del firmware e altre ancora.
La Parte 1 ha presentato la famiglia di microcontroller LPC55S6x di NXP e ha descritto in che modo le sue caratteristiche soddisfano i requisiti di prestazioni e basso consumo energetico. Qui, nella Parte 2, verrà illustrato come le estese funzionalità di sicurezza integrate nei microcontroller LPC55S6x supportino la sicurezza del ciclo di vita dal provisioning e dalle comunicazioni fino all'avvio e agli aggiornamenti sicuri del firmware.
Come descritto nella Parte 1, i microcontroller single core LPC55S66 e dual core LPC55S69 di NXP combinano il core del processore per uso generale Arm® Cortex®-M33 con capacità hardware studiate per rispondere a requisiti di applicazioni più specializzate. Tra queste capacità, gli acceleratori basati su hardware per la crittografia simmetrica e asimmetrica forniscono i meccanismi fondamentali per garantire comunicazioni sicure. In passato, gli acceleratori di crittografia erano ritenuti sufficienti per funzionalità di sicurezza di base come la protezione dei dati. Oggi, però, le aspettative degli utenti di funzionalità di sicurezza più complete hanno fatto nascere requisiti più complessi per la sicurezza del ciclo di vita, dal provisioning nella produzione alla messa in servizio sul campo, oltre all'avvio e all'aggiornamento sicuri del firmware.
Per poter ottenere una protezione così estesa serve un set completo di protocolli e criteri di sicurezza che vanno ben oltre il livello hardware. Ma anche così, l'efficacia di qualsiasi protocollo di sicurezza dipende in modo determinante dalla disponibilità di meccanismi idonei basati su hardware che accelerano l'esecuzione ed eliminano o riducono le aree esposte alle minacce che si presentano inevitabilmente in qualsiasi dispositivo connesso.
L'architettura di LPC55S6x offre questo tipo di supporto basato su hardware per la sicurezza del ciclo di vita con una serie di funzionalità, a partire dal supporto della tecnologia Arm TrustZone® fino ai numerosi livelli di protezione richiesti per raggiungere un grado efficiente di sicurezza.
Supporto TrustZone
Grazie alla sua capacità di isolare l'esecuzione del codice e i dati in specifici domini protetti e non protetti, TrustZone offre una solida base per la sicurezza. Durante l'esecuzione del programma, il core Cortex-M33 primario passa per diversi stati di esecuzione associati a diverse modalità di esecuzione del codice. Questi stati della CPU e le modalità di esecuzione del codice includono:
- Sicuro con privilegi, per l'esecuzione di codice a livello di kernel o di handler di dispositivo
- Sicuro senza privilegi, per l'esecuzione di codice utente sicuro
- Non sicuro con privilegi, per l'esecuzione delle tipiche chiamate di sistema
- Non sicuro senza privilegi, per l'esecuzione delle tipiche applicazioni utente
La distinzione tra esecuzione con e senza privilegi è di fondamentale importanza per la robustezza complessiva del sistema operativo. Ai fini di questo articolo, tuttavia, possiamo ridurre il concetto, concentrandoci solo sulla differenza tra funzionamento sicuro e non sicuro. Nell'architettura TrustZone, il passaggio da uno stato della CPU sicuro a uno non sicuro richiama limitazioni supportate dall'hardware nel core per accedere alla memoria di programma o ai dati.
Nel suo stato sicuro, il core può accedere ai dati nelle regioni della memoria sia sicure che non sicure ma non può accedere al codice memorizzato in una regione non sicura della memoria (Figura 1, a sinistra). Nel suo stato non sicuro, il core può accedere solo al codice e ai dati dalle regioni non sicure della memoria (Figura 1, a destra).
Figura 1: Grazie al supporto di Arm TrustZone, i microcontroller LPC55S6x di NXP fanno sì che un core che opera nello stato sicuro (S) (a sinistra) possa prendere le istruzioni solo per la memoria di programma in stato S, mentre un core che opera in uno stato non sicuro (NS) (a destra) non possa leggere il codice o i dati conservati nella memoria in stato S. (Immagine per gentile concessione di NXP Semiconductors)
L'architettura dell'MCU LPC55S6x esercita questo controllo al livello più basso di accesso al bus, mitigando le superfici di minaccia comuni come gli overflow del buffer utilizzati dagli autori degli attacchi per far sì che un codice senza privilegi e non protetto riesca a ottenere l'accesso alle regioni "protette" passando dalla backdoor. In questo caso, NXP utilizza la Security Attribution Unit (SAU) di Arm TrustZone con la propria Implementation Defined Attribution Unit (IDAU) progettata per isolare completamente il codice sicuro del kernel da quello dell'applicazione. La SAU fornisce lo stato di sicurezza (sicuro o non sicuro) e identifica se l'istruzione proviene da una regione di memoria consentita. L'IDAU si interfaccia con la DAU (Device Attribution Unit) per fornire una maggiore granularità, interagendo con la SAU per determinare l'attributo di sicurezza di uno specifico indirizzo. Come risultato, la richiesta del bus viene consegnata ai livelli appropriati di sicurezza e privilegi (Figura 2).
Figura 2: I microcontroller LPC55S6x di NXP proteggono l'accesso a livello di transazione del bus, usando la SAU Arm TrustZone con la sua IDAU per assicurare che le richieste del bus di sistema operino ai livelli di sicurezza e di privilegi appropriati. (Immagine per gentile concessione di NXP Semiconductors)
Archiviazione e periferiche sicure
I meccanismi di protezione TrustZone isolano il codice dell'applicazione e i dati durante il runtime, occupandosi dei dati in uso (uno dei principi classici della sicurezza dei dati), compresi quelli a riposo e quelli in transito. Anche se di solito sono associati a problemi di dati a livello aziendale, questi stessi principi si applicano al codice e ai dati in un sistema embedded. In questo caso, l'utilizzo tipico che un sistema embedded fa della memoria flash integrata di un microcontroller per memorizzare immagini, codice e dati del firmware può diventare il vettore di un attacco importante. Il dispositivo LPC55S6x contiene questa minaccia grazie a un algoritmo di crittografia/decrittografia chiamato PRINCE. [Nota per i lettori: PRINCE non è un acronimo.]
L'algoritmo PRINCE è molto adatto per le implementazioni della sicurezza nei sistemi embedded, perché è veloce e richiede pochissime risorse. Implementato nell'hardware nei dispositivi LPC55S6x, l'algoritmo PRINCE lavora in tempo reale, decrittografando o crittografando i dati nel momento stesso in cui vengono letti o scritti. Diversamente da molti altri algoritmi di crittografia, PRINCE non ha bisogno di utilizzare la RAM per conservare i dati originali o i risultati intermedi, il che elimina un'altra vulnerabilità della sicurezza. Di conseguenza, gli sviluppatori possono archiviare con maggiore sicurezza il codice dell'applicazione, le immagini del firmware e persino le chiavi sicure nella flash interna del microcontroller.
Sebbene i motori di crittografia e lo storage sicuro della flash blocchino lo scambio e l'archiviazione dei dati, un sistema embedded sicuro richiede lo stesso livello di sicurezza per le sue interazioni con sensori e trasduttori. Oltre alle sue funzionalità DMA sicure, l'architettura dell'MCU LPC55S6x fornisce meccanismi che proteggono ulteriormente lo scambio tra il core o altri bus master e le sue periferiche integrate, la memoria o il GPIO (Figura 3).
Figura 3: I microcontroller LPC55S6x di NXP combinano la loro matrice del bus multistrato con MSW, MPC e PPC per isolare e proteggere le transazioni tra i diversi bus master dei dispositivi e le loro periferiche e memoria. (Immagine per gentile concessione di NXP Semiconductors)
In questo schema di protezione, i controllori di protezione della memoria (MPC) limitano l'accesso alla memoria da parte di applicazioni meno sicure. I controllori di protezione periferica (PPC) forniscono lo stesso tipo di controllo dell'accesso per le periferiche, consentendo agli sviluppatori di impostare regole di accesso diverse a seconda delle periferiche. Dato che il meccanismo SAU/IDU è disponibile solo per il core Cortex-M33 primario, per fornire una protezione di accesso simile per altri bus master vengono utilizzati i Master Security Wrapper (MSW). La matrice AHB multistrato crea un percorso dedicato tra i bus master e le periferiche o la memoria, di conseguenza ne risulta una connessione bus interna sicura che è isolata dalle altre transazioni bus che potrebbero aver luogo nel dispositivo.
L'architettura dell'MCU LPC55S6x isola ulteriormente l'accesso sicuro e non sicuro a dispositivi esterni grazie al suo sistema GPIO sicuro. Questo sistema estende lo stesso tipo di isolamento ai pin GPIO che i meccanismi TrustZone creano tra gli stati sicuri e non sicuri della CPU e le modalità di esecuzione del codice. Pertanto, solo il core Cortex-M33 primario che opera in uno stato sicuro può accedere ai pin GPIO sicuri, consentendo agli sviluppatori di proteggere i segnali che provengono da dispositivi esterni critici.
Gestione sicura delle chiavi
I vari meccanismi di protezione descritti finora in questo articolo forniscono le basi di un sistema embedded sicuro. Per collegare quel sistema in modo sicuro a una rete, a uno smartphone o a un altro host, tuttavia, gli sviluppatori devono poter autenticare la destinazione della connessione durante la messa in servizio iniziale e le transazioni in corso e riuscire a mantenere un canale di comunicazione crittografato in modo sicuro. A sua volta, la sicurezza degli algoritmi di crittografia asimmetrica e simmetrica che sta al centro dei protocolli di autenticazione e dei meccanismi di crittografia dipende in ultima analisi dalla sicurezza delle chiavi private utilizzate all'interno di questi protocolli e meccanismi.
Utilizzando la Physical Unclonable Function (PUF) integrata, i microcontroller LPC55S6x forniscono un meccanismo altamente sicuro per archiviare in sicurezza le chiavi esistenti e generarne di nuove. Questo approccio ruota attorno alla capacità dell'hardware PUF di creare una chiave radice PUF univoca che viene utilizzata per crittografare le altre chiavi utente. L'unicità della chiave radice PUF deriva dall'uso delle funzioni del dispositivo interno e dai dati di avvio SRAM, che provengono dai contenuti casuali 0 e 1 delle celle della SRAM all'accensione. Durante la fase di iscrizione alla PUF, il dispositivo utilizza queste due fonti di dati casuali per creare un'impronta digitale e il relativo codice di attivazione a 1192 byte (Figura 4).
Figura 4: La PUF integrata dei microcontroller LPC55S6x di NXP usa lo stato random delle SRAM all'avvio e altre funzioni interne per generare un'impronta digitale e il codice di attivazione usato per le successive operazioni di generazione e archiviazione della chiave. (Immagine per gentile concessione di NXP Semiconductors)
Durante il provisioning dei dispositivi in fabbrica o in un secondo tempo sul campo, questo codice di attivazione viene memorizzato nell'area programmabile sul campo del cliente (CFPA) nella regione della flash protetta del dispositivo. Ogni volta che il microcontroller viene acceso e la PUF viene attivata con il suo comando Start, la PUF combina il codice di attivazione esistente con i dati di avvio della SRAM per ricostruire l'impronta digitale.
Dopo la procedura di avvio della PUF, il comando PUF SetKey fa sì che la PUF codifichi le chiavi utente come chiavi master condivise fornite in fabbrica o chiavi private fornite dagli sviluppatori per le loro applicazioni. Qui, la PUF genera un codice chiave per la chiave utente corrispondente in base alle dimensioni della chiave, un indice delle chiavi e la chiave utente stessa (Figura 5).
Figura 5: La PUF LPC55S6x di NXP fornisce una funzione SetKey che codifica una chiave utente e l'indice delle chiavi utilizzando la sua impronta digitale, fornendo un codice della chiave usato in seguito per accedere alla chiave utente originale. (Immagine per gentile concessione di NXP Semiconductors)
Gli sviluppatori possono anche generare nuove chiavi utilizzando il comando PUF GenerateKey, che utilizza lo stesso processo di generazione di SetKey ma con dati univoci generati internamente che sostituiscono la funzione KEYIN mostrata nella Figura 5. Le chiavi impostate o generate con l'indice delle chiavi = 0 ottengono un'ulteriore protezione come indicato sotto.
Per utilizzare le chiavi, gli sviluppatori richiamano il comando PUF GetKey per recuperare la chiave utente originale con due diversi percorsi di uscita in base al valore dell'indice delle chiavi utilizzato al momento di impostare o generare la chiave. Se l'indice delle chiavi è maggiore di zero, la chiave utente è disponibile tramite il registro PUF CODEOUTPUT. Se invece è uguale a zero, la chiave utente viene passata direttamente al motore AES o alle tre regioni di memoria flash supportate dal motore PRINCE, come specificato dal valore di KEYENABLE (Figura 6). Sebbene non sia direttamente coinvolto nel recupero delle chiavi, il registro KEYMASK a 4 bit di PUF supporta un meccanismo interno progettato per mitigare gli attacchi dai canali laterali.
Figura 6: Per accedere alle chiavi, gli sviluppatori usano il comando PUF GetKey di LPC55S6x di NXP. Questo comando utilizza l'indice delle chiavi e il codice della chiave generati durante le operazioni SetKey (o GenerateKey) per creare la chiave utente originale o inviarla tramite un bus privato agli acceleratori crittografici del microcontroller. (Immagine per gentile concessione di NXP Semiconductors)
Le chiavi con indice zero contribuiscono a rafforzare la sicurezza del ciclo di vita anche a partire dalla fase di provisioning in fabbrica. Una volta eseguito il provisioning tramite PUF SetKey, una chiave master condivisa utilizzata per la crittografia simmetrica o la chiave privata utilizzata per la crittografia asimmetrica non esce mai dal dispositivo e non entra mai nel bus di sistema. Il trasferimento delle chiavi ai motori AES o PRINCE avviene invece internamente attraverso un'interfaccia cablata dedicata a cui il software non può accedere.
Il meccanismo di gestione delle chiavi PUF e le altre funzionalità di sicurezza del microcontroller interagiscono per altre fasi della sicurezza del ciclo di vita, compresi l'avvio e l'aggiornamento sicuri del firmware. Per l'avvio sicuro, LPC55S6x supporta diversi metodi di protezione, tra cui l'autenticazione delle immagini firmate RSA2048 mediante certificati X.509 convalidati o la decrittografia delle immagini memorizzate in una regione flash di PRINCE. In entrambi i casi, il bootloader recupera in modo sicuro le chiavi necessarie per la convalida dei certificati o la decrittografia delle immagini dalla memoria delle chiavi PUF utilizzando gli hash delle chiavi generate da PUF memorizzati con le immagini nella regione flash protetta.
L'aggiornamento del firmware si avvale di meccanismi simili per autenticare un'immagine del firmware di aggiornamento via etere (OTA), decodificarlo e prepararlo per l'avvio.
Oltre alle esigenze immediate di avvio e aggiornamento sicuri del firmware, gli slot di memorizzazione delle chiavi del dispositivo e le capacità di generarle supportano i requisiti del ciclo di vita della sicurezza in corso per la revoca di chiavi e certificati. A sua volta, questa funzionalità di gestione delle chiavi supporta criteri di sicurezza di livello superiore, come la revoca dell'immagine del firmware.
Gli sviluppatori possono rapidamente esplorare le capacità dei microcontroller LPC55S6x utilizzando la scheda di sviluppo LPCXpresso55S69 di NXP unitamente all'ambiente di sviluppo integrato (IDE) MCUXpresso di NXP, IDE IAR o Keil. La suite MCUXpresso Config Tools integrata nell'IDE MCUXpresso aiuta gli sviluppatori a configurare l'hardware dell'MCU e a generare il codice di inizializzazione. All'interno di questo set di strumenti di configurazione, lo strumento TEE (Trusted Execution Environment) consente agli sviluppatori di configurare più facilmente l'accesso di sicurezza multilivello dell'MCU LPC55S6x. Grazie all'interfaccia grafica dello strumento TEE, gli sviluppatori possono definire con precisione i privilegi di accesso alla memoria, ai bus master e alle periferiche per ognuno dei quattro stati della CPU e le modalità di esecuzione descritte in precedenza (Figura 7).
Figura 7: All'interno del set di utility MCUXpresso Config Tools di NXP, l'interfaccia grafica dello strumento dell'ambiente di esecuzione attendibile consente agli sviluppatori di impostare i privilegi di accesso su memoria, bus master e periferiche per il codice in esecuzione nei quattro stati della CPU e le modalità di esecuzione (Immagine per gentile concessione di NXP Semiconductors)
Per lo sviluppo del codice, NXP mette a disposizione anche una serie di semplici esempi di codice che forniscono i modelli di progettazione di base per l'utilizzo delle funzionalità di sicurezza del microcontroller come GPIO sicuro, gestione delle chiavi PUF e altre funzionalità del dispositivo. Anche durante la fase di sviluppo, però, l'MCU LPC55S6x aiuta a mantenere la sicurezza del ciclo di vita grazie alla sua capacità di
autenticazione Single Wire Debug (SWD). In virtù di questa capacità, gli sviluppatori autorizzati possono eseguire il debug del proprio codice sicuro e disabilitare qualsiasi ulteriore accesso SWD a risorse sicure prima di trasferire lo sviluppo a sviluppatori di software non sicuro. A loro volta, dopo che questi sviluppatori hanno completato il debug del proprio codice, possono disabilitare tutti gli accessi di debug attraverso la porta SWD.
Conclusione
Gli sviluppatori si trovano a dover rispondere alla crescente richiesta di progetti a basso consumo e dalle alte prestazioni, in grado di mantenere la sicurezza per l'intero ciclo di vita, dal provisioning in fabbrica al funzionamento sicuro sul campo. Come descritto in questo articolo, la famiglia di microcontroller LPC55S6x di NXP offre una soluzione efficace che combina funzionalità di elaborazione generiche con un ampio set di funzionalità hardware specialistiche richieste per supportare la sicurezza del ciclo di vita.
Esonero della responsabilità: le opinioni, le convinzioni e i punti di vista espressi dai vari autori e/o dai partecipanti al forum su questo sito Web non riflettono necessariamente le opinioni, le convinzioni e i punti di vista di DigiKey o le sue politiche.

