Браузерный fingerprinting глубоко — Canvas, WebGL, шрифты, AudioContext — как тебя идентифицируют без cookies

konstrukt

МИГАЛКИ КЛУБ
Проверенный продавец
Продавец
Подтвержденный
Регистрация
19.09.18
Сообщения
842
Реакции
37
Продаж
3
Telegram
Браузерный fingerprinting: как тебя идентифицируют без cookies


Все знают про cookies и удаляют их. Но fingerprinting работает без cookies, без хранения чего-либо на твоём устройстве, и удалить его нельзя — потому что он основан на характеристиках самого браузера и железа. Каждый раз когда ты заходишь на сайт браузер невольно отдаёт набор параметров которые в совокупности уникально идентифицируют тебя.



Как работает fingerprinting в общем


Сайт запускает JavaScript который собирает десятки параметров браузера и системы. Каждый параметр по отдельности не уникален — много людей используют Chrome на Windows. Но комбинация из 30-40 параметров становится уникальной с вероятностью близкой к 100%.


Исследование EFF Panopticlick показало что более 80% браузеров имеют уникальный fingerprint даже без использования каких-либо продвинутых техник. Более свежее исследование AmIUnique подтвердило что уникальность только растёт по мере усложнения методов сбора.



Canvas fingerprinting


Один из самых точных методов. Браузер получает инструкцию нарисовать скрытое изображение — текст с определёнными шрифтами, геометрические фигуры, градиенты. Результат рендеринга зависит от GPU, драйверов, операционной системы, версии браузера и субпиксельного рендеринга шрифтов. Даже на одинаковом железе с одинаковой ОС разные версии драйверов дают разный результат на уровне отдельных пикселей.


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


Технически это выглядит так:


javascript
<span><span>const</span><span> canvas </span><span>=</span><span> </span><span>document</span><span>.</span><span>createElement</span><span>(</span><span>'canvas'</span><span>)</span><span>;</span><span><br></span></span><span><span></span><span>const</span><span> ctx </span><span>=</span><span> canvas</span><span>.</span><span>getContext</span><span>(</span><span>'2d'</span><span>)</span><span>;</span><span><br></span></span><span><span>ctx</span><span>.</span><span>textBaseline</span><span> </span><span>=</span><span> </span><span>'top'</span><span>;</span><span><br></span></span><span><span>ctx</span><span>.</span><span>font</span><span> </span><span>=</span><span> </span><span>'14px Arial'</span><span>;</span><span><br></span></span><span><span>ctx</span><span>.</span><span>fillText</span><span>(</span><span>'fingerprint text 🎨'</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>2</span><span>)</span><span>;</span><span><br></span></span><span><span></span><span>const</span><span> hash </span><span>=</span><span> canvas</span><span>.</span><span>toDataURL</span><span>(</span><span>)</span><span>;</span></span>
Этот код выполняется незаметно, результат уходит на сервер.



WebGL fingerprinting


Более мощный вариант того же принципа но через 3D рендеринг. WebGL даёт доступ к информации о GPU напрямую — производитель, модель, версия драйвера, поддерживаемые расширения. Рендеринг 3D сцены через WebGL даёт ещё более уникальный хеш чем Canvas.


Два параметра раскрываются явно без всякого рендеринга: RENDERER и VENDOR — строки которые идентифицируют GPU и производителя драйвера. На большинстве браузеров они доступны без каких-либо ухищрений.


javascript
<span><span>const</span><span> gl </span><span>=</span><span> canvas</span><span>.</span><span>getContext</span><span>(</span><span>'webgl'</span><span>)</span><span>;</span><span><br></span></span><span><span></span><span>const</span><span> debugInfo </span><span>=</span><span> gl</span><span>.</span><span>getExtension</span><span>(</span><span>'WEBGL_debug_renderer_info'</span><span>)</span><span>;</span><span><br></span></span><span><span></span><span>const</span><span> renderer </span><span>=</span><span> gl</span><span>.</span><span>getParameter</span><span>(</span><span>debugInfo</span><span>.</span><span>UNMASKED_RENDERER_WEBGL</span><span>)</span><span>;</span><span><br></span></span><span><span></span><span>const</span><span> vendor </span><span>=</span><span> gl</span><span>.</span><span>getParameter</span><span>(</span><span>debugInfo</span><span>.</span><span>UNMASKED_VENDOR_WEBGL</span><span>)</span><span>;</span></span>

AudioContext fingerprinting


