Google va reescriure el microprogramari pvmfm utilitzat a Android a Rust

Com a part dels seus esforços per reforçar la seguretat dels components de programari crítics de la plataforma Android, Google ha reescrit el firmware pvmfm a Rust, que s'utilitza per organitzar el funcionament de les màquines virtuals llançades per l'hipervisor pVM des de l'Android Virtualization Framework. Anteriorment, el microprogramari s'escrivia en C i s'implementava a sobre del carregador d'arrencada U-Boot, en el codi del qual es trobaven anteriorment vulnerabilitats causades per problemes de memòria.

El microprogramari reescrit a Rust s'inclou a Android 14 i les biblioteques universals creades durant el procés de desenvolupament del microprogramari s'empaqueten com a paquets de caixes i es transfereixen a la comunitat Rust. Per exemple, el paquet smccc s'ha publicat per donar suport a les interfícies ARM PSCI (Power State Coordination Interface) i les trucades SMCCC (SMC Calling Convention), i el paquet aarch64-paging per manipular taules de pàgines de memòria. També s'ha treballat per eliminar errors i ampliar la funcionalitat del paquet virtio-drivers existent amb la implementació de controladors VirtIO. A més de la plataforma Android, aquests paquets estan implicats en el projecte Oak, que desenvolupa components per transmetre, emmagatzemar i processar dades en entorns segurs (TEE, Trusted Execution Environment).

L'hipervisor de pVM pren el control al principi del procés d'arrencada i proporciona un aïllament complet de la memòria. màquines virtuals i l'entorn amfitrió, impedint que el sistema amfitrió accedeixi a màquines virtuals protegides on es processen dades sensibles. El firmware pvmfm (Protected Virtual Machine Firmware) pren el control immediatament després que s'iniciï la màquina virtual, verifica l'entorn creat i decideix si s'avorta l'arrencada si es detecten problemes d'integritat o genera un certificat d'arrencada per al sistema convidat si es confirma la cadena de confiança.

La reescriptura de Rust fa que sigui més fàcil i segur complir la "regla de dos" de Google per mantenir segurs els components del sistema Android. D'acord amb aquesta regla, qualsevol codi afegit no ha de complir més de dues de les tres condicions: treballar amb dades d'entrada no validades, utilitzar un llenguatge de programació no segur (C/C++) i executar-se amb privilegis elevats. Aquesta regla implica que el codi per processar dades externes s'ha de reduir a privilegis mínims (aïllat) o escrit en un llenguatge de programació segur. Segons les estadístiques de Google, al voltant del 70% de totes les vulnerabilitats perilloses identificades a Android són causades per errors quan es treballa amb la memòria.

Rust se centra en la seguretat de la memòria i redueix el risc de vulnerabilitats causades per problemes com ara l'accés a la memòria lliure i les excés de memòria intermèdia. Rust imposa la seguretat de la memòria en temps de compilació mitjançant la comprovació de referències, la propietat d'objectes i el seguiment de la vida útil de l'objecte (àmbits) i avaluant la correcció dels accessos a la memòria en temps d'execució. Rust també proporciona protecció contra desbordaments d'enters, requereix que els valors variables s'inicialitzin abans d'utilitzar-los, té un millor maneig d'errors a la biblioteca estàndard, utilitza el concepte de referències i variables immutables per defecte i ofereix una escriptura estàtica forta per minimitzar els errors lògics.

Entre les dificultats que sorgeixen en el procés de desenvolupament de components de baix nivell com els controladors en el llenguatge Rust, s'esmenta la necessitat de treballar amb punters nus en mode no segur, ja que Rust es crea amb la vista posada en l'ús de la memòria assignada en el i en el codi que funciona sense capes a la part superior del maquinari, hem d'accedir a la memòria compartida i al MMIO. Actualment, les capacitats de punter nus de Rust deixen molt a desitjar, però això hauria de canviar un cop s'estabilitzi el suport per a les macros offset_of, slice_ptr_get i slice_ptr_len.

Entre els desavantatges, també cal destacar la necessitat de millorar la sintaxi per accedir als camps d'estructura i als índexs de matriu mitjançant punters nus sense crear referències, així com les limitacions en la creació d'enllaços segurs sobre operacions no segures que poden provocar un comportament indefinit i que el compilador no pot comprovar. Per exemple, aquests enllaços no es poden crear per a operacions amb taules de pàgines de memòria, ja que l'assignació de pàgines en una part del programa pot afectar altres parts.

Pel que fa a la mida del codi resultant, la versió antiga del microprogramari pVM ocupava 220 kB i la nova - 460 kB, però es van afegir noves funcions a la versió reescrita, gràcies a la qual es va poder desfer-se d'algunes altres. components utilitzats durant la càrrega. Com a resultat, la mida total de tots els components d'arrencada antics i nous va resultar ser comparable. S'observa que quan la mida és més important que el rendiment, es poden aconseguir resultats comparables al llenguatge C activant modes d'optimització de mida addicionals al compilador, descartant dependències innecessàries i no utilitzant formatadors de cadena.

A més, s'esmenta el treball continuat per implementar la capacitat d'executar aplicacions de confiança escrites en el llenguatge Rust al sistema operatiu Trusty, que proporciona un entorn TEE (Trusted Execution Environment) per a Android, que s'executa en paral·lel amb Android al mateix processador en un entorn independent. entorn aïllat. Trusty s'utilitza als dispositius Pixel i ja fa servir Rust a les biblioteques i als components del sistema (el nucli es manté en C).

Font: opennet.ru

Afegeix comentari