Как проверить шрифт на эксплойт: практическое руководство по безопасности .ttf и .otf файлов

Ситуация знакомая: клиент присылает брендбук с фирменным шрифтом, дизайнер скачивает красивый .otf с неизвестного ресурса, или на сайте предлагают бесплатный шрифт «как у Apple». Вы устанавливаете файл, и всё — система потенциально скомпрометирована. Шрифты — это не просто буквы. Это исполняемый код, который парсится операционной системой и браузером. И в этом коде можно спрятать эксплойт.

Я расскажу, как реально проверить подозрительный шрифт перед тем, как открыть его в системе, и на что смотреть, если вы не хотите стать жертвой атаки через, казалось бы, безобидный файл.

Почему шрифты — это вектор атаки

Форматы TrueType (.ttf) и OpenType (.otf) — это не картинки букв. Это набор инструкций: таблицы с координатами глифов, инструкции для хинтинга (hinting), правила подстановки лигатур, информация о кернинге. Парсер шрифта в ОС или браузере интерпретирует все эти структуры. Если в таблице записано значение, которое выходит за пределы ожидаемого диапазона, парсер может не обработать это корректно — и возникает переполнение буфера, разыменование невалидного указателя или другая память-коррупция.

В CVE-базе числятся десятки уязвимостей, связанных именно с парсингом шрифтов. Они затрагивали Windows (через шрифтовый движок Adobe, встроенный в систему), macOS (через Apple Type Services), Linux (через FreeType), браузеры (через движки рендеринга веб-шрифтов). Некоторые из них позволяли выполнить произвольный код просто при открытии документа со встроенным шрифтом или при загрузке страницы с вредоносным @font-face.

Что реально можно проверить в шрифте

Вот конкретные вещи, которые стоит искать в подозрительном файле:

  • Аномальный размер файла. Обычный шрифт с одним начертанием весит от 30 до 300 КБ. Если .ttf весит 2 МБ без видимых причин (это не вариативный шрифт с десятками осей) — подозрительно.
  • Подозрительные таблицы. Шрифт содержит набор таблиц (cmap, glyf/ CFF, hmtx, name и другие). Наличие нестандартных таблиц или таблиц с повреждённой структурой — красный флаг.
  • Экстремальные значения в метаданных. Строки в таблице name длиной в десятки килобайт, неадекдные значения в head, maxp, OS/2 — всё это признаки ручной модификации файла.
  • Встроенные бинарные объекты. В некоторых форматах можно спрятать сторонние данные — например, в пользовательских полях таблицы name или в «мёртвых» облаях файла между таблицами.
  • Подозрительные инструкции хинтинга. TrueType hinting — это по сути байткод, который выполняется при рендеринге. Сложные, чрезмерно запутанные инструкции могут быть попыткой эксплуатации.

Инструменты для анализа шрифтов

1. fonttools (TTX) — основной рабочий инструмент

Это библиотека на Python, стандарт де-факто для работы со шрифтами. Она позволяет декомпонировать .ttf/.otf в читаемый XML-формат (TTX) и проанализировать каждую таблицу.

  1. Установите: pip install fonttools
  2. Декомпонируйте шрифт: ttx suspicious_font.ttf
  3. Откройте полученный suspicious_font.ttx в текстовом редакторе
  4. Изучите структуру: количество таблиц, их размеры, содержимое

Что искать в TTX-файле:

  • Таблицы, которых быть не должно (кастомные таблицы с неизвестными тегами)
  • Значения полей, которые явно некорректны (например, unitsPerEm = 0 или 65536)
  • Очень длинные строки в таблице name — проверьте их содержимое
  • Аномальные данные в таблице glyf — количество контуров, точек, флаги

2. FreeType fuzz-тестирование

FreeType — библиотека рендеринга шрифтов, используется в Linux, Android и многих других проектах. Разработчики FreeType регулярно находят уязвимости через фаззинг. Вы можете прогнать подозрительный шрифт через fuzz-тестер, чтобы проверить, вызывает ли он сбой.

Простой подход: используйте ftfuzzer из репозитория FreeType или запустите шрифт через тестовый рендерер FreeType в изолированной среде. Если парсер падает — файл опасен.

3. OTS (OpenType Sanitizer)

Проект от Google — санитайзер для веб-шрифтов. Используется в Chrome и Firefox для проверки шрифтов перед рендерингом. Установите из репозитория и запустите:

ots-sanitize suspicious_font.ttf

Если инструмент выдаёт ошибки или предупреждения — шрифт содержит структурные проблемы. OTS не найдёт все эксплойты, но отсеет явно повреждённые и подозрительные файлы.

4. Статический анализ через Hex-редактор

Базовый, но полезный шаг. Откройте файл в HxD, 010 Editor или xxd и посмотрите:

  • Совпадает ли заголовок файла с ожидаемым (0x00010000 для TrueType, OTTO для CFF-based OpenType, wOFF для WOFF)
  • Нет ли в файле встроенных PE-заголовков (MZ), ELF-заголовков или скриптовых сигнатур после табличной части
  • Нет ли необычно больших блоков данных между таблицами