Менее известный но точный метод. Браузер генерирует звуковой сигнал через Web Audio API и анализирует результат обработки. Алгоритмы обработки звука реализованы по-разному на разном железе и в разных браузерах — результат отличается на уровне числа с плавающей точкой.


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



Шрифты


Браузер не отдаёт список установленных шрифтов напрямую — но их можно перебрать косвенно. JavaScript рисует текст разными шрифтами и измеряет ширину результата. Если шрифт установлен — ширина отличается от fallback шрифта. Так за несколько миллисекунд перебирается список из сотен шрифтов и строится карта установленных.


Набор шрифтов уникален: корпоративные машины имеют одни шрифты, дизайнеры другие, геймеры третьи. В комбинации с другими параметрами это сильный идентификатор.



Остальные параметры которые собираются


Разрешение экрана и глубина цвета, часовой пояс и язык системы, список плагинов браузера, User-Agent строка со всеми деталями версии, поддерживаемые медиакодеки, параметры аппаратного ускорения, количество ядер процессора и объём памяти через Navigator API, параметры сенсорного экрана, поддержка Bluetooth и USB API.


Каждый параметр по отдельности банален. Совокупность из тридцати таких параметров уникальна.



Поведенческий fingerprinting


Отдельный уровень который часто игнорируется. Помимо технических параметров браузера собирается поведение пользователя: скорость движения мыши и паттерны движения, динамика прокрутки страницы, характер нажатий на клавиатуру — та же keystroke dynamics что и при текстовом анализе, паттерны кликов. Это работает как биометрия — уникальна для конкретного человека и не зависит от браузера или устройства.



Реальное применение


Рекламные сети используют fingerprinting для отслеживания пользователей между сайтами без cookies — особенно актуально после того как регуляторы начали давить на cookie трекинг. Банки и платёжные системы используют для обнаружения мошенничества — если fingerprint не совпадает с историей аккаунта, транзакция подозрительна. Правоохранители и спецслужбы используют для деанона пользователей даже при использовании VPN и анонимных браузеров.



Защита


Tor Browser



Лучшая защита из коробки. Специально разработан чтобы все пользователи выглядели одинаково — стандартизированный размер окна, отключённые или рандомизированные Canvas и WebGL ответы, стандартный набор шрифтов, заблокированные опасные API. Цель не скрыть fingerprint а сделать его одинаковым для всех пользователей Tor.


Mullvad Browser


Разработан совместно Mullvad и Tor Project для использования с VPN. Применяет те же принципы что и Tor Browser — стандартизация а не скрытие. Хороший выбор если Tor не подходит по скорости.


Firefox с настройками


Можно приблизиться к защите вручную: resistFingerprinting в about:config включает множество защит одновременно. Это меняет поведение Canvas, шрифтов, часового пояса, размера окна. Минус — ломает часть сайтов.


Размер окна браузера


Один из самых простых и игнорируемых параметров. Точный размер окна браузера в пикселях это уникальный идентификатор. Tor Browser принудительно округляет размер окна до стандартных значений. На обычном браузере — не разворачивать окно на весь экран, использовать стандартные размеры.


JavaScript


Большинство методов fingerprinting требуют JavaScript. Отключение JS ломает большинство сайтов но радикально снижает поверхность атаки. Компромисс — NoScript с разрешением только необходимых скриптов.


Что не помогает


Режим инкогнито — не защищает от fingerprinting вообще. Технические параметры браузера одинаковы в обычном и инкогнито режиме. VPN — скрывает IP но не fingerprint. Сайт не знает твой реальный IP но всё равно идентифицирует тебя по параметрам браузера. Смена User-Agent — меняет один параметр из тридцати, остальные остаются. Часто даже ухудшает ситуацию потому что создаёт редкую комбинацию.



Проверить себя


Coveryourtracks.eff.org — от Electronic Frontier Foundation, показывает уникальность fingerprint и какие параметры наиболее уязвимы. Amiunique.org — академический проект, детальный анализ с базой для сравнения. Browserleaks.com — детальный разбор каждого параметра по отдельности.



Вывод


Fingerprinting опасен именно потому что работает пассивно — пользователь ничего не устанавливает, ни на что не соглашается, ничего не знает. Защита требует либо специализированного браузера который стандартизирует параметры, либо глубокого понимания какие именно API использовать нельзя. Половинчатые меры типа смены User-Agent или режима инкогнито создают иллюзию защиты при её отсутствии.
 
Сверху Снизу