CSS Fingerprint 2026

Что CSS узнаёт о вас без единой строки JavaScript

КАК ЭТО РАБОТАЕТ

Техника CSS-эксфильтрации

01

CSS ЗОНДЫ

Браузер загружает страницу с CSS-правилами, содержащими условные url() — JavaScript не запускается

02

УСЛОВНАЯ ЗАГРУЗКА

@supports, @media и container queries отправляют HTTP-запросы только при совпадении условий

03

СБОР НА СЕРВЕРЕ

Сервер логирует, какие пиксельные URL были запрошены — каждый запрос раскрывает один бит

04

СБОРКА ОТПЕЧАТКА

Результаты собираются в уникальное битовое поле и хешируются в CSS-отпечаток

Отпечаток, который работает без JavaScript

Стандартная защита от фингерпринтинга всегда звучала так: "отключи JavaScript". Запустить NoScript на максимальной защите. Tor Browser в режиме самой параноидальной настройки. JavaScript не прочитает ваш canvas если не сможет выполниться. Логично. До 2025 года. В 2025 году исследователи из CISPA Helmholtz опубликовали работу "Sneaky Fingerprinting". Они показали 97.95% точности идентификации на 1176 комбинациях браузер-ОС, используя ноль JavaScript. Один CSS. Атака работает внутри почтовых клиентов, внутри iframe-превью, внутри рендеров Markdown, в любом контексте где парсится таблица стилей. NoScript её не блокирует. Tor Browser смягчает, но не убирает. Apple Mail и Thunderbird с включёнными картинками открыты настежь. Дальше: как таблица стилей собирает биты о вашей машине без единой строчки кода, почему математическая атака на субпиксельную арифметику это красивая работа, и почему всё это меняет смысл фразы "блокирую трекеры".

Анатомия молчаливого отпечатка

Трюк в условной загрузке ресурсов. У CSS есть три конструкции которые работают как if-выражения: `@supports`, `@media` и container queries. Каждая проверяет фичу. Внутри подходящего правила атакующий ставит `background-image: url(/fp/feature-X.png)`. Браузер запрашивает картинку только если условие сработало. Сервер логирует какие URL были запрошены. Всё. Массив турникетов для браузеров, по сути. Каждое условное правило это ворота. Браузер проходит через те, на которые у него хватает фич. Каждые ворота щёлкают и сообщают серверу свой идентификатор. Типичная фингерпринт-таблица содержит от 150 до 300 проб. Каждая проба соответствует одному биту: - `@supports (color: oklch(50% 0.1 100))`: поддерживает ли браузер CSS Color 4? - `@media (resolution: 192dpi)`: Retina-дисплей? - `@media (prefers-color-scheme: dark)`: тёмная тема активна? - `@container (min-width: 10ch)`: измерение ширины шрифта? - `@supports (font-tech(palettes))`: доступны ли шрифты COLR-v1? Браузер тихо обрабатывает каждое правило. Каждое совпадение запускает один HTTP GET. Сервер собирает битовое поле в реальном времени, хеширует его, и получает 256-битный идентификатор который переживает очистку кук, смену сетей и ротацию прокси. Отпечаток зависит от набора фич браузера и установленных в ОС шрифтов. Оба меняются медленно, часто вообще не меняются между сессиями. От пользователя требуется: ноль кликов, ноль разрешений, ноль JavaScript. Достаточно просто посмотреть письмо или открыть страницу.

Субпиксельная арифметика как индикатор

