Skip to content
All fingerprint checks
Native function integrity

Natives a spoof rewrites refuse a prototype cycle, as real functions do

Pim· Clearcote Research 2 min readCheck id native-proxy-cycle-throws

Every probed native throws TypeError when given a prototype cycle (severity: warn).

What a detector infers

A common way to rewrite a browser value from script is to wrap the native function or getter that returns it in a Proxy. The Proxy forwards toString to the original, so the usual check (does the function still print as native code?) passes. But a Proxy changes one behaviour that toString does not cover.

JavaScript refuses to give an object a prototype chain that loops back to itself: Object.setPrototypeOf(fn, Object.create(fn)) throws a TypeError ('Cyclic __proto__ value') for every real function. The specification's loop check stops when it reaches a Proxy, so the same call on a Proxy-wrapped native succeeds.

The audit makes that call on up to 27 natives and getters that fingerprint spoofs rewrite (Function.prototype.toString, the navigator and screen getters, canvas, WebGL, audio, time zone, permissions and layout methods) and puts each prototype back straight away. Measured on 2 November 2026 on Windows: genuine Chrome 156 and Clearcote throw on every one. Privacy extensions that wrap natives with a Proxy are caught as well, which is accurate: the wrapper is visible to any page.

How to resolve it

Change values below JavaScript. A Proxy around a native passes toString checks but lets a prototype cycle through, which no real function does; the only way to be identical to a real function is to be one.

Timing native functions

Nearby checks in Native function integrity

See all 17 checks in Native function integrity
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 Native function integrity 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 Native function integrity — the family native-proxy-cycle-throws belongs to.