WebGL fingerprinting использует 3D graphics API браузера для считывания производителя GPU, модели и результатов рендеринга на уровне драйвера — создавая идентификатор устройства, который сохраняется во всех браузерах на одной машине и абсолютно не зависит от очистки cookies или смены сети. Проверьте, что раскрывает ваш браузер, прямо сейчас на whatsmy.fyi.
TL;DR
WebGL fingerprinting эксплуатирует WebGL API — тот же, что рендерит браузерные игры и 3D-карты — для извлечения строки производителя GPU, названия модели и пиксельного вывода рендеринга. Каждая модель GPU даёт немного разные результаты для идентичных команд рендеринга из-за различий в округлении чисел с плавающей точкой, поведении драйвера и аппаратной архитектуре. В сочетании с другими сигналами данные WebGL могут уникально идентифицировать 99,24% браузеров. Никакого хранения данных, ничего нельзя удалить, и VPN не может этому помешать.
Что такое WebGL Fingerprinting?
WebGL fingerprinting — техника отслеживания в браузере, злоупотребляющая WebGL API — интерфейсом JavaScript для рендеринга аппаратно-ускоренной 2D и 3D графики — для считывания специфических для устройства характеристик GPU. В отличие от отслеживания через cookies, это не требует хранения данных и не зависит от режима инкогнито или очистки данных браузера.
Техника имеет два взаимодополняющих компонента. Первый считывает статические аппаратные метаданные напрямую из API браузера: название производителя GPU, модель GPU и полный список расширений WebGL, поддерживаемых вашим драйвером. Второй компонент рендерит скрытую 3D-сцену и считывает обратно пиксельные данные — процесс, дающий немного разные результаты на каждом сочетании аппаратного обеспечения и драйвера.
WebGL fingerprinting тесно связан с canvas fingerprinting, но нацелен на другой — и более информативный — уровень вашей системы. Canvas fingerprinting фиксирует различия в 2D-рендеринге шрифтов; WebGL fingerprinting напрямую проникает в аппаратное обеспечение GPU.
Как работает WebGL Fingerprinting?
Отпечаток WebGL формируется в три этапа, каждый занимает несколько миллисекунд и полностью невидим для пользователя.
Этап 1 — Считывание аппаратных параметров
Скрипт вызывает gl.getParameter() с десятками констант для извлечения аппаратных возможностей. Большинство значений сами по себе безвредны — максимальный размер текстуры, максимальные размеры области просмотра, поддерживаемая точность шейдеров GLSL. Но одно расширение WebGL меняет всё.
Расширение WEBGL_debug_renderer_info раскрывает две константы, предназначенные для отладки: UNMASKED_VENDOR_WEBGL и UNMASKED_RENDERER_WEBGL. При запросе они возвращают точную, немаскированную строку производителя GPU — например, "NVIDIA Corporation" — и полную строку рендерера GPU — например, "NVIDIA GeForce RTX 4080/PCIe/SSE2". Эти строки одни могут сузить популяцию посетителей до менее чем 100 человек.
Этап 2 — Рендеринг 3D-сцены
Скрипт создаёт скрытый WebGL canvas и рендерит сложную сцену: градиенты, расчёты освещения и прозрачную геометрию с конкретными текстурными координатами. Поскольку арифметика с плавающей точкой обрабатывается по-разному шейдерными блоками каждого GPU — NVIDIA, AMD, Intel и Apple Silicon реализуют немного разное поведение округления — результирующие пиксели различаются на бинарном уровне.
Этап 3 — Хеш пикселей через readPixels()
Скрипт вызывает gl.readPixels() для извлечения сырого буфера пикселей RGBA из отрендеренной сцены и хеширует его — обычно с помощью MurmurHash — в компактное значение отпечатка. Этот хеш стабилен между сессиями браузера, в режиме инкогнито и после перезагрузки. Он меняется только при обновлении драйвера GPU или замене физического оборудования.
// Этап 1 — считывание немаскированных строк GPU через расширение отладки
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
const ext = gl.getExtension('WEBGL_debug_renderer_info');
if (ext) {
const vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);
const renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);
// напр. "NVIDIA Corporation", "NVIDIA GeForce RTX 4080/PCIe/SSE2"
}
// Этап 2 — сбор параметров аппаратных возможностей
const params = {
maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),
maxViewportDims: gl.getParameter(gl.MAX_VIEWPORT_DIMS),
supportedExts: gl.getSupportedExtensions(),
highFloatPrecision: gl.getShaderPrecisionFormat(
gl.FRAGMENT_SHADER, gl.HIGH_FLOAT
).precision,
};
// Этап 3 — рендеринг сцены и извлечение пикселей
const pixels = new Uint8Array(4 * canvas.width * canvas.height);
gl.readPixels(
0, 0, canvas.width, canvas.height,
gl.RGBA, gl.UNSIGNED_BYTE, pixels
);
// Хеш 'pixels' → стабильный отпечаток GPUНасколько уникален WebGL Fingerprint?
WebGL — один из сигналов с наивысшей энтропией в браузерном финп. Слой параметров GPU один даёт 10–15 бит энтропии — достаточно для идентификации марки и модели вашего оборудования. Хеш рендеринга добавляет дополнительную дискриминацию между устройствами с идентичными моделями GPU, но разными версиями драйверов.
| Находка | Значение | Источник |
|---|---|---|
| Энтропия от строк производителя и рендерера GPU | 10–15 бит | Cao et al., NDSS 2017 |
| Энтропия только от вывода рендеринга WebGL | ~5,7 бит | Исследование Fingerprint.com |
| Пользователи ПК, уникально идентифицированные (комбинированные сигналы) | 99,24% | Исследование Fingerprint.com |
| Мобильные пользователи, уникально идентифицированные | 94,5% | Исследование Fingerprint.com |
| Популяция, суженная только строкой рендерера GPU | < 0,01% посетителей | Исследование Inria / KU Leuven |
| Поддержка WebGL 2.0 браузерами (Chrome, Edge, Safari) | 95–99% | BrowserLeaks WebGL Test |
Кто использует WebGL Fingerprinting в реальной жизни?
Рекламные сети
Компании в сфере рекламных технологий используют WebGL fingerprinting для отслеживания пользователей на разных сайтах — для поведенческого таргетинга и ограничения частоты показа. По мере того как Safari заблокировал сторонние cookies по умолчанию и Chrome двигался к их отмене, fingerprinting на аппаратном уровне стал привлекательной заменой cookies.
Обнаружение мошенничества и борьба с ботами
Платформы безопасности используют данные WebGL как сигнал обнаружения ботов. Автоматизированные браузеры, запускающие headless Chrome или Puppeteer, часто сообщают строки рендерера GPU, несовместимые с заявленным user-agent. Несоответствия между заявлениями о GPU и доступными расширениями WebGL — сильные индикаторы автоматизации или виртуальных окружений.
Межбраузерное отслеживание
Поскольку строка рендерера WebGL и хеш пикселей получаются из физического оборудования, они остаются одинаковыми в разных браузерах на одной машине. Пользователь, чередующий Chrome, Firefox и Edge для обхода слежки, будет давать одинаковую строку рендерера GPU в каждом браузере.
Как защититься от WebGL Fingerprinting?
- Tor Browser (наиболее сильная защита): Tor Browser полностью отключает функцию
gl.readPixels()и ограничивает WebGL минимальным режимом черезwebgl.min_capability_mode. РасширениеWEBGL_debug_renderer_infoзаблокировано. - Brave Browser (рекомендуется для ежедневного использования): Brave применяет технику Farbling к WebGL: шум на уровне сессии и сайта вводится в вывод пикселей canvas и WebGL. API WebGL также по умолчанию блокируются в контекстах третьих лиц.
- Firefox с
privacy.resistFingerprinting: Установка этого флага вtrueвabout:configполностью отключает расширениеWEBGL_debug_renderer_info, возвращая общие значения вместо реальных строк GPU. - Safari на устройствах Apple: Safari сообщает общую строку
"Apple GPU"вместо конкретных моделей чипов. - Что не может VPN: VPN направляет трафик через зашифрованный туннель и скрывает IP-адрес, но не влияет на вывод WebGL. Проверьте работу VPN на whatsmy.fyi.
Часто задаваемые вопросы
Что именно раскрывает WebGL fingerprinting о моём оборудовании?
Как минимум: производитель GPU (NVIDIA, AMD, Intel, Apple, Qualcomm), название модели GPU и иногда версия драйвера — всё это раскрывается через расширение WEBGL_debug_renderer_info. Хеш рендеринга дополнительно кодирует поведение GPU при операциях с плавающей точкой.
Работает ли WebGL fingerprinting в режиме инкогнито?
Да. Режим инкогнито предотвращает сохранение cookies, истории и данных форм на диске — но не меняет GPU или драйвер. Расширение WEBGL_debug_renderer_infoвозвращает те же строки в окне инкогнито, что и в обычном окне.
WebGL fingerprinting мощнее canvas fingerprinting?
Они нацелены на дополняющие измерения уникальности устройства. Canvas fingerprinting фиксирует 2D-различия рендеринга шрифтов. WebGL fingerprinting напрямую раскрывает метаданные производителя и модели GPU и фиксирует 3D различия на уровне шейдеров. WebGL как правило даёт большую энтропию на сигнал. Подробнее в руководстве по canvas fingerprinting.
Может ли WebGL fingerprinting отслеживать меня в разных браузерах?
Да — это одна из его наиболее значимых возможностей. Поскольку строки производителя и рендерера GPU получаются из оборудования, они идентичны в Chrome, Firefox, Edge и любом другом браузере на одной машине.
Связанные статьи
- Что такое отпечаток браузера? Как сайты отслеживают вас без cookies — полное руководство по всем сигналам отпечатков
- Что такое Canvas Fingerprinting? Как сайты отслеживают без cookies — как 2D Canvas API фиксирует различия рендеринга шрифтов и GPU
- Что такое аудио fingerprinting? Как AudioContext отслеживает браузер — как аудиостек вашего устройства создаёт уникальный идентификатор



