L'azienda Microsoft ha avviato lo sviluppo del progetto CHERIoT (Capability Hardware Extension to RISC-V for Internet of Things), mirato a risolvere le problematiche di sicurezza presenti nel codice esistente scritto in C e C++. CHERIoT offre una soluzione che permette di proteggere le basi di codice esistenti in C/C++ senza richiedere una loro riscrittura. La protezione viene attuata tramite un compilatore modificato che utilizza un insieme esteso di istruzioni per processore (ISA), fornito dal processore stesso, che tiene traccia dell'accesso alla memoria, verifica la correttezza nella gestione dei puntatori e garantisce l'isolamento dei blocchi di codice.
Il progetto è stato ideato tenendo presente che la natura a basso livello del linguaggio C può essere fonte di errori nella gestione della memoria, portando a problematiche come overflow del buffer, accesso a memoria già liberata, dereferenziazione di puntatori o doppia liberazione della memoria. Anche le grandi aziende, come Google e Microsoft, che applicano rigide politiche di revisione delle modifiche e utilizzano metodi di sviluppo moderni e strumenti di analisi statica, non riescono a garantire l'assenza di errori nella gestione della memoria (ad esempio, circa il 70% delle vulnerabilità nei prodotti software di Microsoft e Google sono causate da una gestione della memoria non sicura).
Il problema potrebbe essere risolto utilizzando linguaggi di programmazione che garantiscono una gestione sicura della memoria, o mediante wrapper con controlli aggiuntivi, come l'uso di puntatori speciali tipo MiraclePtr (raw_ptr), che eseguono controlli addizionali per prevenire accessi alle aree di memoria liberate. Tuttavia, tali metodi sono più adatti per il nuovo codice, mentre rifare progetti esistenti in C/C++ è piuttosto complesso, specialmente se destinati a funzionare in ambienti a risorse limitate, come i sistemi embedded e i dispositivi IoT.
I componenti hardware di CHERIoT sono rappresentati sotto forma di microcontrollore basato sull'architettura RISC-V, implementando l'architettura di processore protetta CHERI (Capability Hardware Extension to RISC-V), che offre un modello di accesso controllato alla memoria basato su "capability" (ogni operazione di lettura e scrittura nella memoria è autorizzata). Sulla base dell'architettura ISA fornita da CHERIoT, è stata sviluppata un modello software che garantisce la sicurezza nella gestione della memoria a livello di singoli oggetti, protettendo contro l'accesso a memoria già liberata e implementando un sistema leggero di isolamento dell'accesso alla memoria. Questo modello software di protezione si riflette direttamente nel modello linguistico C/C++, consentendo di applicarlo per proteggere applicazioni esistenti (è necessaria solo una ricompilazione e l'esecuzione su hardware compatibile con l'ISA di CHERIoT).
La soluzione proposta consente di bloccare errori che causano l'uscita dai limiti di un oggetto in memoria, impedisce la sostituzione dei puntatori (tutti i puntatori devono derivare da puntatori già esistenti), e monitora l'accesso alla memoria dopo la liberazione (ogni accesso alla memoria tramite puntatori non validi o a puntatori che fanno riferimento a oggetti liberati genera un'eccezione). Ad esempio, l'utilizzo di CHERIoT permette di implementare senza modifiche al codice controlli automatici sui limiti, il monitoraggio della vita delle aree di memoria e l'integrità dei puntatori nei componenti che gestiscono dati non fidati.
Il progetto include la specifica di un'architettura ISA estesa per CHERIoT, un'implementazione di riferimento di una CPU RISC-V a 32 bit con supporto per l'ISA di CHERIoT e un toolchain LLVM modificato. Gli schemi del prototipo della CPU e le descrizioni dei blocchi hardware sono distribuiti sotto licenza Apache 2.0. Come base per la CPU è stato utilizzato il core Ibex del progetto lowRISC. Il modello di codice dell'ISA di CHERIoT è definito in linguaggio Sail ed è distribuito sotto licenza BSD.
In aggiunta, è stato proposto un prototipo di sistema operativo in tempo reale CHERIoT RTOS, che offre la possibilità di isolare compartimenti (compartment) anche su sistemi embedded con 256 MB di RAM. Il codice di CHERIoT RTOS è scritto in C++ e distribuito sotto licenza MIT. I componenti di base dell'OS, come il bootloader, lo scheduler e il sistema di distribuzione della memoria, sono concepiti in forma di compartimenti.
Il compartimento in CHERIoT RTOS è una combinazione isolata di codice e variabili globali, simile a una libreria condivisa, ma a differenza di quest'ultima può cambiare il proprio stato (mutable) e essere eseguito in un contesto di sicurezza separato. Nessun codice esterno può trasferire il controllo al codice nel compartimento e accedere agli oggetti, eccetto per le chiamate a punti di ingresso specificamente definiti e utilizzando puntatori a oggetti esplicitamente passati durante la chiamata di un altro compartimento. Per il codice e gli oggetti globali nel compartimento, sono garantiti integrità e riservatezza.
Fonte: opennet.ru
