PowerScan
ZH

WebGL 渲染器字符串与硬件信号:你的 GPU 泄露了多少信息

浏览器指纹 · 阅读约 6 分钟 · 作者:PowerScan

图片:Unsplash

浏览器所运行的硬件,会以几种细小的方式泄露到页面中。它们没有一个会点出机器的名字,但合起来足以把这台机器描述得相当精确,从而与大多数其他机器区分开。

渲染器字符串

WebGL 提供一个名为 WEBGL_debug_renderer_info 的扩展,包含两个值:未屏蔽的厂商和未屏蔽的渲染器。在 Windows 上的 Chromium 中,渲染器通常形如 ANGLE (NVIDIA, NVIDIA GeForce RTX 2060 SUPER (0x00001F06) Direct3D11 vs_5_0 ps_5_0, D3D11)。仅这一行就给出了 GPU 厂商、确切型号、PCI 设备 ID、图形 API 和着色器模型,而且它也强烈暗示了操作系统,因为这种字符串只存在于 Windows 上。

Firefox 和 Safari 在不同时期曾屏蔽或泛化这个字符串;Chromium 则直接暴露。屏蔽它的浏览器会返回一个通用值,此时检测页面会显示“渲染器信息已屏蔽”,而不是去猜。

数量与尺寸

navigator.hardwareConcurrency 返回逻辑 CPU 线程数。navigator.deviceMemory 返回大致的内存容量,取整到一小组数值,在 Chromium 中上限为 8,所以 32 GB 的机器也只会报告 8。screen.width 和 screen.height 给出显示器尺寸,availWidth 和 availHeight 扣除了任务栏,devicePixelRatio 则揭示缩放比例。screen.colorDepth 几乎总是 24。navigator.maxTouchPoints 把触控设备与其他设备区分开。

其中一些信号的识别力,高得与它们看上去的无害程度不相称。线程数只有少数几个常见值,但它是一家知名商业指纹识别服务重点加权的字段之一,原因正是它廉价而稳定。屏幕尺寸结合像素比和可用高度,比 User-Agent 更能缩小机器的范围。

媒体设备

navigator.mediaDevices.enumerateDevices() 返回系统拥有的摄像头、麦克风和扬声器。在没有权限的情况下,现代浏览器只返回设备的类型和数量,标签为空,所以页面只知道“一个摄像头、一个麦克风、一个输出设备”,别无其他。只要对任何一个网站授予过访问权限,标签就会暴露。只显示数量的检测页面,其行为就像一个没有权限的页面一样。

再谈一致性

硬件信号是伪装最容易出错的地方。一个声称是 MacBook、却带有 NVIDIA Direct3D 渲染器、24 个线程和 1366×768 屏幕的配置文件,描述的是一台不存在的机器。网站无需数据库就能发现这一点,几条规则就足以抓出来。如果配置文件改动了其中任何一个值,就必须把它们全部改成真实设备确实会出货的组合,并在多次访问之间保持不变。

该检查什么

读取渲染器字符串,问问它是否与 User-Agent 中的操作系统相符。读取屏幕尺寸,问问它是否与像素比和可用高度相符。读取线程数和内存,问问这一对数值对该 GPU 来说是否合理。检测页面把这些并排摆出,正是为了这个目的;判断由你来下。

全部文章 · 开始扫描