Ситуация знакомая: клиент присылает брендбук с фирменным шрифтом, дизайнер скачивает красивый .otf с неизвестного ресурса, или на сайте предлагают бесплатный шрифт «как у Apple». Вы устанавливаете файл, и всё — система потенциально скомпрометирована. Шрифты — это не просто буквы. Это исполняемый код, который парсится операционной системой и браузером. И в этом коде можно спрятать эксплойт.
Я расскажу, как реально проверить подозрительный шрифт перед тем, как открыть его в системе, и на что смотреть, если вы не хотите стать жертвой атаки через, казалось бы, безобидный файл.
- Почему шрифты — это вектор атаки
- Что реально можно проверить в шрифте
- Инструменты для анализа шрифтов
- 1. fonttools (TTX) — основной рабочий инструмент
- 2. FreeType fuzz-тестирование
- 3. OTS (OpenType Sanitizer)
- 4. Статический анализ через Hex-редактор
- Сравнение инструментов
- Пошаговый процесс проверки
- Частые ошибки при проверке шрифтов
- Что делать в зависимости от вашей ситуации
- Практические рекомендации
- Итог
Почему шрифты — это вектор атаки
Форматы 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) и проанализировать каждую таблицу.
- Установите:
pip install fonttools - Декомпонируйте шрифт:
ttx suspicious_font.ttf - Откройте полученный suspicious_font.ttx в текстовом редакторе
- Изучите структуру: количество таблиц, их размеры, содержимое
Что искать в 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) | Поведение шрифта при реальной установке/рендеринге | Средняя | Финальная проверка перед установкой в систему |
Пошаговый процесс проверки
Вот рабочий алгоритм, который я рекомендую:
- Проверьте источник. Если шрифт скачан с неизвестного форума или прислан в email — уже повод для проверки. Официальные репозитории (Google Fonts, Adobe Fonts) проводят базовую валидацию.
- Сравните хеш-сумму. Если у вас есть доступ к оригинальному файлу из доверенного источника — сравните SHA-256.
- Прогоните через OTS. Быстро, бесплатно, отсекает явный мусор.
- Декомпонируйте через fonttools. Изучите TTX-файл, обратите внимание на аномалии.
- Проверьте в песочнице. Откройте шрифт в изолированной среде (виртуальная машина, контейнер) и посмотрите, как он себя ведёт при установке и рендеринге.
- При сомнениях — не устанавливайте. Если происхождение шрифта неясно, а анализ выявил хотя бы один подозрительный признак, лучше отказаться.
Частые ошибки при проверке шрифтов
- «Открыл в 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 минут на проверку, чем разбираться с последствиями компрометации системы.
