Skip to content
All fingerprint checksAutomation surface

no non-standard shadow-root escape hatch exists on Element.prototype

Check id shadow-escape-hatch-absent

What an ordinary browser yields

None of the known escape-hatch properties exists on Element.prototype. A stock browser answers false to every one of them.

What a detector infers

Closed shadow roots exist to be unreachable: element.shadowRoot returns null for them, and that is the whole contract. Automation frequently needs to reach inside one anyway — to click a control a site built as a closed component — and the cheapest way to get there is to patch the engine and add a property that hands the root over. That property then exists on Element.prototype for every page the build ever loads. It is the single cheapest tell in this entire audit: a detector does not have to measure a value, compare two realms, or know anything about the host. It reads one name off a prototype, and no shipping browser has that name. The asymmetry is what makes it worth its own row — a build can get canvas, WebGL, fonts and timing all perfectly coherent and still be identified in one `in` test because a debugging affordance was left switched on in production. The names probed here are the ones patched builds actually use, and the check is deliberately limited to Blink: Gecko exposes openOrClosedShadowRoot to extension content scripts as a documented API, so asserting it everywhere would convict Firefox for a feature it is supposed to have.

How to resolve it

Put the escape hatch behind a runtime-enabled feature that stays off unless an automation session explicitly asks for it, so ordinary page script never sees the property. An always-on named property is a permanent, zero-effort identifier for every user of that build — and unlike a fingerprint value it cannot be blamed on the host, because only the build could have added it.

How automation gets caught, layer by layer

Read in the wild by

CloakBrowser issues

A stealth-browser tracker documents exactly this affordance — a native property added to reach closed shadow roots — and the discussion of gating it behind a launch flag rather than exposing it unconditionally.

CloakHQ/CloakBrowser #137 (closed shadow root access / FakeShadowRoot)

CloakHQ/CloakBrowser#137

Every attribution traces to a published artifact. See the sources and their limits.

Nearby checks in Automation surface

See all 44 checks in Automation surface
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 Automation surface 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 Automation surface — the family shadow-escape-hatch-absent belongs to.