WebGPU 无需任何调试扩展就能暴露适配器厂商、架构与设备字符串。了解它如何形成新的指纹采集面及现有防护手段。
WebGPU 是 WebGL 的现代继任者——一套更低层、更低开销的 API,让网页能够直接访问 GPU 的计算与渲染管线。自 Chrome 113 和 Edge 113 于 2023 年 5 月将其作为稳定版发布以来,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— 包含 30 余个数值能力值的GPUSupportedLimits对象:最大纹理尺寸、最大缓冲区大小、最大计算工作组数量、最大绑定组数量等。这些数值反映了物理 GPU 和驱动,在不同硬件家族之间差异显著,增加了可观的信息熵。features— 列举 GPU 和驱动支持的可选能力的GPUSupportedFeatures集合,如float32-filterable、timestamp-query、shader-f16等。精确的功能集取决于 GPU 系列和驱动版本。isFallbackAdapter— 一个布尔标志,当浏览器回退到软件渲染器时为true。软件渲染器是无头或虚拟化环境的强烈信号,与 WebGL 中的llvmpipe渲染器字符串类似。
这些属性共同产生了比大多数 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;
// 数值能力 Limits(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,
};
}
你可以使用 BrowserInsight 的指纹检测工具实时查看自己浏览器的 WebGPU 适配器值。
计算着色器输出哈希
最强大的 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 ID。
WebGPU 与 WebGL 作为指纹采集面的对比
WebGPU 和 WebGL 在最终揭示内容——你的 GPU——上有所重叠,但在追踪者需要付出多少努力以及结果的健壮性上有所不同。
| 属性 | WebGL | WebGPU |
|---|---|---|
| 身份字符串 | 通过 WEBGL_debug_renderer_info 扩展 | 默认内置于 GPUAdapter.info |
| 扩展弃用风险 | 部分浏览器标记为待移除 | 不适用——info 是核心 API |
| 数值 Limits | ~15 个能力值 | 30 余个结构化 Limits |
| 可选功能集 | 因驱动而异 | 显式的 features 集合 |
| 计算哈希 | 通过渲染场景的 readPixels() | 通过计算着色器的 readBuffer() |
| 软件渲染器信号 | llvmpipe 或 SwiftShader 渲染器字符串 | isFallbackAdapter: true |
追踪者的关键优势在于 WebGPU 是一个更简洁的 API:元数据是结构化的而非嵌入在自由格式字符串中,Limits 更多且定义更精确,输出哈希的计算路径是专为计算而构建的,而非借用渲染管线。关于 WebGL 的深入分析,请参阅我们的 WebGL 指纹深度解析。两者共同构成了浏览器指纹完整指南中描述的整体指纹图景。
新兴威胁格局
WebGPU 规范是 W3C 标准,其隐私影响已在相关工作组中讨论——但该规范将实现高性能图形和计算置于最小化硬件暴露之上。追踪者对 WebGPU 的意识正在增长:它在 Dolphin Anty 等专业反检测浏览器中作为可切换选项出现,恰恰证明活跃的指纹采集者已经在使用它。
与此同时,大多数为 WebGL 信号添加噪声的浏览器扩展和消费者隐私工具尚未更新以覆盖 WebGPU。这一滞后使得 WebGPU 指纹对当今大多数用户而言实际上是一个全新的采集面。
防护措施及其权衡
Brave:将 Farbling 扩展至 WebGPU
Brave 已将其 Farbling 系统扩展至 WebGPU,对适配器信息字符串和计算输出添加每源站、每会话的随机化。管理 WebGL Farbling 的相同模型在此适用:会话内的噪声是确定性的(避免页面损坏),但在不同源站和会话之间有所差异(难以构建跨站 ID)。这是目前日常浏览中最实用的消费级防护。
Tor Browser
Tor Browser 限制 WebGPU 访问,将其视为高风险指纹采集面。目标与 WebGL 相同:追求统一性而非伪装——每个 Tor 用户呈现相同的(缺失的)表面,理论上更强,但可能破坏 GPU 加速的 Web 应用。
在 Firefox 中禁用 WebGPU
Firefox 通过标志(about:config 中的 dom.webgpu.enabled)支持 WebGPU。完全禁用可消除该采集面,但与禁用 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 还提供更多能力 Limits、更简洁的功能集枚举,以及用于基于行为哈希的计算导向输出路径。
禁用 JavaScript 能阻止 WebGPU 指纹吗?
能,WebGPU 是 JavaScript API,禁用 JavaScript 会消除该采集面。然而,禁用 JavaScript 也会破坏绝大多数现代 Web 应用,对大多数用户而言并不实用。


