Skip to content
All fingerprint checks
Render & GPU

readPixels writes only the pixels it was asked to read

Pim· Clearcote Research 2 min readCheck id webgl-readpixels-sentinel

Every destination byte for a pixel outside the framebuffer keeps the value the page wrote there, and the pixels inside read back the cleared colour. N/A on Brave (severity: warn).

What a detector infers

readPixels writes into an array the page supplies, and the WebGL specification is precise about the edges: when the requested rectangle extends beyond the framebuffer, the destination bytes for the pixels outside it are left untouched. The probe fills a destination array with a sentinel value, then asks for a 16×16 block starting at (-4, -4) from an 8×8 framebuffer, so most of the requested area lies outside it.

A faithful implementation writes the 64 real pixels — each exactly the colour the framebuffer was cleared to — and leaves every sentinel byte beyond them alone. A noise pass that walks the whole destination array, the simplest way to perturb readPixels, overwrites bytes the browser never wrote. Measured on every stock browser tested: no sentinel byte changed. Only that side is measured: none of the spoofs tested here hooks readPixels, so no failing arm exists yet.

It is scored at warn anyway, because the expected answer is fixed by the specification rather than estimated from a population, and no ordinary configuration is known to change it. Brave perturbs WebGL readback as a stock privacy feature and is N/A.

How to resolve it

Leave readPixels to the implementation. Anything that post-processes the whole output array writes bytes the specification says stay untouched.

Spec invariants as lie detectors

Nearby checks in Render & GPU

See all 64 checks in Render & GPU
Who builds this test

Clearcote is a browser built for fingerprint coherence

It is a Chromium fork, maintained by the same people who wrote this reference. It ships as a compiled browser rather than as a stealth script injected into someone else's — which is a description of how it is built, and is not an argument about how it behaves on this check.

This audit takes no position on how Clearcote scores on Render & GPU checks, on this one, or anywhere else. It has no baseline corpus of other people's fingerprints to rank you against and no vendor scoreboard — nearly every check is self-referential, asking one browser the same question through two independent APIs and reporting whether both answers can be true at once. It runs identically on any browser, including ours. Run it on yours and read the result yourself.

See the other checks in Render & GPU — the family webgl-readpixels-sentinel belongs to.