A empresa Google migrou o navegador Chrome para a biblioteca Skrifa, escrita na linguagem Rust e que oferece recursos para o processamento de fontes no formato OpenType. O Skrifa implementa um subconjunto das funcionalidades do mecanismo de fontes FreeType, necessário para a biblioteca 2D Skia, usada no Chrome e Chromium. Para desvincular a biblioteca Skia do mecanismo FreeType, foi criado um novo backend de fontes, baseado no Skrifa.
No Chrome 128, o backend escrito em Rust foi incluído em modo experimental para formatos de fontes raramente utilizados, como CFF2 e fontes coloridas. A partir do lançamento do Chrome 133, o novo backend foi ativado para todas as fontes da web nas compilações para as plataformas Linux, Android e ChromeOS. Nas plataformas Windows e macOS, o novo mecanismo ainda é usado como um backup e é aplicado caso o sistema não suporte o formato de fonte que o navegador está tentando exibir.
O código Skrifa foi desenvolvido pelos engenheiros do Google no âmbito da ferramenta Fontations e está disponível sob as licenças MIT e Apache 2.0. Para verificar a funcionalidade do Skrifa, cerca de 700 testes de unidade foram preparados. A biblioteca suporta a decodificação de glifos nos formatos glyf, CFF, CFF2, COLRv0, COLRv1, EBDT, CBDT e sbix, fontes variáveis nos formatos glyf, CFF2 e COLRv1, além de hinting de fontes nos formatos glyf, CFF e CFF2.
Além da biblioteca Skrifa, que fornece uma API para acessar os metadados das fontes e carregar os contornos dos glifos, a ferramenta Fontations inclui bibliotecas de baixo nível para leitura, análise, modificação e criação de dados de fontes no formato OpenType. Por sua vez, o Fontations faz parte do projeto Oxidize, criado para reescrever utilitários e bibliotecas para manipulação de texto e fontes, de componentes em linguagens Python (fonttools, fontmake, nanoemoji) e C++ (HarfBuzz, FreeType) para novas implementações escritas em Rust.
O desenvolvimento de componentes em Rust começou devido à ineficiência no diagnóstico de erros por meio de testes de fuzzing, uma vez que os formatos de fontes são muito complexos para cobrir todas as possíveis combinações. Por exemplo, na semana passada, foi descoberta uma vulnerabilidade crítica no FreeType que poderia permitir a execução de código ao processar fontes maliciosamente formatadas devido a um estouro de buffer. Além do mecanismo FreeType, problemas de segurança podem também ser causados por dependências utilizadas, como bzip2, libpng e zlib.
O uso de Rust permitiu reduzir significativamente a probabilidade de problemas relacionados à memória, melhorar a qualidade do código, diminuir o tempo gasto na correção de problemas de segurança e acelerar a implementação de melhorias nas funcionalidades do Chrome relacionadas a fontes. De acordo com estatísticas do Google e da Microsoft, cerca de 70% das vulnerabilidades perigosas são causadas por problemas de memória que podem ser evitados com o uso da linguagem Rust sem blocos unsafe.
Por exemplo, o uso de Rust teria evitado problemas anteriormente identificados no código do FreeType relacionados ao acesso a áreas de memória liberadas, estouro de buffer, acesso a arrays sem verificação de índices, estouros inteiros, uso inadequado de áreas de memória não inicializadas e erros de conversão de tipos.
Fonte: opennet.ru
