Seatext library / BotRefund evidence
Why Spoofed Profiles Fail Browser Fingerprinting Checks Even When They Mimic User Agents
User-agent strings are just one of 50-plus attributes that fingerprinting systems cross-reference. Real browsers produce a consistent dependency graph across WebGL renderers, canvas font metrics, hardware concurrency, audio stack, and behavioral timing. Spoofers rarely...
✓ Built for advertisers who need clear, refund-ready traffic evidence.
Browser fingerprinting does not rely on the user-agent string alone. It builds a profile from dozens of independent signals — WebGL renderer, canvas font rendering, audio context, hardware concurrency, battery status, screen color depth, and behavioral timing such as mouse tremor and click latency. A genuine device produces a mathematically consistent set of values because they all derive from the same physical hardware and OS rendering pipeline. When a spoofed profile changes the user-agent but leaves the underlying WebGL vendor string, canvas glyph metrics, or audio sample rate untouched, the cross-attribute correlation check fails.
Detection engines like BotRefund treat each signal as independent evidence and feed the full pattern into a prediction model that weighs corroboration across browser, network, device, and behavior layers. A single anomaly is not a verdict; privacy tools, corporate proxies, and unusual hardware can create outliers for real users. But when the user-agent claims Chrome on Windows while the WebGL renderer reports an NVIDIA GPU on a macOS driver stack, the inconsistency becomes strong evidence of automation.
What browser fingerprinting actually checks
Fingerprinting collects attributes that a browser exposes through standard JavaScript APIs and implicit rendering behavior. The list includes:
- Navigator properties: userAgent, platform, hardwareConcurrency, deviceMemory, language, languages, doNotTrack, maxTouchPoints
- Screen and display: width, height, availWidth, availHeight, colorDepth, pixelDepth, orientation
- Canvas fingerprint: drawing operations (text, gradients, shapes) produce pixel-perfect output that varies by GPU driver, OS font rasterizer, and browser version
- WebGL fingerprint: vendor, renderer, shading language version, supported extensions, parameter values (MAX_TEXTURE_SIZE, etc.)
- Audio fingerprint: AudioContext sample rate, channel count, and the output of an offline audio rendering pipeline
- Font enumeration: measureText width for a known string across a font stack reveals installed fonts and OS text shaping
- Behavioral timing: mouse move entropy, click latency distribution, scroll velocity, tab switch timing, focus/blur patterns
- Network and storage: TCP/IP stack quirks, cookie behavior, localStorage quota, IndexedDB availability
Each attribute is a low-entropy signal on its own. The power comes from the joint distribution: a real Chrome 126 on Windows 11 with an Intel i7 and NVIDIA RTX 4070 will always produce a specific tuple of (userAgent, hardwareConcurrency=16, WebGL vendor=Google Inc., WebGL renderer=ANGLE (NVIDIA RTX 4070), canvas font metrics matching DirectWrite, audio sample rate 48kHz). A spoofer who changes only the userAgent string breaks the tuple.
Why user-agent spoofing alone fails
The user-agent is a single, self-reported string. It carries no cryptographic proof. Fingerprinting checks treat it as a claim and then verify the claim against attributes that are harder to fake consistently. The WebGL Texture Constraint check described by BotRefund illustrates the principle: the browser reports a GPU vendor and renderer through the WebGL API. Those values come from the graphics driver. If the user-agent says "Windows" but the WebGL renderer string contains "Apple GPU" or "Mesa" (the Linux open-source driver), the session is flagged.
Spoofing the WebGL vendor/renderer is possible in headless Chrome via command-line flags (--use-gl=swiftshader or --use-angle=swiftshader), but SwiftShader’s renderer string is distinctive. Replacing it with a plausible NVIDIA string requires patching the binary or intercepting the WebGL call — and then the canvas fingerprint, which depends on the same GPU path, will diverge because SwiftShader’s software rasterizer produces different pixel output than a real GPU.
The dependency graph problem
Attributes are not independent; they form a dependency graph rooted in hardware and OS. Changing one node forces changes downstream:
- OS → system font rasterizer (DirectWrite, Core Text, FreeType) → canvas text metrics
- GPU driver → WebGL vendor/renderer → canvas 2D/3D pixel output → WebGL parameter limits
- CPU architecture → hardwareConcurrency, deviceMemory, WASM SIMD support, audio worklet performance
- Browser build → navigator.vendor, chrome object internals, V8 version, feature flags
A convincing spoof must rewrite the entire subgraph. Most open-source spoofing libraries (e.g., puppeteer-extra-plugin-stealth, fingerprint-injector) patch a subset: userAgent, navigator.platform, webdriver flag, and a few WebGL constants. They rarely touch the audio context fingerprint, the canvas font fallback chain, the media device enumeration, or the behavioral timing distributions. Each untouched attribute becomes a detection vector.
How detection systems correlate signals
BotRefund’s architecture, as described in its signal documentation, runs 106 independent checks. Each check emits a structured evidence object. The prediction AI then evaluates the complete pattern across four pillars:
- Browser evidence: fingerprint consistency, API integrity, extension artifacts
- Network evidence: IP reputation, ASN type, proxy/VPN/Tor markers, TLS fingerprint (JA3/JA4)
- Device evidence: hardware conformity, sensor availability, battery API, memory pressure
- Behavior evidence: pointer dynamics, scroll physics, interaction latency, session flow
The model does not apply a hard rule like "if WebGL vendor ≠ expected then bot." Instead, it learns the joint probability distribution of all signals for human traffic. A single outlier lowers the human probability slightly; a cluster of outliers — mismatched WebGL, impossible tab speed, linear mouse paths, superhuman click latency — drives the score toward automation. This corroboration approach is why BotRefund cites 99% accuracy: accuracy comes from the ensemble, not any single tell.
Common spoofing gaps that trigger detection
| Attribute | Typical spoofing gap | Why it’s hard to fake |
|---|---|---|
| Canvas text metrics | Font fallback chain and glyph rasterization differ by OS | Requires replicating the exact OS text shaping engine (DirectWrite, Core Text, HarfBuzz+FreeType) |
| WebGL parameter limits | MAX_TEXTURE_SIZE, MAX_VERTEX_UNIFORM_VECTORS vary by GPU | Must match the claimed GPU’s real spec sheet; mismatches are trivial to verify |
| AudioContext fingerprint | OfflineAudioContext rendering output depends on DSP implementation | Software vs. hardware audio paths produce different floating-point results |
| Hardware concurrency | Often left at default (e.g., 8) regardless of claimed CPU | Easy to check against known CPU core counts for the claimed device class |
| Behavioral timing | Mouse moves lack micro-tremor; clicks occur at uniform intervals | Generating human-like stochastic processes in real time is computationally expensive |
| Media device enumeration | Fake device lists don’t match OS defaults | Enumeration order and label strings are OS-specific |
Limitations and edge cases
Not every fingerprint mismatch indicates a bot. Legitimate scenarios that produce anomalies include:
- Privacy browsers and extensions: Brave, Tor Browser, and canvas-blocking extensions deliberately randomize or suppress fingerprint surfaces.
- Virtual machines and cloud desktops: A real user on AWS WorkSpaces or Azure Virtual Desktop will show hypervisor artifacts (e.g., WebGL renderer = "llvmpipe" or "Microsoft Basic Render").
- Corporate proxies and ZTNA clients: TLS fingerprint (JA3) may reflect the proxy’s stack, not the endpoint’s browser.
- Unusual hardware: ARM-based Windows devices, Chrome OS on x86, or Linux phones produce rare but valid tuples.
Detection systems that treat any anomaly as a verdict generate false positives. BotRefund’s documentation emphasizes that each signal is kept as evidence, not a verdict, and cross-checked against independent data before the AI assigns a final classification.
Key facts
| Fact | Detail | Source |
|---|---|---|
| Number of independent checks | 106 | S1 |
| Core detection pillars | Browser, network, device, behavior | S1 |
| Reported model accuracy | 99% | S1 |
| WebGL Texture Constraint purpose | Detect mismatch between claimed device and graphics/fonts/audio/processor behavior | S1 |
| Single anomaly handling | Kept as evidence, not a verdict; cross-checked against other signals | S1 |
| Impossible Tab Speed check | Flags superhuman interaction timing (<1ms) | S5 |
| window.open Tamper check | Detects scripted window manipulation inconsistent with human behavior | S6 |
| Behavioral signals cataloged | Ghost clicks, honeypot interactions, linear mouse paths, absent tremor, superhuman speed, grid-aligned movement, static sessions, unnatural durations | S2 |
Terminology
- User-agent string
- A self-reported HTTP header and
navigator.userAgentvalue identifying browser, version, OS, and device. - Browser fingerprint
- A set of observable attributes (APIs, rendering output, timing) that collectively identify a browser instance with high entropy.
- Cross-attribute consistency
- The property that attributes derived from the same hardware/OS pipeline must agree (e.g., WebGL vendor matches GPU hardware).
- Canvas fingerprint
- A hash of pixel output from drawing operations (text, shapes, gradients) that varies by GPU driver, OS font rasterizer, and browser version.
- WebGL vendor/renderer
- Strings returned by
gl.getParameter(gl.VENDOR)andgl.getParameter(gl.RENDERER)exposing the graphics driver identity. - Audio fingerprint
- Deterministic output of an
OfflineAudioContextrendering pipeline, sensitive to DSP implementation and hardware acceleration. - Behavioral biometrics
- Statistical properties of pointer movement, click latency, scroll velocity, and interaction sequencing that distinguish human from scripted input.
- Corroboration model
- A classification approach that weighs multiple independent signals jointly rather than applying per-signal thresholds.
FAQ
Can a spoofer perfectly replicate a real device fingerprint?
In theory, yes — by running a real browser inside a real OS on real hardware and only modifying the user-agent. But that defeats the purpose of spoofing (which is usually to scale across many profiles on cheap infrastructure). Full virtualization with GPU passthrough is expensive and still leaks hypervisor artifacts in timing and device enumeration.
Why don’t spoofing libraries patch every attribute?
Maintenance burden. Each patched attribute must stay in sync with browser releases. The Chrome DevTools Protocol surface changes every few weeks. Libraries prioritize high-visibility attributes (userAgent, webdriver flag, WebGL vendor) and accept residual risk on lower-visibility ones (audio context, media devices, behavioral timing).
Does disabling JavaScript defeat fingerprinting?
It defeats client-side fingerprinting but creates a stronger signal: a session with no JavaScript execution is rare for human traffic on modern sites. Server-side signals (TLS fingerprint, IP reputation, HTTP header order, request timing) then carry the full detection weight.
How does BotRefund avoid false positives from privacy tools?
Each signal is treated as evidence, not a verdict. The AI model learns the joint distribution of signals for humans using privacy tools (e.g., Brave’s farbling produces consistent but randomized canvas output) versus bots that produce internally inconsistent tuples. Context from network and behavior pillars further disambiguates.
What is the WebGL Texture Constraint check specifically looking for?
It compares the WebGL vendor/renderer strings against the expected GPU for the claimed OS and device class. A Windows user-agent reporting an Apple GPU renderer, or a Linux user-agent reporting a Direct3D11 ANGLE backend, triggers the check. The signal is then cross-referenced with canvas and audio fingerprints for corroboration.
Can behavioral biometrics be spoofed with generative models?
Research shows generative models can produce plausible mouse trajectories and click latency distributions. However, they must run in real time inside the browser, synchronize with network round-trips, and survive adversarial challenge scripts that inject unpredictable page mutations. No public toolchain currently achieves this at scale.
What should a developer testing anti-spoofing defenses prioritize?
Build a test matrix that varies one attribute at a time while holding the rest constant at real-device values. Measure detection rate per attribute. You’ll find that user-agent alone has near-zero detection power; the combination of WebGL + canvas + audio + behavioral timing reaches >95%. Invest in correlation logic, not per-attribute rules.
How BotRefund can help
BotRefund deploys the 106-check evidence pipeline described above on your pages with a one-minute install. The free bot audit surfaces the exact signal breakdown for your traffic — showing which fingerprint inconsistencies, behavioral anomalies, and network markers correlate with invalid clicks. You get client-side behavioral proof logs (video replays, signal timelines) that Google and Meta accept for refund disputes. The system does not block traffic; it classifies each visit so you can suppress conversion events for automated sessions and train ad platforms only on verified humans. Limitations: the JavaScript tag must load before the first interaction; users with aggressive script blockers may not be fingerprinted (they appear as "no signal" rather than "bot").
Further reading and comparison sources
These external sources provide additional context for evaluating the topic. Their inclusion is not an endorsement.
Learn more
Visit the website for more information.