Android VPN bez rootu: komu patria súhlas, trasy a blokovanie
Súhlas, rozhranie TUN a systémová politika blokovania sú tri rôzne oprávnenia. Sledujte, ktorý komponent vlastní každé z nich, skôr než začnete recenzovať aplikáciu Android VPN.
Root nie je to, čo umožňuje aplikácii Android VPN prenášať prevádzku, blokovať úniky alebo prežiť reštart. Ľudia to všetko zhŕňajú ako „aplikácia má oprávnenie VPN“, čo skrýva tri oddelené mechanizmy: súhlas udelený používateľom, paketové rozhranie, ktoré systém vytvorí, a politiku blokovania platformy, ktorú aplikácia nedefinuje. Recenzovať návrh Android VPN znamená pýtať sa, o ktoré z tých troch sa tvrdenie skutočne opiera, pretože každé má iného vlastníka a iný spôsob zlyhania.
Súhlas prichádza cez systémovú aktivitu
VpnService.prepare() nič neudeľuje. Vracia intent systémovej aktivite pre súhlas, keď súhlas chýba, a aplikácia tento dialóg spustí, aby používateľ službu schválil. Spustenie vlastného procesu aplikácie, pridanie oprávnenia do manifestu alebo zobrazenie vlastnej obrazovky „zapnúť VPN“ oprávnenie nevytvára.
Oprávnenie má aj obmedzený rozsah. Patrí balíku v používateľskom profile, takže osobná a pracovná kópia sú samostatné rozhodnutia a vlastník zariadenia môže spravovaný profil pripraviť inak než osobný. Ak sa dialóg nikdy neobjaví a prepare() vráti null, súhlas pre tento balík v tomto profile už existuje; nie je to dôkaz, že aplikácia je dôveryhodná, iba že oprávnenie existuje.
Rozhranie je požiadavka, ktorú systém splní
Po súhlase aplikácia opisuje, čo chce, pomocou VpnService.Builder: adresy, trasy, servery DNS, MTU a tam, kde je to podporované, aplikácie na zahrnutie alebo vylúčenie. establish() požiada systém o vytvorenie tunelového rozhrania a smerovanie zodpovedajúcej prevádzky doň. Rozhodnutie o smerovaní vlastní systém; aplikácia dostane deskriptor súboru a potom musí s paketmi urobiť niečo užitočné.
| What you observe | Who actually owns it |
|---|---|
| VPN consent dialog | The system, triggered by prepare() |
| Routes, DNS and app lists | The app requests them; the system applies them |
| One active VPN per profile | The platform; a new service replaces the old one |
| Always-on and block-without-VPN | Device policy enforced by the platform |
Táto tabuľka je architektúra na jednom mieste. Aplikácia sa zúčastňuje spracovania paketov; nevlastní rozhranie, smerovaciu tabuľku ani počet služieb, ktoré môžu bežať.
Tunelový socket musí uniknúť zo svojho vlastného tunela
Spojenie, ktoré prenáša šifrovanú prevádzku, je samo socket. Ak sa smeruje späť do rozhrania, ktoré aplikácia práve vytvorila, tunel závisí od tunela a zastaví sa. VpnService.protect() pripúta tento socket k podkladovej sieti, aby obišiel zachytávanie, a preto správny klient chráni svoj vonkajší socket pred prvým handshake.
adb shell dumpsys connectivity | grep -i -A5 vpn
adb shell settings get global always_on_vpn_app
adb shell settings get global always_on_vpn_lockdown
Tieto príkazy zobrazujú nainštalovanú sieť VPN, balík trvalého zapnutia a či je nastavené blokovanie. Sú to pozorovania iba na čítanie: ak sa hodnoty nezhodujú s tým, čo tvrdí návrh, tvrdenie sa týka rozhrania aplikácie, nie stavu systému.
Blokovanie môže patriť platforme
Android dokumentuje politiku, ktorá blokuje pripojenia nepoužívajúce VPN. To vynucovanie je zmluvou platformy, nie aplikáciou, ktorá v slučke opakuje pokusy o pripojenie. Prepínač je v nastaveniach VPN zariadenia ako Blokovať pripojenia bez VPN a na spravovanom zariadení ho vlastník môže zapnúť pre celý profil. Rozdiel je dôležitý pri hodnotení marketingového tvrdenia: klient môže zobraziť ikonu zámku a agresívne sa znova pripájať, pričom priama prevádzka je stále možná, alebo pokryté aplikácie môžu zostať offline, pretože systém vynucuje blokovanie.
Ikonu zámku kreslí aplikácia, takže dokazuje len to, že aplikácia verí, že je pripojená. Či iná aplikácia stratí prístup k sieti, rozhoduje platforma, preto je užitočnou kontrolou sledovať, ako táto aplikácia zlyháva, kým je tunel aktívny.
Ani štítok „vždy zapnuté“ z obchodu s aplikáciami túto zmluvu nenahrádza. Trvalé zapnutie a blokovanie sú nastavenia zariadenia, ktoré často uplatňuje vlastník, a ich správanie pre vylúčené aplikácie určuje platforma. Čítajte nastavenie, nie odznak.
Štyri otázky pre recenziu návrhu
Po prvé, kto dal súhlas: ktorý balík, ktorý profil a bol to používateľ alebo politika spravovaného zariadenia? Po druhé, čo aplikácia požadovala: ktoré trasy, ktoré rodiny adries, ktoré zahrnuté alebo vylúčené aplikácie? Po tretie, čo sa stane, keď tunel nie je dostupný: blokuje systém alebo prevádzka prepadne do podkladovej siete? Po štvrté, čo aplikácia robí s paketmi, ktoré prijme?
Štvrtá otázka je tá, na ktorú model oprávnení nevie odpovedať. Súhlas a rozhranie TUN dokazujú, že aplikácia môže prijímať prevádzku, nie že ju šifruje, autentifikuje protistranu alebo sa čisto zotaví. To sú vlastnosti implementácie a práve tam poctivá recenzia trávi čas.
Nepotrebná žiadosť o root sa nestane legitímnou tým, že sa výsledok nazve kill switch, a dialóg súhlasu nie je bezpečnostný audit. Držte tri oprávnenia oddelene a každé tvrdenie sa stane overiteľným.