Google sta sviluppando parti di Android in Rust per migliorare la sicurezza

Google sta scrivendo e riscrivendo parti di Android in Rust per migliorare la sicurezza del sistema operativo nel suo insieme, rispetto a C e C++. Continua a leggere per saperne di più!

Android come soluzione completa del sistema operativo coinvolge molte parti mobili. In termini molto generali, queste parti sono l’ecosistema dell’app e quindi il sistema operativo stesso. Come sviluppatore, il linguaggio di programmazione che preferisci varia a seconda della parte di Android su cui stai lavorando. Per gli sviluppatori di app, Java e Kotlin sono opzioni popolari. Per gli sviluppatori che lavorano sul sistema operativo e sui livelli inferiori al suo interno, C e C++ sono state finora scelte popolari. Oggi Google aggiunge una terza opzione per gli sviluppatori di sistemi operativi, poiché il progetto Android Open Source ora supporta il linguaggio di programmazione Rust per lo sviluppo del sistema operativo stesso.

Limitazioni di C e C++

I livelli inferiori del sistema operativo Android richiedono linguaggi di programmazione di sistema come C e C++. Questi linguaggi forniscono agli sviluppatori controllo e prevedibilità, aspetti importanti quando si accede a risorse di sistema e hardware di basso livello.

Sfortunatamente, C e C++ non riescono a fornire garanzie di sicurezza della memoria, rendendoli soggetti a bug e vulnerabilità della sicurezza. Lo sviluppatore è responsabile della gestione della durata della memoria su questi linguaggi, ma in basi di codice complesse e multi-thread, è più facile a dirsi che a farsi.

C e C++ insieme costituiscono decine di milioni di righe di codice sulla piattaforma Android. Questi bug di sicurezza della memoria diventano la fonte di errore del codice più difficile da risolvere, rappresentando circa il 70% delle vulnerabilità di sicurezza ad alta gravità di Android. La semplice correzione di questi bug diventa insufficiente per affrontare il problema e un approccio migliore sarebbe innanzitutto prevenirli.

La mancanza di garanzie di sicurezza della memoria costringe gli sviluppatori a eseguire processi Android all'interno di sandbox strettamente vincolati e senza privilegi. Ma i sandbox sono costosi in termini di risorse, consumano costi aggiuntivi e introducono latenza. Inoltre, il sandboxing non elimina completamente le vulnerabilità del codice e la sua efficacia è ridotta a causa dell'elevata densità di bug, consentendo inoltre agli aggressori di concatenare più vulnerabilità.

Un'altra limitazione, sebbene non esclusiva di C e C++ ma applicabile a tutti i problemi di sicurezza della memoria, è che lo stato errato deve effettivamente essere attivato nel codice strumentato per essere rilevato. Quindi, anche se il tuo codice ha superato test eccellenti, il bug effettivo potrebbe non essere rilevato. E quando vengono rilevati dei bug, risolverli è un altro compito, che implica un processo lungo e costoso che potrebbe non sempre portare a una soluzione corretta. Pertanto, il rilevamento dei bug diventa inaffidabile e la prevenzione dei bug è l’approccio migliore da adottare alla luce di queste limitazioni.

È qui che entra in gioco il passaggio a un linguaggio sicuro per la memoria come Rust.

Ruggine e i suoi vantaggi

Rust fornisce garanzie di sicurezza della memoria utilizzando una combinazione di controlli in fase di compilazione per imporre la durata/proprietà degli oggetti e controlli di runtime per garantire che gli accessi alla memoria siano validi. Questa sicurezza viene ottenuta fornendo prestazioni equivalenti a C e C++. Rust riduce anche la necessità di sandboxing, consentendo agli sviluppatori più spazio per introdurre nuove funzionalità più sicure e con un minor consumo di risorse.

Sebbene Rust abbia effettivamente i suoi vantaggi, non è possibile passare l'intero sistema operativo Android a Rust dall'oggi al domani. E questo potrebbe non essere nemmeno necessario, dato che la maggior parte dei bug di memoria di Android si verificano in codice nuovo o modificato di recente, e circa il 50% ha meno di un anno. Google ritiene che i suoi sforzi nel linguaggio memory-safe siano meglio concentrati sui nuovi sviluppi piuttosto che sulla riscrittura del codice C e C++ maturo.

Rust si concentra anche sulla prevenzione dei bug piuttosto che appoggiarsi pesantemente sul rilevamento degli stessi, con conseguente miglioramento della correttezza del codice. Ha diverse caratteristiche chiave, come la sicurezza della memoria, la concorrenza dei dati, sistemi di tipi più espressivi, immutabili riferimenti e variabili per impostazione predefinita, gestione degli interi più sicura, migliore gestione degli errori nelle librerie standard e molto altro Di più.

Cosa significa il passaggio a Rust per Android?

Google afferma di aver aggiunto il supporto Rust al progetto Android Open Source negli ultimi 18 mesi. Ma aggiungere una nuova lingua alla piattaforma Android è un'impresa enorme. È necessario mantenere alcune toolchain e dipendenze, aggiornare l'infrastruttura e gli strumenti di test e formare gli sviluppatori.

Google ha alcuni progetti early adopter che condividerà nei prossimi mesi. Ma anche così, è stato chiarito che estendere il supporto di Rust a più sistemi operativi è un progetto pluriennale.

Da quello che possiamo vedere, Google sta già utilizzando Rust in alcuni posti. Il nuovo stack Bluetooth di Android riscrive il nome in codice "Gabeldorsche" è stato scritto in Rust. Il lavoro su Gabeldorsche è iniziato all'epoca di Android 11 ma non è ancora in uso. Android Archivio chiavi 2.0 Il modulo è scritto in Rust, così come la parte in spazio utente del raccoglitore, il driver IPC di Android. Sebbene non sia correlato ad Android, Fucsiaè nuovo netstack è scritto anche in Rust.

Per gli sviluppatori di app, il passaggio non cambia nulla sul modo in cui tu, come sviluppatore di app, scrivi app o su come funzionano le API del framework. Questa opzione influisce solo sulla modalità di scrittura del sistema operativo. Secondo un membro del team delle relazioni con gli sviluppatori Android, Google inoltre non prevede di rilasciare un NDK Rust al momento. I linguaggi supportati per lo sviluppo di app continueranno a essere Kotlin, Java, C e C++.