Root ne estas tio, kio ebligas al Android-VPN-aplikaĵo porti trafikon, bloki likojn aŭ postvivi restarigon. Homoj resumas ĉion ĉi kiel „la aplikaĵo havas VPN-permeson“, kio kaŝas tri apartajn mekanismojn: konsenton donitan de la uzanto, paketan interfacon, kiun la sistemo starigas, kaj blokadan politikon de la platformo, kiun ne la aplikaĵo difinas. Revizii Android-VPN-dezajnon signifas demandi, sur kiu el la tri aserto efektive apogiĝas, ĉar ĉiu havas alian posedanton kaj alian fiaskmanieron.

Konsento alvenas per sistema agado

VpnService.prepare() donas nenion. Ĝi redonas intenton al la sistema konsenta agado kiam mankas konsento, kaj la aplikaĵo lanĉas tiun dialogon por ke la uzanto aprobu la servon. Lanĉi la propran procezon de la aplikaĵo, aldoni permeson al la manifestaĵo aŭ montri propran ekranon „ŝalti VPN“ ne kreas la permeson.

La permeso ankaŭ estas limigita. Ĝi apartenas al pako en uzantprofilo, do la persona kopio kaj la labora kopio estas apartaj decidoj, kaj posedanto de aparato povas prepari administritan profilon alie ol personan. Se la dialogo neniam aperas kaj prepare() redonas null, konsento jam ekzistas por tiu pako en tiu profilo; tio ne pruvas, ke la aplikaĵo estas fidinda, nur ke la permeso ekzistas.

La interfaco estas peto, kiun la sistemo plenumas

Post konsento, la aplikaĵo priskribas, kion ĝi volas per VpnService.Builder: adresoj, vojoj, DNS-serviloj, MTU kaj, kie subtenate, la aplikaĵoj enmetotaj aŭ ekskludotaj. establish() petas al la sistemo krei la tunelan interfacon kaj enigi la konforman trafikon en ĝin. La sistemo posedas la enkursigan decidon; la aplikaĵo ricevas la dosierpriskribilon kaj poste devas fari ion utilan kun la pakaĵoj.

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

Tiu tabelo estas la arkitekturo en unu loko. La aplikaĵo partoprenas en pakaĵa traktado; ĝi ne posedas la interfacon, la enkursigan tabelon aŭ la nombron de servoj, kiuj rajtas funkcii.

La tunela ingo devas eskapi el sia propra tunelo

La konekto, kiu portas la ĉifritan trafikon, mem estas ingo. Se ĝi estas enkursigita reen en la interfacon, kiun la aplikaĵo ĵus kreis, la tunelo dependas de la tunelo kaj haltas. VpnService.protect() ligas tiun ingon al la suba reto por ke ĝi preterpasu la kaptadon, kaj tial ĝusta kliento protektas sian eksteran ingon antaŭ la unua manpremo.

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

Tiuj komandoj montras la instalitan VPN-reton, la pakon de ĉiam-ŝalta kaj ĉu la ŝloso estas agordita. Ili estas nur-legeblaj observoj: se la valoroj ne kongruas kun tio, kion la dezajno asertas, la aserto koncernas la interfacon de la aplikaĵo, ne la staton de la sistemo.

Blokado povas aparteni al la platformo

Android dokumentas politikon, kiu blokas konektojn ne uzantajn la VPN. Tiu plenumado estas platforma kontrakto, ne aplikaĵo, kiu en buklo ripetas konektprovojn. La ŝaltilo troviĝas en la VPN-agordoj de la aparato kiel Bloki konektojn sen VPN, kaj sur administrita aparato la posedanto povas ŝalti ĝin por la tuta profilo. La distingo gravas, kiam vi taksas merkatan aserton: kliento povas montri ŝlosilan ikonon kaj agreseme rekonekti dum rekta trafiko ankoraŭ eblas, aŭ kovritaj aplikaĵoj povas resti eksterrete ĉar la sistemo plenumas la ŝlosadon.

La ŝlosilan ikonon desegnas la aplikaĵo, do ĝi pruvas nur, ke la aplikaĵo kredas esti konektita. Ĉu alia aplikaĵo perdas sian retaliron decidas la platformo, do la utila kontrolo estas vidi tiun aplikaĵon fiaski dum la tunelo funkcias.

Ankaŭ la etikedo „ĉiam ŝaltita“ el la aplikaĵejo ne anstataŭas tiun kontrakton. Ĉiam-ŝalta kaj ŝlosado estas aparataj agordoj, ofte aplikataj de aparata posedanto, kaj ilian konduton por ekskluditaj aplikaĵoj difinas la platformo. Legu la agordon, ne la insignon.

Kvar demandoj por dezajna revizio

Unue, kiu konsentis: kiu pako, kiu profilo, kaj ĉu ĝi estis la uzanto aŭ administrita-aparata politiko? Due, kion la aplikaĵo petis: kiujn vojojn, kiujn adresfamiliojn, kiujn enmetitajn aŭ ekskluditajn aplikaĵojn? Trie, kio okazas kiam la tunelo ne disponeblas: ĉu la sistemo blokas, aŭ ĉu trafiko refalas al la suba reto? Kvare, kion la aplikaĵo faras kun la pakaĵoj, kiujn ĝi ricevas?

La kvara demando estas tiu, kiun la permesa modelo ne povas respondi. Konsento kaj TUN-interfaco pruvas, ke la aplikaĵo povas ricevi trafikon, ne ke ĝi ĉifras ĝin, aŭtentigas samtavolanon aŭ resaniĝas pure. Tiuj estas efektivigaj ecoj, kaj tie honesta revizio pasigas sian tempon.

Nenecesa root-peto ne fariĝas legitima per nomado de la rezulto mortigilo, kaj konsenta dialogo ne estas sekureca revizio. Tenu la tri permesojn aparte kaj ĉiu aserto fariĝas kontrolebla.

Rilataj artikoloj