L'azienda Google ha annunciato l'inclusione del linguaggio di programmazione Rust tra i linguaggi consentiti per lo sviluppo della piattaforma Android. Il compilatore del linguaggio Rust è stato integrato nell'albero dei sorgenti di Android già nel 2019, ma il supporto per questo linguaggio è rimasto sperimentale. Tra i primi componenti in Rust che si prevede di fornire in Android ci sono nuove implementazioni del meccanismo di interazione tra processi Binder e dello stack Bluetooth.
L'adozione del Rust è stata effettuata nell'ambito di un progetto per migliorare la sicurezza, promuovere pratiche di programmazione sicura e aumentare l'efficacia nella rilevazione di problematiche relative alla memoria in Android. Si segnala che circa il 70% di tutte le vulnerabilità critiche rilevate in Android è causato da errori nella gestione della memoria. L'uso del linguaggio Rust, focalizzato sulla gestione sicura della memoria e con gestione automatica della memoria, contribuirà a ridurre il rischio di esploitabilità dovuto a errori nella gestione della memoria, come l'accesso a memoria dopo che è stata liberata e il superamento dei limiti del buffer.
La gestione sicura della memoria in Rust è garantita durante la compilazione tramite il controllo dei riferimenti, il monitoraggio della proprietà degli oggetti e il tracciamento del ciclo di vita degli oggetti (scoping), nonché mediante la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust fornisce anche strumenti contro il sovraccarico dei numeri interi, richiede l'inizializzazione obbligatoria dei valori delle variabili prima dell'uso, gestisce meglio gli errori nella libreria standard, applica il concetto di immutabilità (immutable) per riferimenti e variabili per impostazione predefinita e offre una forte tipizzazione statica per ridurre gli errori logici.
In Android, la gestione sicura della memoria è garantita nei linguaggi già supportati Kotlin e Java, ma non sono adatti per lo sviluppo di componenti di sistema a causa dell'alto sovraccarico. Rust consente di ottenere prestazioni vicine ai linguaggi C e C++, il che lo rende adatto per lo sviluppo di parti a basso livello della piattaforma e componenti per l'interazione con l'hardware.
Per garantire la sicurezza del codice in C e C++ su Android, vengono utilizzate l'isolamento in sandbox, l'analisi statica e il fuzzing. Le capacità di isolamento della sandbox sono limitate e hanno raggiunto il loro limite (ulteriori frazionamenti in processi non sono efficaci dal punto di vista delle risorse). Tra i limiti dell'uso della sandbox si segnalano l'elevato overhead e l'aumento del consumo di memoria, causati dalla necessità di generare nuovi processi, così come il verificarsi di ulteriori ritardi dovuti all'uso dell'IPC.
Tuttavia, la sandbox non elimina le vulnerabilità nel codice, ma riduce solo i rischi e complica la conduzione di un attacco, poiché per l'exploitation è necessario identificare non una, ma più vulnerabilità. I metodi basati su test del codice sono limitati dal fatto che per identificare errori è necessario creare condizioni che facciano emergere il problema. Coprire tutte le possibili varianti non è realizzabile, quindi molti errori rimangono inosservati.
Per i processi di sistema in Android, Google segue la "regola dei due", secondo cui qualsiasi codice aggiunto deve rientrare in non più di due condizioni su tre: lavorare con dati di input non verificati, utilizzare un linguaggio di programmazione insicuro (C/C++) e funzionare senza isolamento in sandbox rigido (con privilegi elevati). Da questa regola si deduce che il codice per elaborare dati esterni deve essere ridotto a privilegi minimi (isolato), oppure deve essere scritto in un linguaggio di programmazione sicuro.
Google non ha come obiettivo la riscrittura del codice C/C++ esistente in Rust, ma intende utilizzare questo linguaggio per sviluppare nuovo codice. Usare Rust per il nuovo codice ha senso, poiché statisticamente la maggior parte degli errori emerge in codice nuovo o recentemente modificato. In particolare, circa il 50% degli errori di gestione della memoria in Android viene identificato in codice scritto meno di un anno fa.

Fonte: opennet.ru
