Google está escribiendo y reescribiendo partes de Android en Rust para mejorar la seguridad del sistema operativo en su conjunto, frente a C y C++. ¡Siga leyendo para saber más!
Android como solución completa de sistema operativo implica muchas partes móviles. En términos muy generales, estas partes son el ecosistema de aplicaciones y luego el propio sistema operativo. Como desarrollador, el lenguaje de programación que elija varía según la parte de Android en la que esté trabajando. Para los desarrolladores de aplicaciones, Java y Kotlin son opciones populares. Para los desarrolladores que trabajan en el sistema operativo y los niveles inferiores del mismo, C y C++ han sido opciones populares hasta ahora. Hoy, Google está agregando una tercera opción para los desarrolladores de sistemas operativos, ya que el Proyecto de código abierto de Android ahora admite el lenguaje de programación Rust para desarrollar el sistema operativo.
Limitaciones de C y C++
Los niveles inferiores del sistema operativo Android requieren lenguajes de programación de sistemas como C y C++. Estos lenguajes brindan a los desarrolladores control y previsibilidad, lo cual es importante cuando se accede a recursos y hardware del sistema de bajo nivel.
Desafortunadamente, C y C++ no ofrecen garantías de seguridad de la memoria, lo que los hace propensos a errores y vulnerabilidades de seguridad. El desarrollador es responsable de administrar la vida útil de la memoria en estos lenguajes, pero en bases de código complejas y de subprocesos múltiples, es más fácil decirlo que hacerlo.
C y C++ juntos constituyen decenas de millones de líneas de código en la plataforma Android. Estos errores de seguridad de la memoria se convierten en la fuente de código incorrecto más difícil de abordar y representan aproximadamente el 70% de las vulnerabilidades de seguridad de alta gravedad de Android. Simplemente corregir estos errores resulta insuficiente para solucionar el problema y un mejor enfoque sería prevenirlos en primer lugar.
La falta de garantías de seguridad de la memoria obliga a los desarrolladores a ejecutar procesos de Android dentro de entornos sandbox muy restringidos y sin privilegios. Pero los entornos sandbox son costosos en recursos, consumen gastos generales adicionales e introducen latencia. El sandboxing tampoco elimina por completo las vulnerabilidades del código y su eficacia se reduce debido a la alta densidad de errores, lo que permite aún más a los atacantes encadenar múltiples vulnerabilidades.
Otra limitación, aunque no exclusiva de C y C++, pero aplicable a todos los problemas de seguridad de la memoria, es que el estado erróneo debe activarse en el código instrumentado para poder ser detectado. Entonces, incluso si su código tiene excelentes pruebas, el error real puede pasar desapercibido. Y cuando se encuentran errores, corregirlos es otra tarea, que implica un proceso largo y costoso que no siempre conduce a una solución correcta. Por lo tanto, la detección de errores se vuelve poco confiable y la prevención de errores es el mejor enfoque a la luz de estas limitaciones.
Aquí es donde entra en escena el cambio a un lenguaje seguro para la memoria como Rust.
Óxido y sus beneficios
Rust proporciona garantías de seguridad de la memoria mediante el uso de una combinación de comprobaciones en tiempo de compilación para hacer cumplir la vida útil/propiedad de los objetos y comprobaciones en tiempo de ejecución para garantizar que los accesos a la memoria sean válidos. Esta seguridad se logra al mismo tiempo que se proporciona un rendimiento equivalente a C y C++. Rust también reduce la necesidad de sandboxing, lo que permite a los desarrolladores más espacio para introducir nuevas funciones que sean más seguras y con menos recursos.
Si bien Rust tiene sus beneficios, no es factible cambiar todo el sistema operativo Android a Rust de la noche a la mañana. Y es posible que eso ni siquiera sea necesario, ya que la mayoría de los errores de memoria de Android ocurren en código nuevo o modificado recientemente, y aproximadamente el 50% tiene menos de un año. Google cree que sus esfuerzos en materia de lenguaje seguro para la memoria se centran mejor en nuevos desarrollos que en reescribir código C y C++ maduro.
Rust también se centra en prevenir errores en lugar de depender demasiado de la detección de errores, lo que mejora la corrección del código. Tiene varias características clave, como seguridad de memoria, concurrencia de datos, sistemas de tipos más expresivos, inmutable. referencias y variables de forma predeterminada, manejo de números enteros más seguro, mejor manejo de errores en bibliotecas estándar y mucho más. más.
¿Qué significa el cambio a Rust para Android?
Google dice que ha estado agregando soporte para Rust al Proyecto de código abierto de Android durante los últimos 18 meses. Pero agregar un nuevo idioma a la plataforma Android es una tarea enorme. Es necesario mantener algunas cadenas de herramientas y dependencias, actualizar la infraestructura y las herramientas de prueba y capacitar a los desarrolladores.
Google tiene algunos proyectos de adopción temprana que compartirán en los próximos meses. Pero aun así, está quedando claro que ampliar el soporte de Rust a más sistemas operativos es un proyecto de varios años.
Por lo que podemos ver, Google ya está usando Rust en algunos lugares. La nueva pila Bluetooth de Android reescribe el nombre en código "Gabeldorsche" está escrito en Rust. El trabajo en Gabeldorsche comenzó en la época de Android 11, pero aún no está en uso. Android Almacén de claves 2.0 El módulo está escrito en Rust, al igual que la parte del espacio de usuario de Binder, el controlador IPC de Android. Si bien no está relacionado con Android, Fucsiaes nuevo pila de red También se está escribiendo en Rust.
Para los desarrolladores de aplicaciones, el cambio no cambia nada sobre cómo usted, como desarrollador de aplicaciones, escribe aplicaciones o cómo funcionan las API del marco. Este cambio solo afecta la forma en que se escribe el sistema operativo. Según un miembro del equipo de Relaciones con desarrolladores de AndroidGoogle tampoco planea lanzar un Rust NDK por el momento. Los lenguajes admitidos para el desarrollo de aplicaciones seguirán siendo Kotlin, Java, C y C++.