什么是WebGL指纹?GPU如何识别你
浏览器与设备

什么是WebGL指纹?GPU如何识别你

WebGL指纹读取你的GPU型号和渲染器字符串,无需权限即可跨浏览器、跨网站持久追踪你的设备。

8 分钟阅读·

WebGL指纹识别使用你浏览器的3D图形API读取你的GPU供应商、型号和驱动级渲染输出—— 生成一个在同一台机器上跨所有浏览器持续存在、完全不受清除Cookie或切换网络影响的设备标识符。 你现在就可以在 whatsmy.fyi 上检查你的浏览器暴露了什么信息。

简介

WebGL指纹识别利用WebGL API——同一个用于渲染基于浏览器的游戏和3D地图的API—— 来提取你的GPU供应商字符串、GPU型号名称和像素级渲染输出。 每种GPU型号对相同的渲染命令会产生细微不同的结果, 这是由于浮点数舍入、驱动行为和硬件架构的差异。 与其他信号结合,WebGL数据可以唯一识别99.24%的桌面浏览器。 不需要在你的设备上存储任何内容,没有可删除的东西,VPN也无法阻止它。

什么是WebGL指纹识别?

WebGL指纹识别是一种浏览器追踪技术,它滥用 WebGL API——一个用于渲染硬件加速2D和3D图形的JavaScript接口——来读取设备特定的GPU特征。 与Cookie追踪不同,它不需要存储,不受私人浏览模式或清除浏览器数据的影响。

该技术有两个互补的组成部分。 第一个直接从浏览器API读取静态硬件元数据:你的GPU供应商名称、GPU型号, 以及你的驱动程序支持的完整WebGL扩展列表。 第二个组件渲染一个隐藏的3D场景并读回像素数据—— 这个过程在每种硬件和驱动程序组合上会产生细微不同的结果。

WebGL指纹识别与 Canvas指纹识别密切相关,但针对的是你系统中不同的——且更具识别性的——层次。 Canvas指纹识别捕获2D字体渲染差异;WebGL指纹识别则直接深入你的GPU硬件。 两者合计是指纹识别工具包中熵值最高的信号之一。

WebGL指纹识别是如何工作的?

WebGL指纹由三个阶段组装而成,每个阶段只需几毫秒,对用户完全不可见。

阶段一——读取硬件参数

脚本用数十个常量调用gl.getParameter()来提取硬件能力。 大多数值本身是无害的——最大纹理尺寸、最大视口尺寸、支持的GLSL着色器精度。 但有一个WebGL扩展改变了一切。

WEBGL_debug_renderer_info 扩展公开了两个为调试设计的常量:UNMASKED_VENDOR_WEBGLUNMASKED_RENDERER_WEBGL。 查询时,它们返回确切的、未屏蔽的GPU供应商字符串——例如"NVIDIA Corporation"—— 和完整的GPU渲染器字符串——例如"NVIDIA GeForce RTX 4080/PCIe/SSE2"。 据Inria和KU Leuven的研究,仅这些字符串就可以将访客群体缩小到不足100人。

阶段二——渲染3D场景

脚本创建一个隐藏的WebGL canvas并渲染一个复杂场景:渐变、光照计算和具有特定纹理坐标的透明几何体。 由于浮点算术在每个GPU的着色器单元中处理方式不同——NVIDIA、AMD、Intel和Apple Silicon都实现了略有不同的舍入行为—— 即使是相同的GLSL着色器代码,产生的像素在二进制级别上也会因硬件而异。

阶段三——通过readPixels()获取像素哈希

脚本调用gl.readPixels()从渲染场景中提取原始RGBA像素缓冲区, 并将其哈希——通常使用MurmurHash——生成一个紧凑的指纹值。 这个哈希在浏览器会话、隐身模式和重启之间保持稳定。 只有在更新GPU驱动或更换物理硬件时才会改变。

// 阶段一 — 通过调试扩展读取未屏蔽的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"
}

// 阶段二 — 收集硬件能力参数
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,
};

// 阶段三 — 渲染场景并提取像素
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指纹有多独特?

WebGL是浏览器指纹识别中熵值最高的单个信号之一。 GPU参数层单独就产生10–15比特的熵——足以将你的硬件品牌和型号识别到一个小群体内。 渲染哈希进一步区分了具有相同GPU型号但驱动程序版本不同的设备。

研究发现数值来源
GPU供应商+渲染器字符串的熵值10–15比特Cao等人,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测试

谁在真实世界中使用WebGL指纹识别?

广告网络

广告技术公司使用WebGL指纹识别跨网站追踪用户,用于行为定向和频次控制—— 这与第三方Cookie之前服务的目标相同。 随着Safari默认屏蔽第三方Cookie,Chrome也向弃用方向迈进, 硬件级指纹识别成为Cookie替代方案的有吸引力选择,因为它不需要存储,也不需要用户交互。

欺诈检测和机器人缓解

