Google ha riscritto il firmware pvmfm, utilizzato in Android, in Rust.

Nel contesto del rafforzamento della sicurezza dei componenti software critici della piattaforma Android, Google ha riscritto in Rust il firmware pvmfm, utilizzato per gestire le macchine virtuali avviate dall'ipercompratore pVM all'interno dell'Android Virtualization Framework. In precedenza, il firmware era scritto in C e implementato sopra il bootloader U-Boot, nel cui codice erano state riscontrate vulnerabilità dovute a problemi di gestione della memoria.

Il firmware riscritto in Rust è incluso in Android 14, e le librerie universali create durante lo sviluppo del firmware sono state confezionate come pacchetti crate e consegnati alla comunità Rust. Ad esempio, è stato pubblicato il pacchetto smccc per supportare le interfacce PSCI (Power State Coordination Interface) ARM e le chiamate SMCCC (SMC Calling Convention), insieme al pacchetto aarch64-paging per la manipolazione delle tabelle di pagina della memoria. Inoltre, è stato effettuato un lavoro di correzione degli errori e di miglioramento della funzionalità del pacchetto esistente virtio-drivers con l'implementazione dei driver VirtIO. Oltre alla piattaforma Android, i pacchetti menzionati sono utilizzati nel progetto Oak, che sviluppa componenti per la trasmissione, archiviazione e elaborazione dei dati in ambienti protetti (TEE, Trusted Execution Environment).

L'ipercompratore pVM acquisisce il controllo nelle fasi iniziali di avvio e garantisce una completa isolamento della memoria di macchine virtuali e dell'ambiente host, impedendo alla sistema host di accedere alle macchine virtuali protette in cui vengono elaborati dati sensibili. Il firmware pvmfm (Protected Virtual Machine Firmware) prende il controllo immediatamente dopo l'avvio della macchina virtuale, verifica l'ambiente creato e decide se interrompere l'avvio in caso di problemi di integrità o genera un certificato di avvio per il sistema guest in caso di conferma della catena di fiducia.

La riscrittura in Rust consente un rispetto più semplice e sicuro della "regola del due" utilizzata da Google per mantenere la sicurezza dei componenti di sistema Android. Secondo questa regola, qualsiasi codice aggiunto deve soddisfare non più di due delle seguenti tre condizioni: lavorare con input non verificati, utilizzare un linguaggio di programmazione non sicuro (C/C++) e essere eseguito con privilegi elevati. Da questa regola si deduce che il codice per la gestione dei dati esterni deve essere ridotto ai minimi privilegi (isolato) o essere scritto in un linguaggio di programmazione sicuro. Secondo Google, circa il 70% delle vulnerabilità pericolose riscontrate in Android è causato da errori nella gestione della memoria.

Rust si concentra sulla gestione sicura della memoria e consente di ridurre il rischio di vulnerabilità causate da problemi come l'accesso a memoria liberata e l'overflow del buffer. La gestione sicura della memoria in Rust è garantita durante la compilazione attraverso il controllo dei riferimenti, la tracciabilità della proprietà degli oggetti e la considerazione del ciclo di vita degli oggetti (scope), oltre alla valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust fornisce anche strumenti per proteggere da overflow interi, richiede l'inizializzazione obbligatoria delle variabili prima dell'uso, gestisce meglio gli errori nella libreria standard, applica il concetto di immutabilità delle variabili e dei riferimenti per impostazione predefinita, e offre una forte tipizzazione statica per minimizzare gli errori logici.

Tra le difficoltà riscontrate nello sviluppo di componenti di basso livello come i driver in Rust si menziona la necessità di lavorare con puntatori nudi in modalità unsafe, poiché Rust è progettato pensando all'uso della memoria riservata nel programma, e nel codice che opera senza strati sopra l'hardware è necessario interagire con la memoria condivisa e MMIO. Attualmente, le capacità di Rust relative ai puntatori nudi lasciano a desiderare, ma la situazione dovrebbe migliorare dopo la stabilizzazione del supporto per i macro offset_of, slice_ptr_get e slice_ptr_len.

Tra gli svantaggi si evidenzia anche la necessità di un miglioramento della sintassi per l'accesso ai campi delle strutture e agli indici degli array tramite puntatori nudi senza creare riferimenti, così come le limitazioni nella creazione di wrapper sicuri sopra operazioni unsafe che possono causare comportamenti indefiniti e non possono essere verificate dal compilatore. Ad esempio, tali wrapper non possono essere creati per le operazioni con le tabelle di pagina della memoria, poiché il mapping delle pagine in una parte del programma può influenzare altre parti.

Per quanto riguarda la dimensione del codice risultante, la vecchia versione del firmware pVM occupava 220 kB, mentre la nuova ne occupa 460 kB; tuttavia, nella nuova versione sono state aggiunte funzionalità che hanno consentito di eliminare alcuni altri componenti utilizzati durante l'avvio. Di conseguenza, la dimensione complessiva di tutti i componenti di avvio, vecchi e nuovi, si è rivelata comparabile. Si nota che quando la dimensione è più importante delle prestazioni, risultati comparabili a quelli del linguaggio C possono essere ottenuti attivando nel compilatore modalità aggiuntive di ottimizzazione per la dimensione, eliminando le dipendenze superflue e non utilizzando strumenti di formattazione delle stringhe.

Si menziona inoltre la continuazione del lavoro sulla realizzazione della possibilità di eseguire applicazioni affidabili scritte in Rust (Trusted Application) nel sistema operativo Trusty, che fornisce un ambiente TEE (Trusted Execution Environment) per Android, eseguendosi parallelamente a Android sullo stesso processore in un ambiente isolato separato. Trusty è utilizzato nei dispositivi Pixel e già utilizza Rust in librerie e componenti di sistema (il kernel rimane in C).

Fonte: opennet.ru

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster