← На главную

Mullvad требует чаще менять сервера, чтобы избежать сопоставления пользователей

15.05.2026 02:35 · hackernews

Компания Mullvad использует одну из немногих в отрасли стратегий с несколькими выходами на своих VPN-серверах: при подключении двух пользователей к одному устройству им обычно выдаются разные публичные IP-адреса. Хотя у провайдера всего 578 серверов против 20 тысяч у Proton VPN, такое вертикальное масштабирование нужно, чтобы избежать перегрузки отдельных IP на сайтах с жесткими блокировками. Однако здесь кроется любопытный нюанс: выдаваемый выходной IP не выбирается случайно при каждом соединении, а детерминировано рассчитывается на основе вашего ключа WireGuard, который вращается каждые 1 до 30 дней. Если использовать сторонний клиент, вращение вообще не происходит.

Автор статьи проверил эту гипотезу на практике. Он написал скрипт, который менял публичный ключ и фиксировал выдаваемые IP для набора из 9 серверов. За ночь эксперимент собрал данные для 3650 ключей, что позволило вычислить диапазон IP для каждого узла. Общее количество возможных комбинаций для этих серверов превышает 8,2 триллиона, поэтому вероятность случайного совпадения кажется ничтожно малой. Тем не менее, все протестированные ключи получились только из 284 комбинаций.

Дальше автор проанализировал математическую структуру. Вычисляя позицию IP внутри пула для каждой комбинации, он обнаружил удивительное совпадение: во всех случаях доля оставалась почти неизменной, примерно 81%. Это означает, что Mullvad присваивает соседние адреса на всех серверах по единому процентильному показателю. Даже когда размер пула меняется, например у серверов в Чили и ЮАР он всего 11 адресов, пропорции остаются идентичными.

Причина кроется в коде. Исследователи выяснили, что провайдер использует генератор случайных чисел с фиксированным начальным значением, типичный для языка Rust, на котором написан и клиент. В таких алгоритмах результат первых вызовов зависит от начального состояния, а не от границ диапазона. Генератор масштабирует это начальное число пропорционально размеру пула по формуле min + round((max - min) * float). Разработчики, возможно, ошибочно полагали, что изменение границ должно менять результат, но энтропия пула при этом не затрагивается.

Тем не менее, это дает возможность корреляции идентичностей. Создав инструмент для оценки, автор обнаружил, что для заданной пары IP можно вычислить диапазон float-значений. Например, некоторые группы пользователей попадают в узкий диапазон шириной 0,0034, что при общей численности примерно в 100 тысяч активных пользователей означает, что около 0,34% человек делят одни и те же выходные адреса. Для модератора форума это значит, что даже если два аккаунта используют разные сервера, они с вероятностью выше 99% принадлежат одному человеку.

Автоматизированные атаки на основе таких утечек позволяют deanonymize пользователей даже за VPN. Чтобы защититься, эксперты рекомендуют не переключаться между серверами чаще одного раза за один публичный ключ и обязательно вращать свой ключ, выходя из приложения Mullvad, чтобы сбросить внутренний счетчик и получить новую комбинацию.

Читать оригинал →