WebGPU 指纹识别:下一代 GPU 追踪
WebGPU API 如何暴露 GPU 适配器详情用于指纹识别,以及如何在配置文件控制层控制 GPU 身份信号。
BotBrowser Team
WebGPU 暴露适配器信息、功能名称、能力限制和渲染输出,页面可以比较它们,并且它们应与 WebGL 报告的内容一致。BotBrowser 通过 --bot-webgpu 提供 profile、real 和 disabled 三种模式用于受控测试,但不保证 WebGPU 可用,不会添加宿主无法暴露的功能,也不识别物理硬件。
要点摘要
把 --bot-webgpu=profile 与 --bot-webgl=profile 一起设置,再加 --bot-noise-seed 获得确定的渲染输出,并检查适配器信息、功能、限制、WebGL 与 WebGPU 的厂商一致性以及跨会话稳定性。只有应用不需要 WebGPU 时才选择 disabled。
本文目录
BotBrowser 文档说明可选 WebGPU 模式用于受控测试;它不能保证可用性、隐藏所有适配器信号或识别物理硬件。
观看视频
这段英文视频展示页面在任何着色器运行之前,能从 navigator.gpu.requestAdapter() 得知什么。本地实验页面声明三份适配器报告,其中一份没有适配器,并用同一个调用逐一读取。随后同一页面在 Windows 的官方 Google Chrome 155 中读取浏览器自身的报告,得到一个适配器和十八项特性;在 Ubuntu 的 Chrome 154 中,调用返回 null。该测试只运行了一次,原因未经测试,因此只说明报告可能不同,不代表任何其他系统。测试不涉及 BotBrowser 配置文件。音轨为英文。
简介
WebGPU 是 WebGL 的继任者,为渲染和计算工作负载提供现代、低级的 GPU 硬件访问。随着浏览器采用 WebGPU,它引入了新的指纹识别面,注重隐私的用户需要了解。该 API 暴露 GPU 适配器信息,包括供应商、架构、设备描述、特性集和详细的能力限制。这些信息比 WebGL 提供的更丰富、更结构化,使其成为关注浏览器指纹识别的人日益关注的问题。在受控环境中,BotBrowser 可以让 WebGPU 适配器信息、特性集和限制与已加载的配置文件保持一致;它无法让不受支持的 GPU 硬件或 WebGPU 表现得像另一台设备。
对于隐私研究人员、自动化工程师以及任何关注浏览器指纹识别的人来说,WebGPU 代表了设备身份泄漏的重要新来源。
隐私影响
WebGPU 是一个相对较新的 API(自 Chrome 113 版本起发布),但其指纹识别影响已经很显著。虽然 WebGPU 规范在设计时有一些隐私考虑,包括默认降低分辨率的适配器信息,但可用信号的组合仍然提供有意义的熵,可用于追踪。
对比时记录 Chrome 113、vendor、architecture 和 maxTextureDimension2D;这些是可观察字段,不是硬件身份。
WebGPU 暴露的 GPU 信息包括供应商、架构和设备字段。虽然这些故意比 WebGL 的原始渲染器字符串不那么详细,但它们仍然区分 GPU 系列。不同的 GPU 供应商、集成与独立 GPU 以及不同的架构都产生不同的值,缩小你的设备配置范围。关于适配器代表什么以及何时可能不可用,请参阅WebGPU 适配器信息与用户隐私,其中介绍了可用性边界和注重隐私的回退方案。
除了基本适配器信息外,WebGPU 还暴露了详细的能力限制集:最大纹理尺寸、最大缓冲区大小、最大计算工作组大小等数十项。这些限制在 GPU 供应商、架构和驱动版本间变化。这些限制值的组合创建了通常比适配器信息本身更细粒度的 GPU 能力指纹。
浏览器隐私团队的早期研究指出,WebGPU 的限制值可以区分同一供应商系列内的特定 GPU 代。来自同一制造商但不同产品线的两个 GPU 报告不同的限制,即使它们共享相同的供应商标识符。这种细粒度对隐私来说令人担忧,因为它将识别缩小到特定硬件型号。
日益增长的重要性
随着 WebGPU 采用率增加,特别是用于 AI 推理、高级可视化、游戏和创意应用,该 API 将成为现代浏览器中的标准。这意味着 WebGPU 指纹识别将变得更加普遍,WebGPU 的缺失本身可能成为区分信号。主动保护至关重要。
为什么这对你的隐私很重要
GPU 身份暴露
你的 GPU 是计算机中最独特的硬件之一。供应商、架构和能力限制的组合创建了一个难以更改且跨浏览会话持久的硬件指纹。WebGPU 使这些信息可以被任何网站直接查询,无需任何权限提示或用户通知。
跨 API 关联
一个关键的隐私问题是 WebGPU 和 WebGL 之间的关联。两个 API 访问相同的 GPU。如果一个 API 报告的 GPU 身份与另一个不匹配,或者两个 API 之间的能力配置不一致,不匹配本身成为强追踪信号。查询两个 API 的网站可以检测到不一致,这就是为什么任何保护方法必须同时处理两个 API。关于 WebGL 如何暴露同一 GPU 身份以及配置文件一致性在其中的含义,请参阅WebGL 指纹识别:控制 GPU 身份与渲染器,其中介绍了 WebGL 的信号族和常见保护方法。
特性集作为指纹
通过 WebGPU 可用的 GPU 特性集(如纹理压缩格式、深度剪裁、时间戳查询和着色器能力)在 GPU 型号和驱动版本间变化。支持特性的特定组合作为额外的指纹维度,补充适配器信息和能力限制。
渲染输出变化
与 WebGL 一样,WebGPU 渲染产生 GPU 特定的输出。计算着色器、渲染管线和纹理操作都在数值级别产生因 GPU 架构不同而变化的结果。虽然 WebGPU 的规范在精度方面比 WebGL 更严格,但实现差异仍然存在并可用于指纹识别。关于如何在软件渲染和硬件渲染之间确认这些渲染信号,请参阅不同渲染后端的浏览器隐私验证,其中介绍了用于验证 Canvas、WebGL 和 WebGPU 的渲染矩阵。
常见保护方法及其局限性
禁用 WebGPU 目前是最简单的保护。由于 WebGPU 相对较新,大多数 Web 内容不需要它。然而,随着采用率增加,禁用它将变得越来越不实际。WebGPU 的缺失也将随着 API 成为标准而成为区分信号,可能使你的浏览器更容易被识别而非更少。
阻止单个 API 方法只解决部分指纹。特性集和能力限制仍然可用并提供显著的熵。部分保护通常比没有保护更糟糕,因为它创建了不一致。
JavaScript 级别修改适配器信息改变了报告的供应商和架构,但不改变实际的能力限制或渲染行为。检查适配器信息和限制的网站可以立即检测到不一致。表面级方法创建新的检测信号而不是移除现有的。
标准化限制(为所有限制报告最低要求值)会减少指纹面但可能破坏依赖更高能力的 WebGPU 应用,降低用户体验。
有效的方法需要从单一一致的来源控制适配器信息、特性、限制和渲染行为。这正是 BotBrowser 提供的。
BotBrowser 的配置文件控制层方法
BotBrowser 通过与配置文件关联的启动选项暴露 WebGPU 行为。这些选项描述支持版本中页面可以观察到的内容;它们不会补上主机缺少的能力,也不保证应用接受该结果。
完整适配器信息控制
当加载配置文件时,适配器信息在所有字段上匹配配置文件的 GPU:供应商、架构、设备标识符和描述。这些值对应从实际设备捕获的真实 GPU 配置。没有可能表明身份已被修改的合成或通用值。
特性集控制
WebGPU 适配器报告的特性集精确匹配配置文件的 GPU。只有配置文件 GPU 支持的特性被列出,配置文件 GPU 支持的所有特性都存在。这确保特性集与适配器信息、能力限制和渲染行为一致。
能力限制控制
所有能力限制值从配置文件派生。最大纹理尺寸、缓冲区大小、计算工作组大小和所有其他限制匹配配置文件 GPU 的实际能力。这些不是默认最小值。它们对应配置文件中特定的 GPU 型号,反映真实世界的硬件特征。
WebGL-WebGPU 一致性
在 WebGL 和 WebGPU 使用兼容配置时,BotBrowser 旨在让 WebGPU 报告的 GPU 身份与 WebGL 保持一致。两个 API 应在该范围内指示相同的 GPU 供应商;请验证加载的配置文件结果。
渲染输出控制
与 --bot-noise-seed 结合时,WebGPU 渲染输出变得确定性且与配置文件设备一致。计算着色器结果和渲染管线输出反映配置文件 GPU 的数值行为,提供对基于渲染的指纹识别的保护。
配置和使用
基本 WebGPU 保护
加载配置文件时自动提供 WebGPU 保护:
chrome --bot-profile="path/to/profile.enc" \
--user-data-dir="$(mktemp -d)"
WebGPU 配置选项
BotBrowser 通过 --bot-webgpu 标志给你对 WebGPU 行为的显式控制:
# 使用配置文件的 WebGPU 设置(默认,推荐)
chrome --bot-profile="path/to/profile.enc" \
--bot-webgpu=profile
# 使用真实系统 GPU(当需要实际 GPU 性能时)
chrome --bot-profile="path/to/profile.enc" \
--bot-webgpu=real
# 完全禁用 WebGPU(移除指纹面)
chrome --bot-profile="path/to/profile.enc" \
--bot-webgpu=disabled
组合 WebGL 和 WebGPU 配置
为获得最强的指纹保护,同时配置两个 GPU API:
# 两个 API 都使用配置文件数据(推荐以保持一致性)
chrome --bot-profile="path/to/profile.enc" \
--bot-webgl=profile \
--bot-webgpu=profile \
--bot-noise-seed=42
这确保了两个 API 之间完整的 GPU 身份一致性,通过噪声种子实现确定性渲染输出。
Playwright 集成
const { chromium } = require('playwright');
const browser = await chromium.launch({
executablePath: 'path/to/botbrowser/chrome',
args: ['--bot-profile=path/to/profile.enc', '--bot-webgpu=profile', '--bot-noise-seed=42'],
});
const page = await browser.newPage();
await page.goto('https://example.com');
// 验证 WebGPU 身份匹配配置文件
const gpuInfo = await page.evaluate(async () => {
if (!navigator.gpu) return 'WebGPU not available';
const adapter = await navigator.gpu.requestAdapter();
if (!adapter) return 'No adapter';
const info = await adapter.requestAdapterInfo();
return {
vendor: info.vendor,
architecture: info.architecture,
device: info.device,
features: [...adapter.features],
maxTexture2D: adapter.limits.maxTextureDimension2D,
};
});
console.log('WebGPU identity:', gpuInfo);
Puppeteer 集成
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({
executablePath: 'path/to/botbrowser/chrome',
defaultViewport: null,
args: ['--bot-profile=path/to/profile.enc', '--bot-webgpu=profile'],
});
const page = await browser.newPage();
await page.goto('https://example.com');
验证
使用配置文件启动 BotBrowser 后,验证 WebGPU 保护:
适配器信息检查。 验证供应商、架构和设备匹配配置文件的目标 GPU。它们应反映配置文件的设备,而不是你的实际硬件。
特性集检查。 确认列出的特性匹配配置文件 GPU 的预期特性。
限制检查。 验证几个限制值并确认它们匹配配置文件 GPU 的能力。值应特定于配置文件中的 GPU 型号,而不是通用最小值。
WebGL-WebGPU 一致性。 比较 WebGL 报告的 GPU 供应商与 WebGPU 报告的。它们应指示相同的 GPU 系列,确保跨 API 一致性。
跨会话稳定性。 使用相同配置文件在多个会话中运行相同的 WebGPU 查询。所有值每次都应相同,表明你的 GPU 指纹是稳定且可复现的。
最佳实践
-
保持 WebGL 和 WebGPU 设置一致。 两个 API 都暴露 GPU 身份。同时使用
--bot-webgl=profile和--bot-webgpu=profile以确保跨 API 一致性。两个 API 之间不匹配的 GPU 身份是强追踪信号。 -
使用包含 WebGPU 数据的配置文件。 并非所有配置文件都包含 WebGPU 信息(较旧的配置文件可能早于 WebGPU)。使用包含 WebGPU 适配器数据的最新配置文件以确保完整保护。
-
如果不需要可以考虑禁用 WebGPU。 如果你的用例不需要 WebGPU,
--bot-webgpu=disabled完全移除指纹面。在 WebGPU 采用率仍在增长时这是有效的选择,但随着 API 成为标准可能变得不太可行。 -
与
--bot-noise-seed结合以控制渲染输出。 适配器信息和限制从配置文件确定性提供。渲染输出也需要噪声种子以实现确定性。两者一起使用提供最全面的 GPU 指纹保护。
常见问题
Q: WebGPU 在所有浏览器中都可用吗? A: 截至 2026 年初,WebGPU 在 Chrome/Edge(自 113 版本起)、Firefox(在某些版本中需要标志)和 Safari(部分支持)中可用。可用性因平台而异。BotBrowser 配置文件根据配置文件的设备指定 WebGPU 是否应该可用,给你真实世界浏览器配置的准确表示。
Q: WebGPU 指纹识别与 WebGL 指纹识别比较如何? A: WebGPU 提供更结构化的适配器信息和更详细的能力限制,而 WebGL 提供原始渲染器字符串和基于渲染的指纹。两个 API 对全面的 GPU 指纹保护都很重要。BotBrowser 通过其配置文件系统保护两者。
Q: 我可以使用 BotBrowser 进行 WebGPU 计算工作负载吗? A: 可以。BotBrowser 的 WebGPU 控制在身份和能力报告级别操作。实际计算执行使用你的真实 GPU 硬件以获得性能。你的工作负载获得完整的 GPU 性能,同时保持受保护的指纹身份。
Q: 如果我的配置文件不包含 WebGPU 数据会怎样?
A: 如果配置文件不包含 WebGPU 数据且 --bot-webgpu=profile 已设置,WebGPU 可能不可用(匹配不支持 WebGPU 的设备)。如果需要 WebGPU 访问,使用包含 WebGPU 数据的较新配置文件。
Q: 禁用 WebGPU 会影响 WebGL 吗?
A: 不会。WebGL 和 WebGPU 是独立的 API。禁用 WebGPU 不影响 WebGL 功能。每个都由自己的 --bot-* 标志控制。
Q: WebGPU 计算着色器结果是否受噪声种子影响?
A: 设置 --bot-noise-seed 时,可能用于指纹识别的渲染和计算输出包含确定性变化。不涉及指纹敏感面的正常计算工作负载不受影响。
总结
WebGPU 通过适配器信息、特性集、能力限制和渲染输出引入了详细的 GPU 观察面。--bot-webgpu 在支持的版本中选择文档化的配置文件、真实或禁用行为。把返回值与 WebGL 和应用工作负载对比,并把结果视为有界的兼容性与隐私观测,而不是物理硬件身份或普遍一致性的证明。
相关主题请参阅什么是浏览器指纹识别、WebGL 指纹保护、Canvas 指纹识别和确定性浏览器行为。
相对参考文档新增的内容
参考页列出可选 WebGPU 模式。本节增加矩阵,在配置文件、真实和禁用模式下对比适配器可用性、特性名称和限制,再单独核对 WebGL。配置文件报告不等于主机 GPU 执行了相同工作负载。
矩阵每行固定 mode、adapter、featureCount 和 firstChangedField,便于复核版本差异。
要获得可复现运行,请保存模式、配置文件标识、构建版本、适配器查询结果、特性名称以及页面实际收到的限制。主机不变时将同一 fixture 运行两次,再只改变模式重复运行。禁用模式返回空适配器是预期结果;配置文件或真实模式返回空适配器时,应先检查主机和权限,再把它解释为隐私结果。
图形应用失败时,先判断它是否必须使用 WebGPU,还是可以回退到 WebGL。然后把记录的适配器、特性和限制与应用错误及主机日志对比。这样能把兼容性决定与物理 GPU 或站点评级的结论分开。
最小报告按模式各保留一行,使用相同来源和查询选项。记录适配器 promise 是否完成、适配器类别、特性数量和工作负载相关限制。如果数值变化,保留两行并标出第一个不同字段。
交接发现时,附上页面来源、查询选项、配置文件标识、版本、主机类别和发生变化的确切行。再保留一次主机不变的运行作为对照;这样观测能支持兼容性决定,而不会被写成关于个人或物理设备的结论。
实用结论
先判断工作负载是否需要 WebGPU,还是可以回退到 WebGL,再选择 profile、real 或 disabled 模式,并保持 WebGL 与 WebGPU 设置一致。每种模式记录一行:适配器结果、功能名称和限制,并在未改变的宿主上重跑作对照。数值变化时,报告第一个变化的字段,以区分可用性、声明的能力和渲染行为。
来源
本文属于指南: 什么是浏览器指纹?原理、风险、信号与隐私边界