Androidi VPN ilma rootita: kellele kuuluvad nõusolek, marsruudid ja blokeerimine
Nõusolek, TUN-liides ja süsteemi blokeerimispoliitika on kolm erinevat luba. Jälgi, milline komponent kumbagi omab, enne kui Androidi VPN-rakendust üle vaatad.
Root ei ole see, mis võimaldab Androidi VPN-rakendusel liiklust kanda, lekkeid blokeerida või taaskäivitust üle elada. Inimesed võtavad selle kõik kokku nii: „rakendusel on VPN-luba“, mis peidab kolm eraldi mehhanismi: kasutaja antud nõusolek, süsteemi loodud paketiliides ja platvormi blokeerimispoliitika, mida rakendus ei määra. Androidi VPN-i disaini ülevaatamine tähendab küsida, millisele neist kolmest väide tegelikult toetub, sest igaühel on erinev omanik ja erinev rikkerežiim.
Nõusolek tuleb süsteemi tegevuse kaudu
VpnService.prepare() ei anna midagi. See tagastab intenti süsteemi nõusolekutegevusele, kui nõusolek puudub, ja rakendus käivitab selle dialoogi, et kasutaja saaks teenuse heaks kiita. Rakenduse enda protsessi käivitamine, manifesti loa lisamine või kohandatud „luba VPN“ ekraani näitamine luba ei loo.
Luba on ka ulatuslikult piiratud. See kuulub kasutajaprofiilis olevale paketile, seega isiklik koopia ja töökoopia on eraldi otsused ning seadme omanik saab hallatavat profiili ette valmistada teisiti kui isiklikku. Kui dialoog ei ilmugi ja prepare() tagastab null, on selle paketi nõusolek selles profiilis juba olemas; see ei tõesta, et rakendus on usaldusväärne, vaid ainult seda, et luba on olemas.
Liides on taotlus, mille süsteem täidab
Pärast nõusolekut kirjeldab rakendus VpnService.Builder abil, mida ta tahab: aadressid, marsruudid, DNS-serverid, MTU ja kus toetatud, kaasatavad või välistatavad rakendused. establish() palub süsteemil luua tunneliliidese ja suunata vastav liiklus sinna. Marsruutimisotsus kuulub süsteemile; rakendus saab failideskriptori ja peab seejärel pakettidega midagi kasulikku tegema.
| 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 |
See tabel on arhitektuur ühes kohas. Rakendus osaleb pakettide töötlemises; talle ei kuulu liides, marsruutimistabel ega jooksutada lubatud teenuste arv.
Tunneli socket peab oma tunnelist välja pääsema
Ühendus, mis kannab krüpteeritud liiklust, on ise socket. Kui see suunatakse tagasi liidesesse, mille rakendus äsja lõi, sõltub tunnel tunnelist ja jääb seisma. VpnService.protect() seob selle socketi alusvõrguga, et see püüdmisest mööda läheks, ja seetõttu kaitseb korrektne klient oma välist socketit enne esimest kätlust.
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
Need käsud näitavad paigaldatud VPN-võrku, alati sisse lülitatud paketti ja seda, kas lukustus on seatud. Need on ainult lugemiseks mõeldud vaatlused: kui väärtused ei vasta sellele, mida disain väidab, puudutab väide rakenduse liidest, mitte süsteemi olekut.
Blokeerimine võib kuuluda platvormile
Android dokumenteerib poliitika, mis blokeerib ühendused, mis VPN-i ei kasuta. See jõustamine on platvormi leping, mitte rakendus, mis kordab ühenduskatseid tsüklis. Lüliti asub seadme VPN-seadetes nimega Blokeeri ühendused ilma VPN-ita, ja hallatavas seadmes saab omanik selle kogu profiili jaoks sisse lülitada. Vahe on oluline turundusväite hindamisel: klient võib näidata lukuikooni ja agressiivselt uuesti ühenduda, samal ajal kui otsene liiklus on endiselt võimalik, või kaetud rakendused võivad jääda võrguühenduseta, sest süsteem rakendab lukustust.
Lukuikooni joonistab rakendus, seega tõestab see ainult, et rakendus usub end olevat ühendatud. Selle, kas mõni teine rakendus kaotab võrguühenduse, otsustab platvorm, seega kasulik kontroll on näha seda rakendust ebaõnnestumas, kui tunnel töötab.
Ka rakendusepoe silt „alati sees“ ei asenda seda lepingut. Alati sees ja lukustus on seadme seaded, mida sageli rakendab seadme omanik, ja nende käitumise välistatud rakenduste puhul määrab platvorm. Loe seadet, mitte märki.
Neli küsimust disainiülevaatuseks
Esiteks, kes nõustus: milline pakett, milline profiil ja kas see oli kasutaja või hallatava seadme poliitika? Teiseks, mida rakendus taotles: millised marsruudid, millised aadressiperekonnad, millised kaasatud või välistatud rakendused? Kolmandaks, mis juhtub, kui tunnel pole saadaval: kas süsteem blokeerib või langeb liiklus tagasi alusvõrku? Neljandaks, mida rakendus saadud pakettidega teeb?
Neljas küsimus on see, millele lubade mudel vastata ei suuda. Nõusolek ja TUN-liides tõestavad, et rakendus saab liiklust vastu võtta, mitte et ta selle krüpteerib, vastaspoole autentib või puhtalt taastub. Need on teostuse omadused ja just seal veedab aus ülevaade oma aja.
Tarbetu root-taotlus ei muutu seaduslikuks sellega, kui tulemust hukkamislülitiks nimetada, ja nõusolekudialoog ei ole turbekontroll. Hoia kolm luba lahus ja iga väide muutub kontrollitavaks.