安全平台将WebGL数据用作机器人检测信号。 运行无头Chrome或Puppeteer的自动化浏览器通常报告与其声称的用户代理不一致的GPU渲染器字符串—— 例如,声称是"Windows上的Chrome",但配对的是仅软件的Mesa渲染器字符串。 GPU硬件声明与可用WebGL扩展之间的不匹配是自动化或虚拟机环境的强烈指标。

跨浏览器追踪

由于WebGL渲染器字符串和像素哈希来源于物理硬件而非浏览器状态, 它们在同一台机器上安装的不同浏览器之间保持一致。 在Chrome、Firefox和Edge之间切换以规避追踪的用户, 在每个浏览器中都会产生相同的GPU渲染器字符串—— 这实现了基于Cookie的系统无法实现的跨浏览器链接。

如何保护自己免受WebGL指纹识别

有效的保护需要屏蔽WebGL API、随机化其输出,或在大量用户群体中标准化它。 选项按从最强到日常使用最实用的顺序排列。

  • Tor浏览器(最强保护):Tor浏览器完全禁用gl.readPixels()函数, 并通过webgl.min_capability_mode将WebGL限制为最小能力模式, 使基于渲染的指纹识别成为不可能。WEBGL_debug_renderer_info扩展被屏蔽,因此无法读取未屏蔽的GPU字符串。 代价是通过Tor网络浏览速度变慢。
  • Brave浏览器(推荐日常使用):Brave将其 Farbling 技术应用于WebGL:每次会话、每个网站的噪声被注入Canvas和WebGL像素输出, 使渲染哈希在每次网站访问时都不同。WebGL API默认也在第三方上下文中被屏蔽。 你的GPU渲染器字符串仍然可读,但渲染哈希作为稳定标识符变得不可靠。
  • 启用privacy.resistFingerprinting的Firefox:about:config中将此标志设置为true, 完全禁用WEBGL_debug_renderer_info扩展,以通用值替代你真实的GPU字符串。 WebGL渲染输出也被标准化。这是主流浏览器中最接近Tor级别保护的方案,无需速度损失。
  • Apple设备上的Safari:Safari报告通用的"Apple GPU"字符串, 而不是具体的芯片型号(M1、M2、M3),并随机化Canvas输出。 这向脚本隐藏了硬件代次,但不能防护基于渲染的像素哈希。
  • VPN无能为力:VPN通过加密隧道路由你的流量并隐藏你的IP地址, 但对WebGL输出没有任何影响。你的GPU供应商字符串、渲染器字符串和像素哈希在浏览器内部生成, 作为JavaScript数据传输到追踪服务器——而非网络元数据。 在 whatsmy.fyi 上验证你的VPN是否工作(IP级别),但要知道它无法解决指纹识别问题。

常见问题

WebGL指纹识别实际上揭示了我的硬件哪些信息?

至少:你的GPU制造商(NVIDIA、AMD、Intel、Apple、Qualcomm)、GPU型号名称, 有时还有你的驱动版本——所有这些都通过WEBGL_debug_renderer_info扩展以纯文本形式暴露。 此外,渲染哈希编码了你GPU的浮点行为,这与硬件代次和驱动版本的组合相关。 这些信号加在一起可以将你缩小到典型网站访客的不到0.01%的群体中。

WebGL指纹识别在隐身或私人模式下有效吗?

是的。私人浏览可以防止你的浏览器将Cookie、历史记录和表单数据保存到磁盘—— 但它不会改变你的GPU硬件或驱动。WEBGL_debug_renderer_info扩展在隐身窗口和普通窗口中返回相同的字符串。 只有具有主动指纹保护的浏览器——Brave、启用privacy.resistFingerprinting的Firefox,或Tor浏览器——才会表现不同。

WebGL指纹识别比Canvas指纹识别更强大吗?

它们针对设备唯一性的不同维度。 Canvas指纹识别捕获操作系统文本引擎(ClearType、Core Text、FreeType)之间的2D字体渲染差异。 WebGL指纹识别直接暴露GPU供应商和型号元数据,并捕获3D着色器级浮点差异。 WebGL通常每个信号产生更高的熵,因为GPU硬件比字体渲染栈更多样化。 大多数商业指纹识别平台同时部署两者。 查看 Canvas指纹识别指南 进行对比。

WebGL指纹识别能跨同一台电脑上的不同浏览器追踪我吗?

是的——这是它最重要的能力之一。由于GPU供应商和渲染器字符串来源于硬件, 无论你在同一台机器上使用Chrome、Firefox、Edge还是任何其他浏览器,它们都是相同的。 2017年NDSS发表的研究专门演示了使用GPU级WebGL特征的跨浏览器指纹识别, 在没有任何共享Cookie或存储的情况下跨浏览器链接浏览会话。

相关文章

即时查询您的 IP 地址、位置与隐私评分。

零日志。零追踪。零外部 API。

立即检测 →

相关文章

什么是WebGL指纹?GPU如何识别你 | whatsmy.fyi