PowerScan

PowerScan Blog

WebGL renderer strings and hardware signals: how much your GPU says about you

· 6 min read

The hardware a browser runs on leaks into the page in several small ways. None of them names the machine, but together they describe it closely enough to tell it apart from most others.

The renderer string

WebGL exposes an extension called WEBGL_debug_renderer_info with two values: the unmasked vendor and the unmasked renderer. On Windows with Chromium the renderer typically reads something like ANGLE (NVIDIA, NVIDIA GeForce RTX 2060 SUPER (0x00001F06) Direct3D11 vs_5_0 ps_5_0, D3D11). That one line gives the GPU vendor, the exact model, its PCI device id, the graphics API, and the shader model, which is also a strong hint about the operating system, because that string only exists on Windows.

Firefox and Safari have at various times masked or generalised this string; Chromium exposes it. A browser that masks it returns a generic value, and a diagnostic shows "renderer info masked" rather than guessing.

Counts and sizes

navigator.hardwareConcurrency returns the number of logical CPU threads. navigator.deviceMemory returns an approximate amount of RAM, rounded to a small set of values and capped at 8 in Chromium, so a machine with 32 GB reports 8. screen.width and screen.height give the display size, availWidth and availHeight subtract the taskbar, and devicePixelRatio reveals scaling. screen.colorDepth is almost always 24. navigator.maxTouchPoints separates touch devices from the rest.

Some of these have unusually high identifying power for how innocent they look. Thread count has only a handful of common values, but it is one of the fields a well-known commercial fingerprinting service weights heavily, precisely because it is cheap and stable. Screen size combined with pixel ratio and available height narrows a machine down more than a user agent does.

Media devices

navigator.mediaDevices.enumerateDevices() returns the cameras, microphones and speakers the system has. Without permission, modern browsers return the kinds and counts but empty labels, so a page learns "one camera, one microphone, one output" and nothing more. Granting access to any site reveals the labels. A diagnostic that shows counts only is behaving as a page without permission would.

The consistency angle again

Hardware signals are where spoofing goes wrong most often. A profile claiming a MacBook with an NVIDIA Direct3D renderer, 24 threads and a 1366×768 screen is describing a machine that does not exist. Sites do not need a database to notice that; a few rules catch it. If a profile changes any of these values, it has to change all of them to a combination that a real device actually ships with, and keep them that way across visits.

What to check

Read the renderer string and ask whether it matches the operating system in the user agent. Read the screen size and ask whether it matches the pixel ratio and the available height. Read the thread count and memory and ask whether the pair is plausible for that GPU. A diagnostic lays these out next to each other for exactly this purpose; the judgement is yours.

All articles · Run the scan