Mullvad VPN má skrytou slabinu: exit IP adresy můžou prozradit, kdo jste
Bezpečnostní výzkumník na blogu tmctmt přišel na zajímavou věc o Mullvad VPN, jednom z nejoblíbenějších providerů mezi lidmi, co řeší soukromí. Mullvad totiž nepřiděluje uživatelům exit IP adresy náhodně, ale deterministicky podle WireGuard klíče. To znamená, že se stejným klíčem dostanete na konkrétním serveru vždycky tu samou IP.
Autor si napsal skript, který opakovaně měnil veřejný klíč a sbíral exit IP adresy z 9 různých serverů. Za noc vygeneroval data pro 3650 klíčů. A tady přichází překvapení: i když součet velikostí všech IP poolů dává přes 8,2 bilionu možných kombinací, ve skutečnosti se všechny testované klíče dostaly jen do 284 unikátních kombinací.
Důvod? Mullvad zřejmě používá Rust random_range, který má překvapivou vlastnost, a to když změníte horní hranici, RNG vygeneruje pořád stejný float (jen ho přeškáluje). Takže vám server s 11 IP adresami a server s 60 IP adresami přiřadí adresu na stejné procentuální pozici (např. obě v 81. percentilu jejich poolu).
Co to znamená v praxi: autor vytvořil nástroj, který z kombinace tvých exit IP odhadne float seed s přesností kolem 0,34 %. Při odhadovaných 100 000 aktivních uživatelích to znamená, že to zúží na ~340 lidí. Když si moderátor fóra (nebo někdo s přístupem k IP logům z data breachů) všimne, že dva účty mají překrývající se float rozsahy, dá se s >99% jistotou říct, že jde o stejnou osobu – i přes VPN.
Jak se bránit: nepřepínat servery v rámci jednoho klíče a občas si vynutit rotaci klíče odhlášením z Mullvad aplikace.
Není to úplný konec světa (Mullvad pořád zůstává jeden z lepších VPN providerů), ale je to pěkná ukázka toho, jak nenápadná implementační volba, pochopení toho, jak se chová RNG při změně bounds, může otevřít vektor pro korelační útoky a deanonymizaci.