Os navegadores confiam em código que analisa arquivos de mídia criados por estranhos, e os atacantes têm repetidamente usado esses formatos como arma contra bugs de memória dos decodificadores. A Mozilla patrocinava o Rust havia quase sete anos, uma linguagem concebida como alternativa segura ao C++, mas em meados de 2016 nada dele havia sido lançado no Firefox; a linguagem que prioriza a segurança ainda precisava provar seu valor dentro de um navegador C++ gigante e crítico para o desempenho.

As formas óbvias de proteger os usuários ficaram todas aquém. Corrigir o analisador C++ significava defender cada nova vulnerabilidade para sempre; isolá-lo em sandbox reduzia o raio de impacto sem eliminar a classe de bug; e reescrever o navegador inteiro em Rust era uma aposta de vários anos que quebraria o produto no meio do caminho. A equipe de Reprodução de Mídia da Mozilla, em vez disso, escolheu uma peça delimitada e crítica para a segurança: o analisador de metadados MP4 que processa mídia web não confiável.

Ralph Giles e Matthew Gregan escreveram uma substituição em Rust puro para esse analisador, expuseram-na por meio de uma API C para que a compilação C++ ao redor permanecesse intacta, e verificaram que ela produzia resultados idênticos aos do código que substituía. O Firefox 48 então a levou a todas as plataformas desktop, colocando o Rust de produção diante de centenas de milhões de usuários pela primeira vez, com suporte ao Android planejado para em seguida.

O piloto funcionou porque transformou uma ideologia em evidência. As regras de compilação do Rust eliminaram a classe de bugs de memória para esse componente em vez de adicionar outra camada de defesa, e a telemetria do Firefox registrou zero problemas em mais de um bilhão de usos do novo código. A Mozilla o chamou de primeiro passo, não de conclusão: um modelo comprovado — substituir o componente delimitado de maior risco, provar a paridade, lançar e medir — para a migração maior que viria.

Comece a migração pelo analisador que consome dados não confiáveis

A análise de mídia é onde bytes não confiáveis encontram código nativo, então o piloto mirou o maior risco restante por linha

Um analisador autocontido tem uma fronteira nítida e testável: a saída idêntica à do componente C++ podia ser verificada

A segurança de memória em tempo de compilação removeu toda a classe de bug em vez de adicionar outra camada de defesa

Zero problemas de telemetria em mais de um bilhão de usos converteram uma aposta na linguagem em prova de produção mensurável

Expor o Rust por meio de uma API C permitiu que o analisador fosse lançado sem perturbar o restante da compilação C++

Trazer nova tecnologia para uma base de código legada é um transplante, não uma reescrita: escolha o componente de maior risco com uma fronteira testável, lance-o e deixe os dados de produção defenderem mais

O Firefox 48 levou o primeiro Rust de produção a todos os usuários de desktop, e a Mozilla tratou o marco como um movimento de abertura, não como a conclusão: o wiki Oxidation mapeou quais recursos do Rust chegariam a cada plataforma e quando, e o Bugzilla 1284816 acompanhou a transformação do Rust em parte obrigatória da compilação do Firefox. Uma falha de baixa memória encontrada durante a implantação foi corrigida para o Firefox 48 trocando-se para uma API de construção de threads sujeita a falhas que retorna um erro em vez de travar. O mesmo caminho — substituições delimitadas com segurança de memória comprovadas por telemetria — tornou-se o modelo para os componentes Rust que se seguiram.

CONFIRA AS EVIDÊNCIAS

As fontes

  1. Shipping Rust in Firefox Mozilla Hacks · hacks.mozilla.org ·
  2. mozilla/mp4parse-rust — Parser for ISO Base Media Format aka video/mp4 written in Rust GitHub · github.com