One session egressed from many distinct IPs (rotating proxy pool)
net.ip_rotation_within_session · convicts
What it catches
Within-session network-origin coherence — the rotating-proxy-pool signature, the dominant scraper evasion. A real short HTTP/cookie session egresses from ONE edge-observed IP; a residential/datacenter proxy pool rotates the exit IP per request, so one ks_sid is observed from many distinct source IPs. The detector derives network.ip_rotation in ingest when a session accumulates >= _IP_ROTATION_MIN (3) distinct observed_ip across requests (a running observed_ip_seen set survives the latest-per-kind merge collapse; flag is sticky). This is REPUTATION-FREE — it is a pure within-session coherence COUNT, needing no residential/datacenter classification (the external-data-gated half). FP-safe by a conservative threshold: a real client presents 1 IP, at most 2 across a wifi<->cellular handoff or a CGNAT pool's shared block; 3+ distinct egress IPs under one short session is not a real browser. browserforge calibration carries no network/IP layer, so promotion cannot raise its legit-browser flag rate. GROUNDED LIVE 2026-06-20: minted one ks_sid, then replayed the SAME cookie from 4 distinct container IPs on kitsune_default (curl over the edge reverse-proxy) -> the detector accumulated 4 distinct observed_ip and tripped this rule (label bot); every single-IP evader/capture in the fleet (one observed_ip) does NOT fire it — zero FP. Residual caveat (documented, same external-data class as net.tcp_os_vs_ua's proxy confound): a carrier doing aggressive per-connection public-IP pooling across 3+ addresses, or a client legitimately switching networks 3+ times within one short session, is a theoretical FP that real-traffic IP-reputation data (the gated half) would disambiguate; the rotation COUNT itself is in-sandbox-detectable and the threshold is set conservatively to avoid it. Catches the OS-diverse and same-OS proxy pools alike (it counts IPs, not TLS/OS), complementing net.ja4_unstable_within_session (TLS-engine rotation) and the cross-session coordination signals (shared_real_ip / fp_collision).
Signals it reads
network.ip_rotation
How it fires
present
Evaders it caught 1
Bypassed by 10
Frontier evaders that reach the detector uncaught (scored only suspicious, defeating every convicting tell) — this check is not one that stops them. The red-team frontier this detection still has to convict.