La empresa Google anunció la inclusión del lenguaje de programación Rust en la lista de lenguajes permitidos para el desarrollo de la plataforma Android. El compilador de Rust se incluyó en la base de código de Android en 2019, pero el soporte para este lenguaje había permanecido en estado experimental. Entre los primeros componentes en Rust que se planea incluir en Android están las nuevas implementaciones del mecanismo de comunicación entre procesos Binder y la pila de Bluetooth.
La adopción de Rust se realiza en el marco de un proyecto para mejorar la seguridad, promover prácticas de programación segura y aumentar la eficiencia en la detección de problemas relacionados con la memoria en Android. Se señala que aproximadamente el 70% de todas las vulnerabilidades críticas identificadas en Android son causadas por errores en la gestión de la memoria. La utilización del lenguaje Rust, que se centra en el manejo seguro de la memoria y proporciona gestión automática de la misma, permitirá reducir el riesgo de vulnerabilidades causadas por errores en la gestión de la memoria, tales como el acceso a áreas de memoria después de haber sido liberadas o desbordamientos de búfer.
El manejo seguro de la memoria en Rust se garantiza durante la compilación a través de la verificación de referencias, el seguimiento de la propiedad de los objetos y la consideración del ciclo de vida de los objetos (ámbito), así como mediante la evaluación de la correcta acceso a la memoria durante la ejecución del código. Rust también proporciona medios para protegerse contra desbordamientos enteros, exige que las variables sean inicializadas antes de su uso y maneja mejor los errores en la biblioteca estándar, aplica la conceptualización de referencias y variables inmutables por defecto, y ofrece una fuerte tipificación estática para minimizar errores lógicos.
En Android, el manejo seguro de la memoria se realiza en los lenguajes ya soportados, Kotlin y Java, pero no son adecuados para el desarrollo de componentes del sistema debido a su alta sobrecarga. Rust permite lograr un rendimiento cercano al de los lenguajes C y C++, lo que lo hace idóneo para desarrollar partes de bajo nivel de la plataforma y componentes para la interacción con el hardware.
Para garantizar la seguridad del código en C y C++ en Android se utilizan aislamiento sandbox, análisis estático y pruebas de fuzzing. Las capacidades de aislamiento sandbox son limitadas y han alcanzado su límite (descomponer aún más en procesos no es práctico en términos de consumo de recursos). Entre las limitaciones del uso de sandbox se mencionan los altos costos operativos y el aumento del consumo de memoria, causado por la necesidad de generar nuevos procesos, así como la aparición de retrasos adicionales relacionados con el uso de IPC.
Sin embargo, el sandbox no elimina las vulnerabilidades en el código, sino que simplemente reduce los riesgos y dificulta la realización de un ataque, ya que para su explotación se requiere identificar no una, sino varias vulnerabilidades. Los métodos basados en pruebas de código están limitados por el hecho de que para identificar errores es necesario crear condiciones que muestren el problema. No es posible cubrir todas las variantes, por lo que muchos errores permanecen sin ser detectados.
Para los procesos del sistema en Android, Google sigue la "regla de los dos", de acuerdo con la cual cualquier código agregado no debe cumplir más de dos condiciones de tres: trabajar con datos de entrada no verificados, usar un lenguaje de programación inseguro (C/C++) y ejecutarse sin un estricto aislamiento sandbox (la presencia de privilegios elevados). De esta regla se deduce que el código para manejar datos externos debe ser recortado a privilegios mínimos (aislado) o estar escrito en un lenguaje de programación seguro.
Google no tiene como objetivo reescribir el código existente en C/C++ a Rust, sino que planea utilizar este lenguaje para el desarrollo de nuevo código. Tiene sentido usar Rust para nuevo código, ya que, según estadísticas, la mayoría de los errores surgen en el código nuevo o recientemente modificado. En particular, alrededor del 50% de los errores de manejo de memoria en Android se detectan en el código escrito hace menos de un año.

Fuente: opennet.ru
