UA-CH brand version matches the UA Chrome version
Check id uach-ua-version
What an ordinary browser yields
The Chrome major in the UA string equals the version on the Chrome/Chromium brand entry in navigator.userAgentData.brands.
What a detector infers
The check extracts the major from Chrome/(\d+) in the UA string, finds the Chrome or Chromium entry in navigator.userAgentData.brands, and requires the brand's version to equal that major. Both fields come from the same version constant in a real build, so a disagreement identifies a hand-edited field directly. It matters more than a cosmetic mismatch: the claimed Chrome major also predicts the TLS ClientHello shape and the HTTP/2 SETTINGS the binary actually emits, so lying about it in JS desynchronises the JS layer from network-layer evidence the page cannot rewrite — a detector cross-referencing them gets a contradiction with no innocent explanation. The check is N/A-safe: if the UA carries no Chrome token, or the brand list has no Chrome/Chromium entry, it passes rather than guessing.
How to resolve it
Do not spoof brand_version to a different major than the binary actually is. If you need a different reported version, run a build that genuinely is that version so the UA, UA-CH, and handshake agree. Presets such as light_stealth leave the brand version real for this reason.
Read in the wild by
PerimeterX / HUMAN
Requests "brands" and "uaFullVersion" from navigator.userAgentData.getHighEntropyValues, and ships the brand list with its per-brand major version, the uaFullVersion string, and navigator.userAgent as separate fields of one payload.
stample/ifood/source/main.min.js: `navigator.userAgentData.getHighEntropyValues([...,"brands","mobile","model",...,"platformVersion","uaFullVersion"]).then((function(t){pj=t` then `t[0][hQ(872)]=pj.brands`, `t[0]["R3cyPQIXMQw="]=pj.uaFullVersion`, `t[0]["RBBxWgJydmw="]=hU[hQ(845)]` (hU=navigator; hQ_map.json 845="userAgent", 872="WGRtbh0Eb1Q="), `t[0]["Q3M2OQYTMAM="]=!!hU.userAgentData`. decoded_payload_2.json: "WGRtbh0Eb1Q=": [{"brand":"Chromium","version":"148"},{"brand":"Google Chrome","version":"148"},{"brand":"Not/A)Brand","version":"99"}], "R3cyPQIXMQw=": "148.0.7778.168", "RBBxWgJydmw=": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36", "Q3M2OQYTMAM=": true
Every attribution traces to a published artifact. See the sources and their limits.
Nearby checks in Navigator identity
- navigator.platform ↔ UA ↔ UA-CH platform agree
platform-coherenceThree independent surfaces each name an operating system, and this check normalises all three to one family (win / ios / mac / lin) and… - UA-CH high-entropy hints cohere with the UA
uach-highentropyThis awaits navigator.userAgentData.getHighEntropyValues and compares the richer hints against the UA string on three axes, collecting every… - every brand in a UA-CH list uses the same version format
uach-brand-version-arityUA-CH publishes the same brand set twice at two precisions. navigator.userAgentData.brands carries bare majors like "148", and the… - navigator.language === languages[0]
languages-coherenceIn a real browser navigator.language is defined as the first element of navigator.languages — one preference list, two views onto it. - the host voice roster represents the language the browser claims
locale-vs-voice-coherenceThe voice roster is installed at the operating-system level and the language preference is set in the browser, so the two are genuinely… - eval.toString().length matches the engine (V8 = 33)
etslThe string a JS engine returns for a native function's source is an implementation detail, and its length differs per engine… - navigator.productSub === 20030107 (Chromium)
product-subnavigator.productSub is a frozen legacy constant, not a live value: Chrome, Safari and Opera return "20030107" while Firefox returns… - a Firefox user-agent reports the Gecko productSub constant 20100101
gecko-productsub-hardcodenavigator.productSub is a constant compiled into the engine, and the two families disagree: every Gecko build hardcodes it to "20100101"…
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 Navigator identity 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 Navigator identity — the family uach-ua-version belongs to.