Разработчики веб-браузера Google Chrome сообщили, что отказываются от библиотеки рендеринга шрифтов FreeType и переходят на открытый проект Skrifa, написанным на Rust для лучшей безопасности памяти при обработке шрифтов в интернете и предоставляющий возможности для обработки шрифтов в формате OpenType.
Проект Skrifa реализует подмножество возможностей шрифтового движка FreeType, необходимое для 2D‑библиотеки Skia, применяемой в Chrome и Chromium. Для избавления библиотеки Skia от привязки к движку FreeType создан новый шрифтовой бэкенд, основанный на Skrifa.
По информации OpenNET, в Chrome 128 написанный на Rust бэкенд был включён в экспериментальном режиме для редко используемых форматов шрифтов, таких как CFF2 и цветные шрифты. Начиная с выпуска Chrome 133 новый бэкенд задействован для всех веб‑шрифтов в сборках для платформ Linux, Android и ChromeOS. На платформах Windows и macOS новый движок пока используется в качестве запасного и применяется в случае, если система не поддерживает формат шрифта, который пытается отобразить браузер.
Код Skrifa разработан инженерами Google в рамках инструментария Fontations и опубликован под лицензиями MIT и Apache 2.0. Для проверки корректности работы Skrifa подготовлено около 700 unit‑тестов. Библиотека проекта поддерживает декодирование глифов в форматах glyf, CFF, CFF2, COLRv0, COLRv1, EBDT, CBDT и sbix, вариативные шрифты в форматах glyf, CFF2 и COLRv1, хинтиг шрифтов в форматах glyf, CFF и CFF2.
Помимо библиотеки Skrifa, предоставляющей API для доступа к метаданным шрифтов и загрузки контуров глифов, инструментарий Fontations включает низкоуровневые библиотеки для чтения, разбора, изменения и создания шрифтовых данных в формате OpenType. В свою очередь Fontations является частью проекта Oxidize, созданного для перевода утилит и библиотек для работы с текстом и шрифтами с компонентов на языках Python (fonttools, fontmake, nanoemoji) и C++ (HarfBuzz, FreeType) на новые реализации, написанные на Rust.
Разработка компонентов Skrifa на Rust началась из‑за недостаточной эффективности выявления ошибок при помощи fuzzing‑тестирования, так как форматы шрифтов слишком сложны для охвата всех возможных комбинаций. Использование Rust позволиляет снизить вероятность появления проблем при работе с памятью, повысить качество кода, снизить затраты времени на исправление проблем с безопасностью и ускорить внесение улучшений в возможности Chrome, связанные со шрифтами. По статистике Google и Microsoft около 70% опасных уязвимостей вызваны проблемами при работе с памятью, которых можно избежать при использовании языка Rust без unsafe‑блоков.
Например, использование Rust, позволило было избежать ранее выявлявшихся в коде FreeType проблем, связанных с обращением к освобождённым областям памяти, выходом за границу буфера, доступом к массивам без проверки индексов, целочисленными переполнениями, некорректным использованием необнулённых областей памяти и ошибками приведения типов.
Источник новости: habr.com