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 observeWho actually owns it
VPN consent dialogThe system, triggered by prepare()
Routes, DNS and app listsThe app requests them; the system applies them
One active VPN per profileThe platform; a new service replaces the old one
Always-on and block-without-VPNDevice 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.

Seotud artiklid