Los navegadores confían en código que analiza archivos multimedia creados por desconocidos, y los atacantes han aprovechado repetidamente esos formatos contra errores de memoria de los decodificadores. Mozilla había patrocinado Rust durante casi siete años, un lenguaje concebido como alternativa segura a C++, pero a mediados de 2016 nada de él se había lanzado en Firefox; el lenguaje centrado en la seguridad todavía tenía que demostrar su valía dentro de un navegador C++ enorme y crítico para el rendimiento.
Todas las formas obvias de proteger a los usuarios se quedaban cortas. Parchear el analizador C++ significaba defender cada nueva vulnerabilidad para siempre; aislarlo en un sandbox reducía el radio de impacto sin eliminar la clase de error; y reescribir todo el navegador en Rust era una apuesta de varios años que rompería el producto durante la transición. En su lugar, el equipo de reproducción multimedia de Mozilla eligió una pieza acotada y crítica para la seguridad: el analizador de metadatos MP4 que se ejecuta sobre medios web no confiables.
Ralph Giles y Matthew Gregan escribieron un reemplazo en Rust puro para ese analizador, lo expusieron mediante una API de C para que la compilación C++ circundante quedara intacta, y verificaron que producía resultados idénticos al código al que reemplazaba. Firefox 48 lo llevó entonces a todas las plataformas de escritorio, poniendo Rust de producción frente a cientos de millones de usuarios por primera vez, con soporte para Android previsto a continuación.
El piloto funcionó porque convirtió una ideología en evidencia. Las reglas de Rust en tiempo de compilación eliminaron la clase de errores de memoria para ese componente en lugar de añadir otra capa de defensa, y la telemetría de Firefox registró cero problemas en más de mil millones de usos del nuevo código. Mozilla lo calificó como el primer paso, no el final: una plantilla probada —reemplazar el componente acotado de mayor riesgo, demostrar la paridad, lanzarlo y medir— para la migración más amplia que venía.
Comenzar la migración por el analizador que consume datos no confiables
El análisis de medios es donde los bytes no confiables se encuentran con el código nativo, así que el piloto apuntó al mayor riesgo restante por línea
Un analizador autocontenido tiene un límite nítido y comprobable: se podía verificar que la salida fuera idéntica a la del componente C++
La seguridad de memoria en tiempo de compilación eliminó toda la clase de errores en lugar de añadir otra capa de defensa
Cero problemas de telemetría en más de mil millones de usos convirtieron una apuesta de lenguaje en prueba de producción medible
Exponer Rust mediante una API de C permitió lanzar el analizador sin alterar el resto de la compilación C++
Introducir nueva tecnología en una base de código heredada es un trasplante, no una reescritura: elegir el componente de mayor riesgo con un límite comprobable, lanzarlo y dejar que los datos de producción justifiquen más
Firefox 48 llevó el primer Rust de producción a todos los usuarios de escritorio, y Mozilla trató el hito como una jugada inicial en lugar del final: la wiki Oxidation mapeó qué características de Rust llegarían a cada plataforma y cuándo, y el Bugzilla 1284816 siguió el trabajo de convertir Rust en una parte obligatoria de la compilación de Firefox. Un fallo por poca memoria encontrado durante el despliegue se corrigió para Firefox 48 cambiando a una API de creación de hilos que puede fallar y devuelve un error en lugar de bloquearse. Ese mismo camino —reemplazos acotados seguros para la memoria y demostrados mediante telemetría— se convirtió en el modelo para los componentes Rust que siguieron.
CONSULTA LAS PRUEBAS
Las fuentes
- Shipping Rust in Firefox Mozilla Hacks · hacks.mozilla.org ·
- mozilla/mp4parse-rust — Parser for ISO Base Media Format aka video/mp4 written in Rust GitHub · github.com