Сравнение инструментов

Инструмент Что проверяет Сложность Когда использовать
fonttools (TTX) Структура таблиц, метаданные, аномалии в данных Низкая Первичный анализ любого подозрительного шрифта
OTS Sanitizer Соответствие спецификации OpenType, структурные ошибки Низкая Проверка веб-шрифтов перед публикацией
FreeType fuzzing Поведение парсера при рендеринге, краши Средняя Глубокая проверка, если шрифт прошёл базовый анализ
Hex-анализ Встроенные бинарные объекты, подозрительные сигнатуры Низкая Быстрая первичная оценка
Песочница (sandbox) Поведение шрифта при реальной установке/рендеринге Средняя Финальная проверка перед установкой в систему

Пошаговый процесс проверки

Вот рабочий алгоритм, который я рекомендую:

  1. Проверьте источник. Если шрифт скачан с неизвестного форума или прислан в email — уже повод для проверки. Официальные репозитории (Google Fonts, Adobe Fonts) проводят базовую валидацию.
  2. Сравните хеш-сумму. Если у вас есть доступ к оригинальному файлу из доверенного источника — сравните SHA-256.
  3. Прогоните через OTS. Быстро, бесплатно, отсекает явный мусор.
  4. Декомпонируйте через fonttools. Изучите TTX-файл, обратите внимание на аномалии.
  5. Проверьте в песочнице. Откройте шрифт в изолированной среде (виртуальная машина, контейнер) и посмотрите, как он себя ведёт при установке и рендеринге.
  6. При сомнениях — не устанавливайте. Если происхождение шрифта неясно, а анализ выявил хотя бы один подозрительный признак, лучше отказаться.

Частые ошибки при проверке шрифтов

  • «Открыл в FontForge — выглядит нормально, значит безопасно». FontForge может корректно отрендерить глифы, но при этом не проверить все таблицы на наличие эксплойт-кода. Визуальная проверка — не анализ безопасности.
  • «Проверил антивирусом — чисто». Большинство антивирусов плохо детектируют эксплойты в шрифтах, потому что это специфический формат. Отсутствие детекта не означает безопасность.
  • «Это же .ttf, а не .exe — что ему сделается». Как раз .ttf и .otf — известный вектор. Парсер шрифта — сложный код с историей уязвимостей.
  • Проверяю только заголовок файла. Корректный заголовок не гарантирует безопасность содержимого. Эксплойт может быть глубоко внутри таблиц.
  • Установил шрифт, но «ничего не произошло». Многие эксплойты не вызывают видимых симптомов. Вредоносный код может установить бэкдор, который не проявит себя сразу.

Что делать в зависимости от вашей ситуации

Вы — дизайнер, клиент прислал шрифт: попросите источник. Если шрифт из известного фонда — проверьте хеш на сайте фонда. Если файл прислан в email — проанализируйте через fonttools и OTS перед установкой. Если что-то смущает — попросите клиента предоставить шрифт из официального источника.

Вы — веб-разработчик, подключаете @font-face: всегда прогоняйте шрифт через OTS перед загрузкой на сервер. Используйте WOFF2 — он проходит дополнительную трансформацию, что усложняет скрытие эксплойтов. Настройте Content Security Policy для шрифтов.

Вы — системный администратор: ограничьте установку шрифтов на рабочих станциях. Используйте AppLocker или аналогичные механизмы для контроля. Ведите белый список разрешённых шрифтов.

Вы — исследователь безопасности: используйте fonttools для создания мутантов шрифтов (mutation-based fuzzing), прогоняйте через несколько парсеров (FreeType, Windows GDI, Adobe CoolType) и сравнивайте поведение. Инструменты вроде AFL++ с кастомными мутаторами для шрифтов позволяют находить новые уязвимости.

Практические рекомендации

  • Всегда проверяйте шрифты из непроверенных источников перед установкой в систему
  • Используйте виртуальные машины или контейнеры для анализа подозрительных файлов
  • Не полагайтесь только на антивирус — он не заменяет структурный анализ
  • Если работаете с веб-шрифтами — интегрируйте OTS в пайплайн сборки
  • Обновляйте библиотеки рендеринга шрифтов в системе — многие уязвимости уже пропатчены
  • Ведите учёт установленных шрифтов в организации — чем меньше незнакомых шрифтов в системе, тем меньше поверхность атаки

Итог

Шрифт — это не безопасный текстовый файл, а сложная структура, которую система парсит и интерпретирует. Проверка подозрительного шрифта — это не паранойя, а базовая гигиена безопасности. Минимальный набор действий: проверить источник, прогнать через OTS, декомпонировать через fonttools и изучить структуру. Если на любом из этих этапов что-то вызвало подозрение — не устанавливайте шрифт. Лучше потратить 15 минут на проверку, чем разбираться с последствиями компрометации системы.

Оцените статью
PEFile — Безопасность и технологии простым языком