Google ya trabaja en la migraciĂ³n de diferentes componentes de Android a Rust
Desde hace ya varios meses, hemos compartido aquĂ en el blog algunas de las noticias mĂ¡s destacadas sobre el apoyo y aceptaciĂ³n que ha tenido Rust en los diferentes proyectos y desarrollos, de los cuales muchos de ellos son pesos pesados, dĂgase Linux, Windows e incluso Android.
A pesar de tener una gran aceptaciĂ³n por parte de los grandes, el cambio hacia Rust no es fĂ¡cil, ya que incluso para poder ser aceptado como segundo lenguaje de programaciĂ³n en el Kernel de Linux, tuvo que pasar por bastantes cosas para que Linus Torvalds diera el visto bueno.
Para el caso de Google, esto no ha sido una excepciĂ³n y desde hace ya varios meses, Google ha introducido Rust en muchos de sus proyectos y Android es uno de ellos y en el cual se ha llevado una etapa de migraciĂ³n bastante controlada, pues como parte de sus esfuerzos para fortalecer la seguridad de los componentes de software crĂticos de la plataforma, ahora Google dio a conocer que ha finalizado con el trabajo de la migraciĂ³n del fimware «Android Virtualization Framework’s protected VM (pVM)» a Rust.
Este firmware es utilizado para organizar el funcionamiento de las mĂ¡quinas virtuales lanzadas por el hipervisor pVM desde Android. Anteriormente, el firmware se escribĂa en C y se implementaba sobre el gestor de arranque U-Boot, en cuyo cĂ³digo se encontraron previamente vulnerabilidades causadas por problemas con la memoria.
El hipervisor pVM toma el control en una etapa temprana del arranque y proporciona un aislamiento completo de la memoria de la mĂ¡quina virtual del entorno del host, evitando el acceso desde el sistema host a las mĂ¡quinas virtuales protegidas que procesan datos confidenciales. El firmware pvmfm (Firmware de mĂ¡quina virtual protegida) toma el control inmediatamente despuĂ©s de iniciar la mĂ¡quina virtual, verifica el entorno generado y decide abortar el inicio si se detectan problemas de integridad o genera un certificado de inicio para el sistema invitado si se confirma la cadena de confianza.
La reescritura de Rust hace que sea mĂ¡s fĂ¡cil y seguro cumplir con la » regla de dos » de Google para mantener seguros los componentes del sistema Android. De acuerdo con esta regla, cualquier cĂ³digo agregado debe cumplir no mĂ¡s de dos de tres condiciones: trabajar con datos de entrada no validados, usar un lenguaje de programaciĂ³n no seguro (C/C++) y ejecutarse con privilegios elevados. Esta regla implica que el cĂ³digo para procesar datos externos debe reducirse a privilegios mĂnimos (aislado) o escribirse en un lenguaje de programaciĂ³n seguro. SegĂºn las estadĂsticas de Google, aproximadamente el 70% de todas las vulnerabilidades peligrosas identificadas en Android se deben a errores al trabajar con la memoria.
Entre las dificultades que surgen en el proceso de desarrollo de componentes de bajo nivel como controladores en el lenguaje Rust, se menciona la necesidad de trabajar con punteros en modo inseguro, ya que Rust se crea pensando en el uso de la memoria asignada en el lenguaje Rust.
Entre las desventajas, tambiĂ©n cabe destacar la necesidad de una sintaxis mejorada para acceder a campos de estructura e Ăndices de matriz a travĂ©s de punteros simples sin crear referencias, asĂ como limitaciones en la creaciĂ³n de enlaces seguros sobre operaciones inseguras que pueden causar un comportamiento indefinido y no pueden ser verificadas por el compilador.
Cabe mencionar que el nuevo firmware reescrito en Rust se incluye en Android 14 y las bibliotecas universales creadas durante el proceso de desarrollo del firmware se empaquetan como paquetes y se transfieren a la comunidad de Rust. El tamaño del cĂ³digo resultante en comparaciĂ³n con la versiĂ³n anterior del firmware pVM que ocupaba 220 kB, el nuevo cĂ³digo ocupa 460 kB, pero se agregaron nuevas funciones a la versiĂ³n reescrita, gracias a las cuales fue posible deshacerse de algunos otros componentes utilizados durante el arranque.
Como resultado, el tamaño total de todos los componentes antiguos y nuevos del maletero resultĂ³ ser comparable. Cabe señalar que cuando el tamaño es mĂ¡s importante que el rendimiento, se pueden lograr resultados comparables a los del lenguaje C habilitando modos de optimizaciĂ³n de tamaño adicionales en el compilador, descartando dependencias innecesarias y sin utilizar formateadores de cadenas.
Finalmente si estĂ¡s interesado en poder conocer mĂ¡s al respecto, puedes consultar los detalles en el siguiente enlace.