- Mullvad bir sunucuda birden fazla exit IP bulunduruyor, ancak bunları WireGuard anahtarına göre deterministik biçimde atıyor; her bağlantıda rastgele değişmiyor
- 9 sunucuda pubkey’i tekrar tekrar değiştirerek toplanan 3.650 veri noktası, teoride mümkün olan 8,2 trilyon kombinasyon içinden yalnızca 284 kombinasyona atandı
- Her sunucunun exit IP’si havuz içinde benzer bir yüzdelik konumda yer alıyor; tek bir kombinasyon birçok sunucuda kabaca 81. yüzdeliğe denk geliyor
- Bunun nedeni, pubkey veya tünel adresini seed olarak kullanıp havuz boyutunu üst sınır yapan seed tabanlı RNG ile exit IP indeksinin seçilmesi gibi görünüyor
- IP loglarındaki float aralıkları çakışırsa, farklı Mullvad sunucuları kullanılsa bile hesaplar arasında ilişki kurulabiliyor ve anonimlik riski büyüyor
Mullvad exit IP’lerinin bir fingerprinting vektörüne dönüşme yapısı
- Mullvad bir sunucuda birden fazla exit IP sunuyor ve aynı sunucuya bağlanan iki kullanıcıya genelde farklı genel IP’ler veriliyor
- Sunucu sayısı 578; bu sayı Proton VPN’in 20.000 sunucusundan daha az. Bu nedenle kullanıcıları tek bir IP’de yoğunlaştırmayan dikey ölçekleme, aşırı IP engelleme ve hız sınırlamasından kaçınmak açısından avantaj sağlayabiliyor
- Ancak sunucuya her bağlanışta exit IP rastgele değişmiyor; WireGuard anahtarına göre deterministik olarak seçiliyor
- WireGuard anahtarı 1 ila 30 günde bir döndürülüyor, ancak üçüncü taraf istemcilerde döndürülmüyor
- Her sunucuda bağımsız şekilde sabit bir exit IP atanıyorsa, yalnızca birkaç sunucudaki IP kombinasyonu bile bir kullanıcıyı diğer Mullvad kullanıcılarından ayırmaya yetebilir
9 sunucuda gözlemlenen exit IP kombinasyonları
- pubkey’i tekrar tekrar değiştirerek 9 sunucunun exit IP’lerini toplayan bir betik gece boyunca çalıştırıldı ve 3.650 pubkey veri noktası elde edildi
- Bu sunuculardaki exit IP aralıkları şöyle gözlemlendi
| Hostname | Start IP | End IP | # IPs |
|---|---|---|---|
| au-syd-wg-101 | 103.136.147.5 | 103.136.147.64 | 60 |
| cl-scl-wg-001 | 149.88.104.4 | 149.88.104.14 | 11 |
| de-ber-wg-007 | 193.32.248.245 | 193.32.248.252 | 8 |
| dk-cph-wg-002 | 45.129.56.196 | 45.129.56.226 | 31 |
| fi-hel-wg-201 | 185.65.133.10 | 185.65.133.75 | 66 |
| us-lax-wg-001 | 23.234.72.36 | 23.234.72.126 | 91 |
| us-nyc-wg-602 | 146.70.168.132 | 146.70.168.190 | 59 |
| us-sjc-wg-302 | 142.147.89.212 | 142.147.89.224 | 13 |
| za-jnb-wg-002 | 154.47.30.145 | 154.47.30.155 | 11 |
- Bu sunucuların havuz boyutları çarpıldığında, teoride 8,2 trilyondan fazla exit IP kombinasyonu mümkün görünüyor
- Gerçekte test edilen tüm pubkey’ler bunların içinden yalnızca 284 kombinasyondan birine atandı
- Olası kombinasyon sayısına kıyasla gözlemlenen kombinasyon sayısının çok az olması, sunucu başına IP seçiminin bağımsız olmadığına işaret ediyor
Farklı IP’lerin aynı yüzdelikte yer alma deseni
- Exit IP’nin havuz başlangıç IP’sinden ne kadar uzakta olduğuna bakılarak sayısal konum hesaplanabiliyor
- Örneğin
au-syd-wg-101üzerinde103.136.147.53,103.136.147.5adresinden sayıldığında 1-based indeks olarak 49’a denk geliyor - Gözlemlenen kombinasyonlardaki IP konumu, her sunucunun havuz boyutuna bölündüğünde farklı sunucularda bile neredeyse aynı oran ortaya çıkıyor
| Server | IP | Position | Pool size | Ratio |
|---|---|---|---|---|
| au-syd-wg-101 | 103.136.147.53 | 49 | 60 | 0.816 |
| cl-scl-wg-001 | 149.88.104.12 | 9 | 11 | 0.818 |
| de-ber-wg-007 | 193.32.248.251 | 7 | 8 | 0.875 |
| dk-cph-wg-002 | 45.129.56.220 | 25 | 31 | 0.806 |
| fi-hel-wg-201 | 185.65.133.63 | 54 | 66 | 0.818 |
| us-lax-wg-001 | 23.234.72.109 | 74 | 91 | 0.813 |
| us-nyc-wg-602 | 146.70.168.179 | 48 | 59 | 0.813 |
| us-sjc-wg-302 | 142.147.89.222 | 11 | 13 | 0.846 |
| za-jnb-wg-002 | 154.47.30.153 | 9 | 11 | 0.818 |
- Her IP, kendi havuzunda benzer bir yüzdelik konuma düşüyor; yukarıdaki örnek genel olarak 81. yüzdeliğe karşılık geliyor
- Bu desen nedeniyle Mullvad’ın tüm sunucularda birbirine komşu konumlardaki exit IP’leri atıyormuş gibi göründüğü belirtiliyor
Muhtemel neden: seed tabanlı rastgele seçim
cl-scl-wg-001ileza-jnb-wg-002, gözlemlenen 284 IP kombinasyonunun tamamında her zaman aynı IP indeksini paylaşıyor- Bu iki sunucunun ortak noktası 11’lik havuz boyutu ve bu durum, aynı seed ile aynı sınırlar kullanıldığında aynı sonucu veren rastgele çağrı yapısıyla uyumlu
- RNG statik bir seed ile başlatılıp aynı aralıkta sayı çekildiğinde aynı sonuç tekrar ediyor
- Mullvad’ın pubkey veya tünel adresini seed olarak kullanıp havuz boyutunu üst sınır olarak veren seed tabanlı RNG ile exit IP indeksini seçtiği düşünülüyor
- Bounds değişse bile RNG’nin entropi havuzu etkilenmiyor; Rust tarafında ilk çağrıda aynı float’ın üretilip bounds ile çarpılması gözlemlerle örtüşüyor
- Bu davranış
min + round((max - min) * float)gibi basitleştirilerek düşünülebilir, ancak bu ifade önemli ölçüde sadeleştirilmiş olabilir - Bu özellik yüzünden havuz boyutları farklı olsa bile aynı seed’den çıkan float, her sunucu havuzunda benzer oransal noktaya eşleniyor
- Mullvad istemcisi Rust ile yazıldığı için backend dilinin de Rust olabileceği belirtiliyor, ancak bu yalnızca istemci uygulamasına bakılarak yapılan bir çıkarım
random_range’in bounds değişimine göre tam olarak nasıl davrandığını öngörmek zor; bounds artışının entropiyle karışıp farklı sayılar üreteceğini düşünmek kolay, ancak gerçek gözlemler bunu göstermiyor
IP log korelasyonundan doğan anonimlik riski
- Belirli bir IP kombinasyonu için mümkün float değerlerinin minimum ve maksimumunu tahmin eden bir araç mullvad-seed-estimator olarak sunuluyor
- Ekran görüntüsündeki belirli IP kümesi 0.2909~0.2943 aralığındaki float değerleri olarak yorumlanıyor; fark 0.0034
- Bu da Mullvad kullanıcılarının %0,34’ünün bu IP’leri paylaştığı anlamına geliyor; kabaca 100.000 aktif kullanıcı varsayımında bu sayı 340 kişiye denk geliyor
- İlk tahmin edildiği kadar benzersiz olmasa da %99’dan yüksek doğruluk yine de düşük sayılmaz
- Örneğin bir forum yöneticisi, bir gün önce engellediği kullanıcının sockpuppet’i olduğundan şüphelendiği yeni bir hesabı incelerken, iki hesap farklı Mullvad sunucuları kullanmış olsa bile IP logları
0.4334 - 0.4428ve0.4358 - 0.4423gibi çakışan float aralıkları içeriyorsa aynı kişi olma olasılığı %99’un üzerine çıkıyor - Veri sızıntısı veya hukuki süreçlerle elde edilen IP loglarına da aynı korelasyon uygulanırsa, VPN arkasındaki kullanıcı anonimliği zedelenebilir
Korunma yöntemi
- Her pubkey için sunucuyu bir kereden fazla değiştirmemek öneriliyor
- Mullvad uygulamasında oturumu kapatarak pubkey’i zorla döndürmek mümkün
1 yorum
Hacker News görüşleri
Mullvad’da çalışan ortak CEO ve kurucu ortak benim. Yazıda bahsedilen davranışların bir kısmı kasıtlı, bir kısmı değil; sebep de blog yazısındaki açıklamayla tam olarak aynı değil
Hafifletme olarak, kasıtsız davranışa yönelik bir yamayı altyapının bir kısmında zaten test ediyoruz; bu yüzden bugün yeniden üretmeyi denerseniz sonuçlar kafa karıştırıcı olabilir
Kasıtlı davranışın da kabul edilebilir olup olmadığını yeniden değerlendireceğiz; burada çeşitli gizlilik unsurları ile kullanıcı deneyimi arasında bir denge var
Bu değerlendirme, bunu bir saat önce öğrendikten sonra operasyon ekibiyle hemen konuşup bu yorumu yazarken toparladığım mevcut görüşüm; değişebilir
Güvenlik araştırması yapanların, güvenlik·gizlilik sorunu bulduklarında hemen yayımlamayı planlasalar bile önce yöneticiye ya da satıcıya haber vermelerini isterim
mullvad tunnel getile kontrol edebilir vemullvad tunnel set rotation-intervalile değiştirebilirsiniz; yazıda tercih edilen hafifletme yöntemi de buŞahsen yarı sabit IP’yi büyük bir sorun olarak görmüyorum. Amaç ISP ve devletin ağ düzeyindeki gözetimini engellemek; hatta bazı sağlayıcılar sabit IPv4’ü özellik olarak satıyor
Gizlilik odaklı VPN’lerde, IP alanı ne kadar küçükse dışarıdan görülen tek bir IP’nin arkasında o kadar çok kullanıcı karışabilir; bunun da avantajı var. DAITA gibi tünele sahte trafik ekleyen tekniklerle çoklu atlamalı giriş noktalarını birleştirince, gün boyu netflow izleyen gözetmenler için işi gerçekten zorlaştırabileceğini düşünüyorum
Temel bulgu olan sunucular arası IP havuzu içi konum korelasyonu, gerçekten de kasıtsız davranış içeriyor gibi görünüyor. Mullvad ekibiyle çalışma deneyimime dayanarak bunun yakında ele alınacağını düşünüyorum
Farklı “kimlikler” istiyorsanız WireGuard anahtarını döndürmeniz ya da farklı anahtarlar kullanmanız gerekir
Yazıda, “bir sunucuya her bağlandığınızda çıkış IP’si rastgele değil, WireGuard anahtarına göre deterministik olarak seçiliyor ve bu anahtar 1-30 günde bir döndürülüyor. Üçüncü taraf istemci kullanırsanız döndürülmüyor” denmişti; ancak WireGuard tasarım gereği bağlantısız bir protokoldür, yani bağlantı kavramı yoktur; yalnızca trafik aktığında 2-3 dakikada bir yeniden anahtarlama el sıkışması olur
Aynı WireGuard anahtarıyla bile her “bağlantıda” — örneğin her yeniden anahtarlama el sıkışmasında ya da her 15 dakikada bir — çıkış IP’si değişseydi, aktarım katmanında QUIC hariç tünel içindeki neredeyse tüm bağlantılar kopup yeniden kurulmak zorunda kalırdı; uygulama katmanında ise “aynı çerez, yeni IP”den şüphelenen servisler çıkış yaptırır, CAPTCHA gösterir ya da risk puanı üretirdi
Bunların ikisi de kötü kullanıcı deneyimi yaratır; daha kötüsü, “bu kişi sürekli farklı IP’lerden yeniden bağlanıyor, demek ki Mullvad kullanıcısı” gibi kullanıcıyı daha ayırt edici biçimde parmak iziylemeye yol açabilir
“Bir forum yöneticisi, önceki gün engellediği kullanıcının yan hesabı olup olmadığından şüphelenip IP loglarına baktığında, farklı Mullvad sunucuları kullanmalarına rağmen iki hesabın çakışan kayan nokta aralıkları 0.4334~0.4428 ve 0.4358~0.4423’e eşlendiğini, dolayısıyla %99’dan yüksek olasılıkla aynı kişi sayılabileceklerini” söyleyen örnek, bir istihbarat teşkilatı VPN tasarlasa herhalde böyle yapardı hissi veriyor
Üstelik bu yöntem, kullanıcıların farklı sunucular seçmesine bağlı; bu yüzden daha da anlamsız olurdu
Bana göre bu büyük bir sorun ve birden çok VPN çıkış düğümü arasında korelasyon analizi yapılmasını mümkün kılıyor, ama hepsi bu. Kullanıcıyı otomatik olarak teşhis etmeyi sağlamıyor
Yine de teşhis zorluğunu ciddi biçimde düşürüyor ve gereksinimler hâlâ yüksek. Umarım yakında düzeltilir
“Hash gibi hassas bir değerden üretelim” türü bir hatanın, hem de Mullvad’da, hâlâ yaşanmasına inanmak zor. Neden sadece rastgeleleştirilmedi acaba diye düşünüyorum
Elbette başka istihbarat teşkilatları da var ama en çok endişe edilmesi gereken taraf orası. Ya doğrudan işletmişlerdir ya da böyle bir fikri bilip uygulamışlardır ya da ortak kurumların işlettiği servislere erişimleri vardır. Aksi hâlde benim için tehdit olmazdı
Ayrıca Mullvad kullanıcılarının VPN üzerinden anonimliklerinin bozulduğu bilinen kamuya açık bir vaka yok; bilinenler daha çok başka operasyonel güvenlik hataları yüzünden ortaya çıkan vakalar. Eğer istihbarat servislerinde bu yetenek olsaydı, neredeyse 20 yıllık veriye sahip olup hiç kullanmamış olmaları pek inandırıcı gelmiyor
Yazıdaki sayılardan yalnızca “%99’dan yüksek olasılık” sonucunun nasıl çıktığını anlamıyorum. İlk engellenen IP’nin tohumu ile ikinci tohumun ikisinin de 0.4423~0.4358 aralığında olduğunu güçlü biçimde varsaysak bile, bu yalnızca bu aralığın tüm Mullvad kullanıcılarının %0,65’ini kapsadığı anlamına gelir
100 bin kullanıcı varsa bu 650 kişi eder; yani “şüphelileri” %99’dan fazla azaltmış olursunuz ama birden çok çıkış IP’si üzerinde tek bir kişiyi %99’dan yüksek doğrulukla tespit etmiş olmazsınız
Bayesçi açıdan bakarsak, olası tohumların çakışması iki IP’nin aynı kişiye, en azından aynı Mullvad hesabına ait olduğuna dair güçlü kanıt olur; ama yazının iddiası bu gibi görünmüyor
Çoğu küçük web sitesi için bu oldukça güçlü bir kanıt olur
VPN’in amacı, ziyaret edilen sitelere karşı kullanıcıyı anonimleştirmeyi kapsamaz; bu yüzden Mullvad’ın benzersiz çıkış IP’lerini zorlamaması şaşırtıcı değil. Anonimlik isteyen kullanıcılar Tor gibi bir ağ kullanmalı
Genel VPN kullanıyorsanız isteği kimin gönderdiğini, uç IP dâhil, kimsenin bilmemesini istersiniz
O mantıkla VPN torrent için kullanılmamalı. Çünkü uç IP’ye karşı anonimleştirmemesi gerektiği anlamına gelir. Oysa pratikte torrentte gayet iyi çalışıyor
Özel VPN’den bahsediyorsanız Mullvad öyle bir şey değil
Uzun süredir Mullvad kullanıyorum ve ülkemde yasal olduğu sürece, adıma kayıtlı kredi kartımla Mullvad VPN hizmetini satın almaya ve kullanmaya devam edeceğim
VPN %100 anonimlik sağlamaz ve zaten bunun için tasarlanmamıştır. Bunun yerine, yasaya uyan yetişkinlere belli ölçüde gizlilik sağlamak içindir
Çoğu insan, iş arkadaşlarının ve komşularının özel yaşamını, neleri sevdiğini, neler satın aldığını, neler yaptığını bilmesinden utanır. Bu yüzden çoğu insan gizliliğini korumak için VPN kullanmalıdır
Tanım gereği “çoğu insan” internette %100 anonimlik istemez ya da bunu beklemez; sadece kişisel yaşamında ve ilişkilerinde biraz gizlilik ister
VPN, çevrimiçi suç işleyip devletten %100 anonim kalmak isteyen suçluları korumaz; amacı da bu değildir. Bu ayrım önemlidir. “Çoğu insan” suçlu değildir ve Mullvad’dan ya da başka VPN sağlayıcılarından böyle gerçek dışı beklentiler içinde değildir
Sırf yukarıdaki mantık yüzünden raporu çöpe atamayız. Bulgunun kendisi hâlâ geçerli
Eksik kalan bir şey var. Mullvad ile iletişime geçilip geçilmediğini merak ediyorum. Güvenlik ekibinin nasıl yanıt verdiğini görmek de ilginç olurdu
Sonradan fark ettim ki bu yorumu yazdığıma pişman oldum. Gereksizdi ama şimdi silersem garip görünebilir
İnsanların VPN’den Tor’a benzer bir şey beklemesi bana şaşırtıcı geliyor
Böyle açınca kulağa mantıksız geliyor ve çıkış düğümlerini kontrol ederseniz Tor kullanıcılarının bile anonimliğini bozmanın mümkün olabileceğini de hesaba katmak gerekir
“Çıkış IP’si her bağlandığınızda rastgeleleştirilmiyor, WireGuard anahtarına göre deterministik seçiliyor ve bu anahtar 1-30 günde bir döndürülüyor. Üçüncü taraf istemci kullanırsanız hiç döndürülmüyor” kısmı biraz kafa karıştırıcı
Yöntem depoda ayrıntılı anlatılıyorsa, üçüncü tarafın varsayılan uygulama istemcisi gibi anahtar döndürme yapmasını engelleyen şeyin ne olduğunu anlamıyorum
Yazar iyi yakalamış ve bunun Mullvad’ın bir hatası olması da gayet inandırıcı. Böyle basit bir şeyin gözden kaçmış olması oldukça sarsıcı ama ben de kaçırabilirdim gibi geliyor
Birden çok sunucu arasındaki IP korelasyonu dışında, başta neden tek bir sunucuda kullanıcı IP’sini kararlı tuttuklarını da merak etmiştim. Ama yazarın, diğer VPN’lerin genelde sunucu başına tek IP kullandığını ve bunun taklit edildiğini söyleyen açıklaması mantıklı
Kullanıcı belirli bir hizmete erişebildiği bir sunucu bulursa, yeniden o sunucuya bağlandığında aynı IP’yi alıp tekrar çalıştırabilmesinin bir avantajı var
Yine de sunucular arası IP korelasyonu
rand.seed(user_pub_key + server_id)gibi bir şeyle düzeltilmeliIPinfo’da çalışıyorum. VPN tespiti işimiz var ama dürüst olmak gerekirse Mullvad’a iyi niyet atfetmek istiyorum
Mullvad, bizim gibi IP coğrafi konum sağlayıcılarına bilerek yanlış coğrafi konum verisi göndermeye çalışmayan üç VPN sağlayıcısından biriydi. Bunu da düzelteceklerinden eminim