9 de febrero de 2023

Google está apostando para incorporar Rust y anunciar su inclusión en Chromium

Google dio a conocer hace poco mediante una publicación la inclusión del lenguaje de programación Rust entre los lenguajes permitidos en el código del proyecto Chromium.

Se menciona que para la inclusión hay una serie de requisitos para las bibliotecas de Rust de terceros que solicitan la integración en la base de código de Chromium, por ejemplo, la biblioteca debe superar a los análogos en velocidad, consumo de memoria y estabilidad, o ser la única implementación de una determinada tecnología.

Las bibliotecas de Rust también son aceptables cuando la funcionalidad se puede ejecutar en un proceso privilegiado, o cuando el uso de la biblioteca permite reducir el riesgo de errores en comparación con otras bibliotecas o código C++. Aún no se ha decidido qué bibliotecas se pueden incluir en Chromium.

La decisión se tomó como parte de una iniciativa para evitar que aparezcan errores de memoria en el código base de Chrome. Según las estadísticas proporcionadas hace dos años, el 70 % de los problemas de seguridad críticos y peligrosos en Chromium se deben a errores de memoria.

El uso del lenguaje Rust, que se centra en la gestión segura de la memoria y proporciona una gestión automática de la memoria, reducirá el riesgo de vulnerabilidades causadas por problemas como el acceso a un área de la memoria después de que se haya liberado y el desbordamiento de búfer.

El manejo seguro de la memoria se proporciona en Rust en tiempo de compilación mediante la verificación de referencias, el seguimiento de la propiedad del objeto y la vida útil del objeto (alcance), así como mediante la evaluación de la corrección del acceso a la memoria durante la ejecución del código. Rust también brinda protección contra desbordamientos de enteros, requiere la inicialización obligatoria de los valores de las variables antes de su uso, maneja mejor los errores en la biblioteca estándar, aplica el concepto de referencias y variables inmutables de forma predeterminada, ofrece tipado estático fuerte para minimizar los errores lógicos.

El uso de Rust hará que sea más fácil y seguro aplicar la ‘regla de do’ que utiliza Google para mantener su base de código segura.

De acuerdo con esta regla, cualquier código que agregue no debe cumplir más de dos de las tres condiciones: trabajar con una entrada no validada, usar un lenguaje de programación no seguro (C/C++) y ejecutarse con privilegios elevados. De esta regla se deduce que el código para manejar datos externos debe reducirse a los privilegios mínimos (aislado) o escribirse en un lenguaje de programación seguro.

En el caso de Rust, que se desarrolló originalmente pensando en el navegador, la integración con el código existente se puede realizar sin el uso de IPC y con menos complejidad para organizar la protección contra errores de memoria, lo que acelerará el proceso de desarrollo (requiere escribir menos código y revisión más fácil) y reducir el número de errores relacionados con la seguridad.

Para simplificar la integración del código Rust con el código C++ existente y evitar los riesgos y limitaciones asociados con la integración, actualmente se decidió limitar la interacción unidireccional: llamar desde C++ a Rust (es decir, el código Rust solo se puede llamar desde el código C++) a través de funciones API, pero no mezcladas con código C++), lo que también permitirá mantener bajo control el árbol de dependencias.

La segunda limitación es solo la compatibilidad con bibliotecas de terceros que vienen en forma de componentes separados que no están vinculados a Chromium y tienen una API orientada a tareas.

Además de usar Rust para bloquear la explotación de vulnerabilidades provocadas por el acceso a bloques de memoria ya liberados (use-after-free), a partir del lanzamiento de Chrome 102, el código C++ comenzó a usar el tipo MiraclePtr (raw_ptr) en lugar del ordinario que proporciona un enlace de puntero que realiza comprobaciones adicionales para acceder a las áreas de memoria liberadas y se bloquea si se encuentran dichos accesos.

Se estima que el impacto del nuevo método de protección en el rendimiento y el consumo de memoria es insignificante.

Finalmente, cabe mencionar que todavía no hay planes para reescribir el código existente en Rust, pero a partir de ahora se permitirá la integración en la base de código de bibliotecas de terceros escritas en Rust.

El sistema de compilación ya ha agregado herramientas para compilar código Rust, ejecutar pruebas e integrar componentes Rust con código C++. Se espera que el código Rust aparezca como parte de los lanzamientos de Chrome el próximo año.