Root ni tisto, kar omogoča aplikaciji VPN za Android, da prenaša promet, blokira uhajanja ali preživi ponovni zagon. Ljudje vse to strnejo v „aplikacija ima dovoljenje VPN“, kar skrije tri ločene mehanizme: soglasje uporabnika, paketni vmesnik, ki ga sistem vzpostavi, in politiko blokiranja platforme, ki je aplikacija ne določa. Pregledovati zasnovo VPN za Android pomeni vprašati, na katero od treh se trditev v resnici opira, ker ima vsaka drugega lastnika in drugačen način odpovedi.

Soglasje pride prek sistemske dejavnosti

VpnService.prepare() ne podeli ničesar. Vrne intent sistemski dejavnosti za soglasje, ko soglasja ni, in aplikacija odpre ta dialog, da uporabnik odobri storitev. Zagon lastnega procesa aplikacije, dodajanje dovoljenja v manifest ali prikaz lastnega zaslona „omogoči VPN“ ne ustvari dovoljenja.

Dovoljenje je tudi omejeno. Pripada paketu v uporabniškem profilu, zato sta osebna in delovna kopija ločeni odločitvi, lastnik naprave pa lahko upravljani profil pripravi drugače kot osebnega. Če se dialog nikoli ne pojavi in prepare() vrne null, soglasje za ta paket v tem profilu že obstaja; to ni dokaz, da je aplikacija zanesljiva, le da je dovoljenje na mestu.

Vmesnik je zahteva, ki jo sistem izpolni

Po soglasju aplikacija opiše, kaj želi, z VpnService.Builder: naslove, poti, strežnike DNS, MTU in, kjer je podprto, aplikacije za vključitev ali izključitev. establish() prosi sistem, naj ustvari vmesnik predora in vanj usmeri ustrezni promet. Odločitev o usmerjanju ima sistem; aplikacija prejme deskriptor datoteke in mora nato s paketi narediti nekaj koristnega.

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

Ta tabela je arhitektura na enem mestu. Aplikacija sodeluje pri obdelavi paketov; ne poseduje vmesnika, usmerjevalne tabele ali števila storitev, ki smejo teči.

Vtičnica predora mora pobegniti iz lastnega predora

Povezava, ki prenaša šifriran promet, je sama vtičnica. Če se usmeri nazaj v vmesnik, ki ga je aplikacija pravkar ustvarila, je predor odvisen od predora in se ustavi. VpnService.protect() to vtičnico priveže na spodnje omrežje, da obide zajem, zato pravilen odjemalec zaščiti svojo zunanjo vtičnico pred prvim rokovanjem.

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

Ti ukazi prikažejo nameščeno omrežje VPN, paket stalnega vklopa in ali je blokiranje nastavljeno. To so opažanja samo za branje: če se vrednosti ne ujemajo s tem, kar trdi zasnova, se trditev nanaša na vmesnik aplikacije in ne na stanje sistema.

Blokiranje lahko pripada platformi

Android dokumentira politiko, ki blokira povezave, ki ne uporabljajo VPN. To izvajanje je pogodba platforme, ne aplikacija, ki v zanki znova poskuša povezave. Stikalo je v nastavitvah VPN naprave kot Blokiraj povezave brez VPN, na upravljani napravi pa ga lastnik lahko vklopi za celoten profil. Razlika je pomembna pri ocenjevanju marketinške trditve: odjemalec lahko prikaže ikono ključavnice in se agresivno znova povezuje, medtem ko je neposredni promet še vedno mogoč, ali pa zajete aplikacije ostanejo brez povezave, ker sistem izvaja blokiranje.

Ikono ključavnice nariše aplikacija, zato dokazuje le, da aplikacija verjame, da je povezana. Ali bo druga aplikacija izgubila omrežni dostop, odloči platforma, zato je koristen pregled opazovati, kako ta aplikacija ne uspe, medtem ko je predor aktiven.

Tudi oznaka „vedno vklopljeno“ iz trgovine z aplikacijami ne nadomesti te pogodbe. Stalni vklop in blokiranje sta nastavitvi naprave, ki ju pogosto uporabi lastnik, njuno vedenje za izvzete aplikacije pa določi platforma. Berite nastavitev, ne značke.

Štiri vprašanja za pregled zasnove

Prvič, kdo je dal soglasje: kateri paket, kateri profil in ali je bil uporabnik ali politika upravljane naprave? Drugič, kaj je aplikacija zahtevala: katere poti, katere družine naslovov, katere vključene ali izvzete aplikacije? Tretjič, kaj se zgodi, ko predor ni na voljo: sistem blokira ali promet pade nazaj v spodnje omrežje? Četrtič, kaj aplikacija naredi s prejetimi paketi?

Četrto vprašanje je tisto, na katero model dovoljenj ne more odgovoriti. Soglasje in vmesnik TUN dokazujeta, da lahko aplikacija sprejema promet, ne pa da ga šifrira, overi nasprotno stran ali se čisto obnovi. To so lastnosti izvedbe in tam pošten pregled preživi svoj čas.

Nepotrebna zahteva za root ne postane zakonita, če se rezultat imenuje izklopno stikalo, in dialog soglasja ni varnostna revizija. Tri dovoljenja imejte ločena in vsaka trditev postane preverljiva.

Sorodni članki