Mullvad exit IP는 놀라울 정도로 식별 가능함

Mullvad는 수면에서 수면으로 이어지는 VPN 브랜드다. 로그를 남기지 않는다는 정책으로 유명하고, 프라이버시 주의 사용자들 사이에서 단골로 꼽히는 서비스다. 그런데 최근 보안 연구에서 Mullvad의 exit IP 선택 방식이 의외의 방식으로 사용자를 식별가능피리용다는 사실이 공개됐다. 놀라운 것은 Mullvad 공동 창업자조차 자신들의 실수라고 인정했다는 점이다.
핵심 발견: 무작위가 아닌 결정적 선택
Mullvad는 하나의 서버에 여러 개의 exit IP를 두는 구조다. 같은 서버에 연결한 두 사용자가 보통 다른 공개 IP를 받는다. 서버 수는 578대로, Proton VPN의 20,000대에 비해 적다. 그래서 한 IP에 사용자를 수직으로 밀어넣는 수평 확장이 과도하지 않고, IP 차단이나 속도 제한을 피하기에도 유리하다.
문제는 서버에 연결할 때마다 exit IP가 무작위로 바뀌지 않는다는 점이다. WireGuard 키를 기반으로 결정적으로 선택된다. WireGuard 키는 1~30일마다 교체되는데, 서드파티 클라이언트에서는 회전하지 않는다.
3,650개 데이터 포인트가 들려주는 이야기
보안 연구자는 9개 서버에서 pubkey를 반복 변경하면서 exit IP를 수집하는 스크립트를 작성했다. 밤새 실행한 결과, 3,650개의 pubkey 데이터 포인트를 얻었다.
서버별 IP 풀 크기를 모두 곱하면 8.2조 개 이상의 exit IP 조합이 가능해 보인다. 그런데 실제로 테스트된 모든 pubkey는 그중 284개 조합 중 하나에만 배정됐다. 가능한 조합 수에 비해 관찰된 조합 수가 매우 적다. 서버별 IP 선택이 독립적이지 않다는 단서가 된다.
81번째 백분위라는 숫자
관찰된 조합의 IP 위치를 각 서버의 풀 크기로 나누면, 서로 다른 서버에서도 거의 같은 비율이 나타난다.
| 서버 | IP 위치 | 풀 크기 | 비율 |
|---|---|---|---|
| au-syd-wg-101 | 49 | 60 | 0.816 |
| cl-scl-wg-001 | 9 | 11 | 0.818 |
| de-ber-wg-007 | 7 | 8 | 0.875 |
| dk-cph-wg-002 | 25 | 31 | 0.806 |
| fi-hel-wg-201 | 54 | 66 | 0.818 |
| us-lax-wg-001 | 74 | 91 | 0.813 |
| us-nyc-wg-602 | 48 | 59 | 0.813 |
| us-sjc-wg-302 | 11 | 13 | 0.846 |
| za-jnb-wg-002 | 9 | 11 | 0.818 |
대부분의 조합이 대체로 81번째 백분위에 해당한다. Mullvad가 모든 서버에서 서로 이웃한 위치의 exit IP만 배정하는 것처럼 보인다.
원인: 시드 기반 RNG
cl-scl-wg-001과 za-jnb-wg-002는 관찰된 284개 IP 조합 전체에서 항상 같은 IP index를 공유한다. 두 서버의 공통점은 풀 크기 11이다. 동일한 seed와 동일한 범위에서 난수를 호출하면 같은 결과가 반복되는 구조와 맞다.
Mullvad는 pubkey 또는 터널 주소를 seed로 쓰고, 풀 크기를 상한값으로 넣는 시드 기반 RNG로 exit IP index를 고르는 것으로 추정된다. bounds가 바뀌어도 RNG의 엔트로피 풀은 영향을 받지 않는다. Rust에서 첫 호출의 float가 bounds에 곱해지는 방식과 맞아떨어진다.
익명성 위험이 실제로 어떤 의미인지
특정 IP 조합에서 가능한 float 값의 최솟값과 최댓값을 추정하는 도구(mullvad-seed-estimator)가 공개됐다. 예시로 든 IP 집합은 0.2909~0.2943 사이의 float 값으로 해석되며, 차이는 0.0034다.
이는 Mullvad 사용자 중 0.34%가 이 IP들을 공유한다는 뜻이다. 활성 사용자 100,000명이라는 대략적 추정에서는 340명에 해당한다. 처음 예상한 수준만큼 고유하지는 않지만, 99% 이상 정확도로 낮다고 하긴 어렵다.
실제 위협 시나리오를 보자. 포럼 관리자가 전날 차단한 사용자의 새 계정을 의심한다고 하자. 두 계정이 서로 다른 Mullvad 서버를 썼더라도, IP 로그의 float 범위가 겹치면 같은 사람일 확률이 99%를 넘는다. 데이터 유출이나 법적 절차로 확보한 IP 로그에도 같은 방식의 상관관계를 적용하면, VPN 뒤의 사용자가 익명성을 잃을 수 있다.
Mullvad 측의 반응

