Mullvad’s per-key deterministic exit IP assignment, combined with a seeded RNG bug, reduces 8.2 trillion possible IP combinations to just 284, enabling cross-session fingerprinting.
Key Takeaways
Mullvad assigns exit IPs deterministically per WireGuard pubkey via a seeded RNG, meaning your exit IP stays static for 1-30 days per server connection.
A Rust random_range implementation reuses the same underlying float scaled to pool size bounds, collapsing all users into ~284 exit IP combinations across tested servers.
Two servers with identical pool sizes (e.g., cl-scl-wg-001 and za-jnb-wg-002, both size 11) always share IP indexes, confirming the seed-based mechanism.
The estimator tool at tmctmt.github.io/mullvad-seed-estimator narrows a user’s float range to ~0.34% of users, roughly 340 people out of 100k active users.
Mitigation: avoid switching servers more than once per pubkey and force-rotate the pubkey by logging out of the Mullvad app.
Hacker News Comment Review
Commenters debate why Mullvad built per-key deterministic IPs at all; the leading theory is abuse containment so one botting user doesn’t get a shared IP range blocked by services like Google.
There is consensus that the RNG pool-size behavior is a subtle, non-obvious Rust footgun that most programmers would not predict, raising the question of whether this is an unintended bug rather than a deliberate privacy tradeoff.
The fix is considered trivial (add a per-user pseudorandom seed), so a patch is expected quickly; one commenter notes this is relevant to site operators wanting to use Mullvad IPs for ban enforcement.
Notable Comments
@JoheyDev888: “Deterministic exit IPs let any site build a persistent profile across sessions. You’re not eliminating tracking, just shifting who does it.”