Tu avatar podía comprometer tu navegador: Chromium reescribe los decodificadores de imágenes en un lenguaje más seguro y ya hay resultados.

Tu avatar podía comprometer tu navegador: Chromium reescribe los decodificadores de imágenes en un lenguaje más seguro y ya hay resultados.

Chromium crea una arquitectura común para migrar gradualmente los decodificadores de imágenes a Rus

image

Las imágenes en las páginas web parecen inofensivas, pero la forma en que se procesan sigue siendo durante años uno de los puntos débiles de los navegadores. Los desarrolladores de Chromium están migrando gradualmente los decodificadores de imágenes de C++ a Rust para reducir el número de vulnerabilidades relacionadas con la corrupción de memoria sin, al mismo tiempo, ralentizar los sitios.

El navegador obtiene las imágenes directamente de Internet y comienza a analizarlas antes de que el archivo se descargue por completo. Una imagen especialmente preparada puede aprovechar errores en el decodificador, provocar un fallo o ejecutar código malicioso. Ese tipo de problemas ocurre con mayor frecuencia en componentes grandes y complejos escritos en C++, donde resulta difícil garantizar por completo que el programa no accederá a regiones de memoria incorrectas.

El primer ejemplo funcional fue el decodificador PNG en Rust. Demostró que en Chromium se puede introducir un lenguaje más seguro sin perder compatibilidad ni rendimiento. Más tarde se unió Microsoft al proyecto y ayudó a convertir el experimento aislado en un esquema general que se puede aplicar a otros formatos.

El siguiente formato fue BMP. Los especialistas de Microsoft crearon un nuevo decodificador basado en la biblioteca image para Rust y lo ajustaron de modo que el navegador pueda procesar el archivo por partes a medida que se descarga. Este modo es obligatorio para Chromium, ya que el navegador no espera a recibir toda la imagen y empieza a procesarla de inmediato.

El nuevo decodificador BMP ya funciona en navegadores basados en Chromium. La migración se completó en aproximadamente seis meses, mientras que con PNG el equipo trabajó mucho más tiempo en la fase inicial. Los desarrolladores reutilizaron mecanismos existentes de enlace con Chromium y con la biblioteca gráfica Skia, además de aplicar pruebas ya existentes, comprobar la compatibilidad y probar el decodificador con usuarios reales.

Al portar el decodificador BMP a Rust no solo se mejoró la seguridad, sino también la velocidad en el procesamiento de imágenes. Según las pruebas, el tiempo necesario para decodificar BMP se redujo en promedio entre un 20% y un 50%, según la plataforma. Los desarrolladores atribuyen la ganancia de rendimiento no al lenguaje en sí, sino a bibliotecas modernas más sencillas y a la eliminación de secciones de código obsoletas.

Mientras el equipo reescribía el decodificador, también eliminaron el soporte para PNG y JPEG incrustados dentro de BMP. Chromium había mantenido ese mecanismo por los viejos controladores de impresora de Windows, que podían procesar por sí mismos las imágenes incrustadas. La función apenas tenía utilidad en la actualidad y, en cambio, ampliaba la superficie de ataque.

Rust también ayuda a reducir la cantidad de fallos difíciles de explicar. Un error de memoria en un decodificador en C++ puede corromper datos y el navegador acabará fallando más tarde y en un lugar completamente distinto. Como resultado, el sistema recopila numerosos informes dispersos. El manejo más estricto de la memoria de Rust evita gran parte de esos escenarios dentro del propio decodificador.

Actualmente los desarrolladores preparan los decodificadores ICO y JPEG. Más adelante el equipo planea ocuparse de WebP, TIFF, JPEG 2000 y SVG. El formato JPEG XL ya es compatible mediante código en Rust, y el GIF en Chromium lo gestiona el decodificador Wuffs, escrito en un lenguaje seguro.

El resultado principal del proyecto no fue solo reemplazar componentes individuales, sino disponer de un esquema listo sobre cómo migrar progresivamente al código nuevo. Cada nuevo decodificador ahora se puede integrar mediante una arquitectura común, comprobar en pruebas e incluirse en el navegador después de evaluar su velocidad, estabilidad y compatibilidad.