Mullvad 공동 창업자이자 CEO는 Hacker News에 직접 답변을 남겼다. 핵심은 이렇다:
• 글에 나온 동작 중 일부는 의도한 것이고 일부는 아니다
• 원인은 블로그 글 설명과 정확히 같지는 않다
• 의도하지 않은 동작에 대한 패치를 이미 인프라 일부에서 테스트 중이며, 곧 전체에 적용할 예정이다
• 의도된 동작도 수용 가능한지 다시 평가할 예정이다
흥미로운 것은 Mullvad가 이 문제를 비밀스럽게 처리하지 않고 공개선택료명랑화 전략을 선택했다는 점이다. 보안 연구자에게 먼저 연락했으면 더 좋았을 것이라는 비판도 있지만, 발견 사항 자체의 타당성은 인정했다.
보호 방법
현재 가능한 완화책은 이렇다:
1. WireGuard 키를 수동으로 회전한다. Mullvad 앱에서 로그아웃하면 pubkey가 강제로 회전한다.
2. 키 회전 간격을 변경한다. mullvad tunnel get으로 현재 설정을 확인하고, mullvad tunnel set rotation-interval으로 간격을 조절할 수 있다.
3. 다른 서버를 번갈아 사용한다. 하나의 pubkey로 여러 서버에 연결하면 IP 조합이 달라져 상관관계 분석이 어려워진다.
Mullvad 앱의 키 교체 주기는 기본적으로 72시간으로 알려져 있다.
생각해볼 점
VPN이 100% 익명을 보장하지 않는다는 사실은 이미 알려진 것이다. 그러나 "로그를 남기지 않는다는 Mullvad"에서 이러한 구현 실수가 발견되자 많은 사람이 의외라는 반응을 보였다. Carl Miller의 지적처럼, "해시 같은 민감한 값으로 만들자"는 방식의 실수가 아직도 나온다는 게 믿기지 않는다는 것이다.
Mullvad의 목적은 ISP나 정부의 네트워크 수준 감시를 막는 것이다. 일부 업체는 고정 IPv4를 기능으로 팔기도 한다. 프라이버시 VPN에서는 IP 공간이 작을수록 한 IP 뒤에 더 많은 사용자가 섞이므로 외부 관찰자가 사용자를 구분하기 어렵다는 장점도 있다.
그러나 이번 발견은 Mullvad의 exit IP 선택 구조가 서로 다른 서버를 쓰는 사용자에게도 IP 로그 상관관계 분석을 가능하게 만든다는 점에서 기존 예상보다 위험이 크다. Mullvad 측에서 패치를 진행 중이므로, 향후 개선된 동작을 기대할 수 있다.
VPN 사용자가 기억할 점은 명확하다. 어떤 VPN도 100% 익명을 보장하지 않는다. Mullvad도례외는 아니다. 그러나 Mullvad가 빠르게 대응하고 있다는 점은 여전히 신뢰할 만하다.
출처
• Mullvad exit IPs as a fingerprinting vector (tmctmt.com)
• GeekNews - Mullvad exit IP는 놀라울 정도로 식별 가능함
• Mullvad co-founder responds to exit IP fingerprinting claims (Piunikaweb)
📚 출처
'자동화&툴 리뷰' 카테고리의 다른 글
| AI 집단 광기(AI Psychosis) — MIT가 경고하는 소프트웨어 산업의 현주소 (1) | 2026.05.17 |
|---|---|
| Artifact Keeper — Rust로 만든 오픈소스 범용 아티팩트 레지스트리 완벽 가이드 (0) | 2026.05.17 |
| NGINX Rift — 18년간 숨겨졌던 치명적 취약점의 모든 것 (0) | 2026.05.17 |
| RustFS - Rust로 만든 S3 호환 분산 객체 스토리지 완벽 가이드 (0) | 2026.05.16 |
| Claude, 프로그래밍 방식 사용을 월간 크레딧 구조로 변경 — 개발자가 반드시 알아야 할 핵심 정리 (0) | 2026.05.15 |