WebGPU раскрывает производителя, архитектуру и устройство адаптера без отладочных расширений. Новая поверхность фингерпринтинга и как от неё защититься.
WebGPU — современный преемник WebGL: низкоуровневый API с меньшими накладными расходами, дающий веб-страницам прямой доступ к вычислительному и рендеринговому конвейеру GPU. С тех пор как Chrome 113 и Edge 113 выпустили его в стабильной версии в мае 2023 года, принятие WebGPU в экосистеме Chromium неуклонно растёт. Сообщества по безопасности и конфиденциальности заметили, что WebGPU раскрывает больше аппаратно-идентифицирующей информации, чем WebGL, и делает это через стандартные API первого класса, а не через отладочное расширение, которое браузеры постепенно упраздняют. Это делает WebGPU следующей главной поверхностью для GPU-фингерпринтинга — и большинство антидетект-инструментов ещё не успели адаптироваться.
Ключевые выводы
navigator.gpu.requestAdapter()по умолчанию возвращает метаданные адаптера — производителя, архитектуру, устройство и строки драйвера без расширений и запроса разрешений.- Поддерживаемые Limits и Features сами по себе образуют высококардинальный отпечаток даже без прямого чтения строки производителя.
- Вычислительные шейдерные бенчмарки дают аппаратно-зависимый результат с плавающей точкой, который можно хешировать в стабильный токен устройства — аналог пиксельного хеша WebGL.
- Большинство антидетект-инструментов сфокусированы на WebGL, оставляя сигналы WebGPU незащищёнными в большинстве приватных конфигураций.
- Согласованный спуфинг крайне сложен: подмена информации адаптера без изменения вычислительного вывода делает вас более идентифицируемым, а не наоборот.
Как WebGPU раскрывает идентичность GPU
WebGL требовал специального расширения — WEBGL_debug_renderer_info — чтобы раскрыть реальные строки производителя GPU и рендерера. WebGPU такого обходного пути не требует. Вызов navigator.gpu.requestAdapter() возвращает GPUAdapter, чьё синхронное свойство .info содержит объект GPUAdapterInfo с четырьмя полями: vendor (производитель), architecture (архитектура), device (устройство) и description (описание). На типичном десктопе эти поля раскрывают производителя GPU, семейство микроархитектуры, модель устройства и иногда метку сборки драйвера — всё без единого запроса разрешения.
Помимо этого, адаптер предоставляет:
limits— объектGPUSupportedLimitsс более чем 30 числовыми значениями возможностей: максимальный размер текстуры, максимальный размер буфера, максимальное количество вычислительных рабочих групп, максимальное число групп привязки и др. Эти числа отражают физический GPU и драйвер и существенно отличаются между семействами аппаратуры.features— наборGPUSupportedFeatures, перечисляющий дополнительные возможности GPU и драйвера:float32-filterable,timestamp-query,shader-f16и другие. Точный набор зависит от семейства GPU и версии драйвера.isFallbackAdapter— булев флаг, равныйtrue, когда браузер использует программный рендерер. Программный рендерер — сильный сигнал безголового или виртуализированного окружения, аналог строкиllvmpipeв WebGL.
Совокупность этих свойств даёт более богатый отпечаток, чем большинство реализаций WebGL, и он доступен синхронно после первоначального асинхронного запроса адаптера.
Чтение адаптера на практике
Приведённый код показывает, насколько мало усилий требуется для сбора ключевых аппаратных сигналов WebGPU.
async function getWebGPUFingerprint() {
if (!navigator.gpu) return { supported: false };
const adapter = await navigator.gpu.requestAdapter();
if (!adapter) return { supported: false, reason: 'no-adapter' };
// Прямая идентификация оборудования — расширение не нужно
const { vendor, architecture, device, description } = adapter.info;
// Числовые лимиты возможностей (30+ значений, все аппаратно-зависимы)
const limits = {};
const limitKeys = [
'maxTextureDimension2D',
'maxBufferSize',
'maxComputeWorkgroupSizeX',
'maxComputeWorkgroupsPerDimension',
'maxBindGroups',
];
for (const key of limitKeys) {
limits[key] = adapter.limits[key];
}
// Набор дополнительных функций
const features = [...adapter.features];
return {
supported: true,
isFallback: adapter.isFallbackAdapter,
info: { vendor, architecture, device, description },
limits,
features,
};
}
Вы можете проверить значения WebGPU адаптера своего браузера в реальном времени с помощью инструмента обнаружения отпечатков BrowserInsight.
Хеширование вывода вычислительных шейдеров
Наиболее мощная техника WebGPU-фингерпринтинга выходит за рамки метаданных. Скрипт может запросить устройство у адаптера, загрузить вычислительный шейдер с операциями над числами с плавающей точкой, выполнить его на GPU и прочитать результирующий буфер в JavaScript. Поскольку GPU разных архитектур и версий драйверов немного по-разному округляют числа, обрабатывают точность и ограничения, численные результаты различаются между семействами аппаратуры, оставаясь стабильными для одного устройства при перезагрузке страниц.
async function computeHash(device) {
// Небольшой буфер для записи результатов шейдером
const outputBuffer = device.createBuffer({
size: 16,
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
});
// Шейдер выполняет операции с плавающей точкой, различающиеся по GPU
const shaderCode = `
@group(0) @binding(0) var<storage, read_write> out: array<f32>;
@compute @workgroup_size(1)
fn main() {
out[0] = sqrt(2.0) * sin(1.5707963);
out[1] = log(exp(1.0)) + pow(2.0, 0.5);
}
`;
// ... компиляция, диспетчеризация, чтение, хеширование
}
Практический результат — стабильное устройство-специфичное число, коррелирующее с информационными строками адаптера, но добавляющее дополнительную энтропию. Сайты могут комбинировать оба источника для более надёжного GPU-идентификатора.
WebGPU и WebGL как поверхности для фингерпринтинга
WebGPU и WebGL частично пересекаются в том, что в итоге раскрывают — ваш GPU, — но различаются тем, насколько легко это сделать и насколько результат устойчив.
| Свойство | WebGL | WebGPU |
|---|---|---|
| Строки идентичности | Через расширение WEBGL_debug_renderer_info | Встроены в GPUAdapter.info по умолчанию |
| Риск устаревания расширения | Помечено для удаления в ряде браузеров | Неприменимо — info является основным API |
| Числовые лимиты | ~15 значений возможностей | 30+ структурированных Limits |
| Набор дополнительных функций | Варьируется по драйверу | Явный набор features |
| Вычислительный хеш | Через readPixels() рендеринговой сцены | Через readBuffer() вычислительного шейдера |
| Сигнал программного рендерера | Строка llvmpipe или SwiftShader | isFallbackAdapter: true |
Ключевое преимущество для трекеров — WebGPU является более чистым API: метаданные структурированы, а не встроены в строку свободного формата; лимиты многочисленнее и точнее определены; вычислительный путь для хеширования создан специально для вычислений, а не позаимствован из конвейера рендеринга. Подробнее о WebGL см. в нашем глубоком разборе WebGL-фингерпринтинга. Оба сигнала формируют часть общей картины из руководства по браузерному фингерпринтингу.
Ландшафт угроз
Спецификация WebGPU — стандарт W3C, и её последствия для конфиденциальности обсуждались в соответствующей рабочей группе, однако спецификация ставит высокопроизводительную графику и вычисления выше минимизации раскрытия оборудования. Осведомлённость трекеров о WebGPU растёт: он появляется в виде переключателя в профессиональных антидетект-браузерах вроде Dolphin Anty именно потому, что операторы знают: неподавленный WebGPU может раскрыть их спуфинг.
Одновременно большинство браузерных расширений и потребительских инструментов конфиденциальности, добавляющих шум к сигналам WebGL, ещё не обновились для покрытия WebGPU. Это отставание делает WebGPU-фингерпринтинг фактически незащищённой поверхностью для большинства пользователей сегодня.
Способы защиты и их компромиссы
Brave: фарблинг расширен на WebGPU
Brave расширил систему фарблинга на WebGPU, добавив случайизацию строк информации адаптера и вычислительного вывода для каждого источника и каждой сессии. Применяется та же модель, что и для WebGL: шум детерминирован внутри сессии (чтобы страницы работали), но отличается между источниками и сессиями (так нельзя построить кросс-сайтовый идентификатор). Это наиболее практичная потребительская защита для повседневного использования.
Tor Browser
Tor Browser ограничивает доступ к WebGPU, считая его высокорисковой поверхностью фингерпринтинга. Цель — как и с WebGL — унификация, а не спуфинг: каждый пользователь Tor представляет одинаковую (отсутствующую) поверхность. Теоретически это сильнее, но может ломать GPU-ускоренные веб-приложения.
Отключение WebGPU в Firefox
Firefox поддерживает WebGPU через флаг (dom.webgpu.enabled в about:config). Полное отключение убирает поверхность, но, как и с отключением WebGL, само отсутствие WebGPU становится отличительной чертой в среде, где браузеры всё чаще включают его по умолчанию.
Почему произвольный спуфинг даёт обратный эффект
Если вы подменяете строку производителя из GPUAdapter.info, не меняя при этом Limits, набор функций или вычислительный вывод, вы создаёте внутренне противоречивую картину. Детектор коррелирует эти поля: устройство, сообщающее производителя «Apple» при NVIDIA-образных Limits и вычислительных результатах, мгновенно выделяется. Эффективный спуфинг требует либо полной согласованности всех сигналов, либо общей унификации (подходы Tor и Brave). Индивидуальная случайизация без координации обычно достигает обратного эффекта.
Часто задаваемые вопросы
Нужны ли разрешения для чтения информации адаптера WebGPU?
Нет. Вызов navigator.gpu.requestAdapter() не вызывает запроса разрешений. Метаданные адаптера — производитель, архитектура, устройство — возвращаются по умолчанию, как разрешение экрана или часовой пояс. Никакого жеста пользователя не требуется.
Уже ли используется WebGPU-фингерпринтинг на реальных сайтах?
Да, по меньшей мере в исследовательских и антидетект-сообществах. Инструменты вроде BrowserLeaks включают считывание WebGPU, а поставщики антидетект-браузеров явно предлагают спуфинг WebGPU как функцию — это подтверждает, что активные сборщики отпечатков уже его используют. Массовые рекламные и аналитические скрипты добавляют поддержку медленнее, но разрыв сокращается.
Можно ли проверить своё собственное раскрытие через WebGPU?
Инструмент обнаружения отпечатков BrowserInsight показывает ваши актуальные сигналы GPU, включая данные адаптера WebGPU там, где их поддерживает ваш браузер.
Чем WebGPU-фингерпринтинг отличается от WebGL?
WebGL раскрывает аппаратные метаданные главным образом через расширение WEBGL_debug_renderer_info, которое некоторые браузеры ограничивают. WebGPU раскрывает структурированную информацию адаптера — производитель, архитектура, устройство, драйвер — через свойство основного API без каких-либо расширений. WebGPU также предоставляет больше лимитов возможностей, более чёткое перечисление набора функций и вычислительно-ориентированный путь вывода для поведенческого хеширования.
Отключение JavaScript предотвращает WebGPU-фингерпринтинг?
Да, WebGPU — это JavaScript API, поэтому его отключение убирает поверхность. Однако отключение JavaScript ломает подавляющее большинство современных веб-приложений, что делает это непрактичной защитой для большинства пользователей.