Эту часть стоит знать каждому, кто пишет браузерные движки. В современном CSS есть математические функции. `calc(sin(1) * 1000px + 500px)`. Результат зависит от того как layout-движок браузера обрабатывает тригонометрическую точность и округление пикселей. Blink в Chrome использует один путь округления. Gecko в Firefox другой. WebKit в Safari третий. Конкретное субпиксельное значение в конце вычисления отличается по движкам, иногда даже по версии сборки внутри одного движка. Теперь добавьте к этому container query на дробном пороге: ``` @container (min-width: 1341.470984807897px) { body { background-image: url(/fp/math-precise); } } ``` Браузер запрашивает картинку только если его calc-результат округлился определённым образом. Расставив десятки таких пороговых проверок на разных дробных значениях, атакующий превращает тригонометрическую точность в отпечаток. В работе CISPA это называется "Template Attack" применительно к системным шрифтам: `font: menu`, `font: caption`, `font: status-bar` резолвятся в разные шрифты под разными ОС, а `calc(10ch)` измеряет их среднюю ширину символа с субпиксельной точностью. Итог: один и тот же браузер на Windows и macOS выдаёт разные биты потому что ОС подкладывает разные шрифты в `font: caption`. Движок рендера обрабатывает измерение `ch` детерминированно, поэтому бит стабильный для каждой ОС. Между ОС это чистое разделение. Та же логика что у атаки по энергопотреблению CPU для восстановления криптоключа, только поверхность здесь это математика браузера. Информация была всегда. Спецификация её честно отдаёт. До 2025 года просто никто не слушал.

Старая методичка больше не работает

Три слоя защиты, от худшего к менее плохому. NoScript и JavaScript-блокировщики не делают ничего против CSS-фингерпринтинга. Их threat model предполагала что JS это канал атаки. CSS этим каналом не работает. NoScript на максимальном уровне всё равно парсит стили. Биты утекают. Отключение картинок на уровне браузера полностью убивает CSS-фингерпринтинг. Браузер не запрашивает ни одного URL, значит ни одна проба не сработает. Побочный эффект: примерно 80% современного веба становится непригодным к использованию. Для почтовых клиентов это приемлемо (в Thunderbird опция "Блокировать удалённое содержимое" решает вопрос), для повседневного браузинга нет. Подход Tor Browser это нормализация. Размер окна заперт, набор шрифтов ограничен фиксированным списком, prefers-color-scheme сообщает одинаковое значение всем, пороги container query квантуются. Большинство CSS-проб возвращают одинаковый ответ для всех Tor-пользователей, что схлопывает популяцию. Работа CISPA это подтверждает: Tor Browser-пользователи были идентифицируемы по CSS-битам, но идентификация в основном сводилась к "это Tor-пользователь", а не к конкретному человеку. Несовершенно, но осмысленно. Для почты конкретно: отключите загрузку удалённых картинок. Thunderbird, Apple Mail, Outlook это умеют. Работа CISPA задокументировала 8 из 21 протестированных почтовых клиентов как уязвимые к CSS-фингерпринтингу через удалённые стили. Остальные 13 уже ограничивают CSS достаточно, чтобы атака не работала. Дефолтные настройки варьируются от клиента к клиенту. Опция "загружать картинки только от отправителей в контактах" недостаточна. CSS может быть инлайновым и всё равно запрашивать внешние ресурсы через url(). Сканер CSS-отпечатков в WHOX прогоняет полный набор проб из работы CISPA по вашему браузеру и показывает итоговый битовый паттерн, оценку энтропии, и какие именно сочетания фич вас выдали. Полезно когда нужно понять, реально ли ваше усиление закрывает канал или просто создаёт ощущение защиты.

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

Как CSS-фингерпринтинг работает без JavaScript?

CSS может условно загружать ресурсы через @supports, @media и container queries. Когда CSS-правило срабатывает, браузер автоматически запрашивает URL фонового изображения. Сервер логирует, какие URL были запрошены, собирая отпечаток из паттерна поддерживаемых функций.

CSS-фингерпринтинг — реальная угроза?

Да. Исследователи CISPA Helmholtz продемонстрировали точность 97.95% на 1176 комбинациях браузер-ОС, используя только CSS. Эта техника работает даже в почтовых клиентах, где JavaScript заблокирован.

Можно ли защититься от CSS-фингерпринтинга?

В отличие от JavaScript-фингерпринтинга, простой защиты нет. Отключение CSS сломает все сайты. Tor Browser частично смягчает это нормализацией функций браузера, но полная защита от CSS-фингерпринтинга крайне затруднена.

Все наши тесты

Запускайте весь набор WHOX из одного блока: проверки утечек, fingerprint-пробы, сетевую диагностику, репутацию IP и тесты приватности.