
Графология клялась, что раскроет характер человека по почерку. Наклон букв, нажим пера, размер петель. Наука вышла так себе: экспертизы спорили друг с другом, а криминалисты выдавали чутьё за анализ. Зато сама идея оказалась живучей. По тому, как человек пишет, действительно кое-что видно.
У вашего компьютера тоже есть почерк. Он состоит из установленных шрифтов. Каждый шрифт, который вы когда-либо поставили или получили в довесок к программе, записан в систему. Этот список уникален. Не приблизительно. Не более-менее. По данным Gómez-Boix, Laperdrix и Baudry с WWW 2018 из работы Hiding in the Crowd, полное перечисление шрифтов даёт до 13.9 бит энтропии. Этого хватает, чтобы сузить пул до одного из 15 000 пользователей. Добавьте canvas, WebGL и User-Agent, и вот вы уже один из одного.
Ваша книжная полка рассказывает гостям, кто вы. Ваш список шрифтов делает то же самое, только гости не стучатся.
Коротко: Список установленных шрифтов уникально определяет браузер. CSS-атаки читают его без JavaScript, работают в почтовых клиентах и раскрывают профессию, ОС и установленные программы. Защита есть, но она ломает интернет для миллиарда пользователей нелатинских алфавитов.
Три способа прочитать ваш почерк
Способ первый: перечисление. Скрипт перебирает список из нескольких сотен известных шрифтов. Для каждого создаёт скрытый текстовый элемент, задаёт font-family с тестируемым шрифтом и fallback. Если ширина текста отличается от fallback, шрифт на месте. Грубо, быстро, работает. Проверка 500 шрифтов занимает 200 мс. Фиксированный список из 500 популярных шрифтов даёт 6.9 бит энтропии по данным Gómez-Boix et al. за 2018 год. Полное перечисление через Local Font Access API в Chrome отдаёт весь каталог целиком, и все 13.9 бит ваши.
Способ второй: метрики. Не нужно знать, какие шрифты стоят на машине. Достаточно измерить, как они рендерятся. Один и тот же Arial на Windows и macOS выдаёт разную ширину глифов. Хинтинг, субпиксельный рендеринг, кернинг отличаются между ОС и даже между версиями одной ОС. Fifield и Egelman в 2015 году на Financial Cryptography показали: 43 Unicode-кодпоинта хватает, чтобы захватить всё разнообразие. Метрики дают 8.058 бит энтропии. Блокировка списка шрифтов этот вектор не задевает. WHOX проверяет это как C43: хеш метрик шрифтов.
Способ третий: чистый CSS. Без единой строки JavaScript. Trampert et al. из CISPA на NDSS 2025 в работе Cascading Spy Sheets показали: CSS container queries и calc и измерение ширины шрифта позволяют определить 1 176 комбинаций браузер-ОС с точностью 97.95%. Container query меняет стиль элемента в зависимости от ширины контейнера. Ширина контейнера зависит от ширины текста. Ширина текста зависит от установленного шрифта. CSS генерирует запрос к уникальному URL. Сервер получает ответ. JavaScript вообще не участвует. Чистый CSS.
WHOX отлавливает результат всех трёх способов в check F07 через Font MinHash32×8 и по сигнатурам ОС: macOS обычно показывает менее 50 шрифтов, Windows менее 100, а Linux с полным набором пакетов может выдать 200+.
Что ваши шрифты болтают о вас
Каждая программа тащит за собой шрифты, как турист сувениры. Adobe Creative Cloud ставит больше 200: Myriad Pro, Minion Pro, Adobe Garamond, Source Sans. Microsoft Office подкидывает Calibri, Cambria, Consolas и Leelawadee. TeamViewer прописывает шрифт, в названии которого зашит номер версии. JetBrains IDE ставят JetBrains Mono.
Смотрим на это глазами аналитика. Myriad Pro и Adobe Garamond и Minion Pro = дизайнер. Скорее всего подписка на Creative Cloud за $55 в месяц. Доход выше среднего. Computer Modern и Latin Modern = учёный с LaTeX. JetBrains Mono и Fira Code = разработчик. Leelawadee и Calibri, без Adobe = офисный работник.
Список шрифтов сдаёт профессию и примерную зарплату. Это не голая теория. Исследование PoPETs 2025 от Google и MIT показало, что браузерные отпечатки коррелируют с уровнем дохода и расовой принадлежностью. Шрифты вносят в эту корреляцию ощутимый вклад.
Cascading Spy Sheets: атака через почту
Вот тут становится по-настоящему скверно. JavaScript заблокирован в почтовых клиентах. Это знают все. CSS не заблокирован. Об этом почти никто не думает.
CISPA протестировали 21 почтовый клиент. 18 оказались уязвимы к CSS-фингерпринтингу. 9 из них эксплуатируются полноценно: можно определить ОС, браузер, установленные программы. Вы открываете HTML-письмо, и отправитель узнаёт, что у вас Windows 11 с Office 365, Chrome 120 и установленный Adobe Acrobat. JavaScript ни при чём. Работает чистый CSS.
И это только идентификация. Fontleak с adragos.ro в 2025 году пошёл дальше: данные можно не просто считать, а красть. Исследователи собрали кастомный шрифт с OpenType GSUB-подстановками, по сути лигатурами. Каждая комбинация символов рендерится глифом уникальной ширины. CSS отслеживает ширину и стреляет запросом на сервер атакующего. Посимвольно. Без JavaScript.
Это не фингерпринтинг. Это эксфильтрация данных. CSRF-токены, API-ключи, session ID из инлайновых <script>-тегов. DOMPurify, самый ходовой HTML-санитайзер, пропускает <style> по умолчанию. CSS-инъекция становится рабочим двойником XSS. Работает в Chrome, Firefox, Safari.
Дилемма защиты
Firefox предлагает Resist Fingerprinting через параметр layout.css.font-visibility с тремя уровнями. Уровень 1 ограничивает видимость базовыми системными шрифтами, штук 20. Уровень 2 добавляет языковые пакеты. Уровень 3 разрешает пользовательские.
Звучит разумно. Есть подвох. RFP включают 0.48% пользователей Firefox по данным fingerprint.com. Если ваш браузер показывает ровно 20 базовых шрифтов, вы попадаете в группу менее чем из полпроцента. Вы стали в 200 раз приметнее. Защита обернулась маяком. Та же история, что с отключением WebRTC, где 2% пользователей и 50-кратный рост уникальности, или блокировкой JavaScript.
W3C в курсе. Issue #4055 в CSS Fonts Working Group открыт с 2019 года. CSS Fonts Level 4 разрешает браузерам игнорировать пользовательские шрифты. На встрече Csswg 26 февраля 2025 года команда Brave обсуждала борьбу с font fingerprinting. Обсуждают до сих пор.
Причина на поверхности: ограничение шрифтов ломает нелатинские скрипты. Японский требует 10 000+ глифов. Арабский нуждается в особом шейпинге. Системные шрифты для CJK радикально различаются между ОС: японский пользователь Windows видит MS Gothic и Yu Gothic, пользователь macOS видит Hiragino и Osaka. Это огромная энтропия. Privacy и интернационализация воюют, и победителя пока не видать.
Даже если браузер наглухо заблокирует перечисление, метрики никуда не денутся. Тот же Arial, разные пиксельные ширины на Windows, macOS и Linux. 8 бит энтропии только от замеров рендеринга. Не нужно знать, какие шрифты стоят. Достаточно измерить, как они рисуют.
FAQ
Инкогнито-режим прячет мои шрифты? Нет. Приватный режим чистит cookies и историю. Список шрифтов привязан к ОС, а не к профилю браузера. Он одинаков в обычном режиме и в инкогнито.
Если удалить все нестандартные шрифты? Потеряете функциональность: документы поедут, программы могут чудить. Получите отпечаток человека, который удалил все шрифты. Крошечная группа, легко вычленяемая.
Антидетект-браузеры помогают? Они подменяют список шрифтов и метрики. Качественные, с рендерингом через отдельный движок, работают. Дешёвые подменяют список, но не метрики. WHOX проверяет оба слоя через F07 и C43 и ловит расхождения.
Может ли сайт узнать мои шрифты без JavaScript? Да. CSS container queries и calc и фоновое изображение. CISPA показали 97.95% точности на 1 176 комбинациях браузер-ОС. Работает в почтовых клиентах, где JS заблокирован.
Какой браузер лучше всех защищает от font fingerprinting? Tor Browser. Он фиксирует и список шрифтов, и рендеринг. Расплата: часть сайтов отображается криво, скорость падает.
Читайте также
- Первые 100 мс: что происходит при подключении
- Canvas-рандомизация побеждена
- Что реально работает: гайд по защите
WHOX - Отличаем настоящие сигналы от сфабрикованных. Проверьте свой отпечаток на whox.com и узнайте какие сигналы утекают из вашего браузера и насколько вы уникальны.
Похожие статьи
«Не раскрывай себя»: разбираем систему маскировки AI-авторства по винтикам
Утёк исходный код Claude Code. Мы разобрали архитектуру маскировки: семь взаимосвязанных систем от Undercover Mode до антидистилляции, проверили на 28 публичных PR от сотрудников Anthropic и составили карту каждого слоя, который система покрывает и каждого, который нет.
ИсследованияЛожь рандомизации: все Canvas-защиты побеждены
WWW'25 доказала: все 18 расширений и 5 браузеров побеждены. Canvas-шум > не защита, а маркер. Ноль рабочих решений.
ИсследованияКарта энтропии: какие сигналы браузера выдают вас
WebGL renderer несёт 6.8 бит энтропии. 13 атрибутов > 60% уникальных. 300+ сигналов > 95%. Ваш отпечаток уникален. Вы это не контролируете.