Android-VPN ilman rootia: kenelle suostumus, reitit ja esto kuuluvat
Suostumus, TUN-rajapinta ja järjestelmän estokäytäntö ovat kolme eri lupaa. Selvitä, mikä komponentti omistaa kunkin, ennen kuin arvioit Android-VPN-sovellusta.
Root ei ole se, mikä mahdollistaa Android-VPN-sovelluksen liikenteen kuljettamisen, vuotojen estämisen tai uudelleenkäynnistyksen yli selviämisen. Ihmiset tiivistävät tämän kaiken muotoon „sovelluksella on VPN-lupa“, mikä kätkee kolme erillistä mekanismia: käyttäjän antaman suostumuksen, järjestelmän luoman pakettirajapinnan ja alustan estokäytännön, jota sovellus ei määrittele. Android-VPN-suunnitelman arvioiminen tarkoittaa kysymistä, mihin kolmesta väite todella nojaa, koska jokaisella on eri omistaja ja eri vikatila.
Suostumus saapuu järjestelmän toiminnon kautta
VpnService.prepare() ei myönnä mitään. Se palauttaa intentin järjestelmän suostumustoiminnolle, kun suostumus puuttuu, ja sovellus käynnistää kyseisen valintaikkunan, jotta käyttäjä voi hyväksyä palvelun. Sovelluksen oman prosessin käynnistäminen, luvan lisääminen manifestiin tai mukautetun „ota VPN käyttöön“ -näkymän näyttäminen ei luo lupaa.
Lupa on myös rajattu. Se kuuluu käyttäjäprofiilin pakettiin, joten henkilökohtainen kopio ja työkopio ovat erillisiä päätöksiä, ja laitteen omistaja voi valmistella hallitun profiilin eri tavalla kuin henkilökohtaisen. Jos valintaikkuna ei koskaan ilmesty ja prepare() palauttaa null, suostumus on jo olemassa kyseiselle paketille kyseisessä profiilissa; se ei todista sovelluksen luotettavuutta, vain sen että lupa on voimassa.
Rajapinta on pyyntö, jonka järjestelmä täyttää
Suostumuksen jälkeen sovellus kuvaa VpnService.Builder:lla, mitä se haluaa: osoitteet, reitit, DNS-palvelimet, MTU ja tuettuna sovellukset, jotka sisällytetään tai jätetään pois. establish() pyytää järjestelmää luomaan tunnelirajapinnan ja ohjaamaan vastaavan liikenteen siihen. Reitityspäätös kuuluu järjestelmälle; sovellus saa tiedostokuvauksen ja sen on sitten tehtävä paketeille jotain hyödyllistä.
| 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 |
Tuo taulukko on arkkitehtuuri yhdessä paikassa. Sovellus osallistuu pakettien käsittelyyn; se ei omista rajapintaa, reititystaulukkoa tai käynnissä olevien palveluiden määrää.
Tunnelin pistokkeen on paettava omasta tunnelistaan
Yhteys, joka kuljettaa salattua liikennettä, on itse pistoke. Jos se reititetään takaisin rajapintaan, jonka sovellus juuri loi, tunneli riippuu tunnelista ja pysähtyy. VpnService.protect() sitoo kyseisen pistokkeen alla olevaan verkkoon, jotta se ohittaa kaappauksen, ja siksi oikea asiakas suojaa ulomman pistokkeensa ennen ensimmäistä kättelyä.
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
Nämä komennot näyttävät asennetun VPN-verkon, aina päällä -paketin ja onko lukitus asetettu. Ne ovat vain lukemiseen tarkoitettuja havaintoja: jos arvot eivät vastaa sitä, mitä suunnitelma väittää, väite koskee sovelluksen käyttöliittymää eikä järjestelmän tilaa.
Esto voi kuulua alustalle
Android dokumentoi käytännön, joka estää yhteydet, jotka eivät käytä VPN:ää. Tämä täytäntöönpano on alustan sopimus, ei sovellus, joka toistaa yhteysyrityksiä silmukassa. Kytkin on laitteen VPN-asetuksissa nimellä Estä yhteydet ilman VPN:ää, ja hallitulla laitteella omistaja voi kytkeä sen päälle koko profiilille. Ero on tärkeä, kun arvioit markkinointiväitettä: asiakas voi näyttää lukkokuvaketta ja yhdistää uudelleen aggressiivisesti, vaikka suora liikenne on yhä mahdollista, tai katetut sovellukset voivat pysyä offline-tilassa, koska järjestelmä valvoo lukitusta.
Lukkokuvakkeen piirtää sovellus, joten se todistaa vain, että sovellus uskoo olevansa yhteydessä. Sen, menettääkö toinen sovellus verkkoyhteytensä, päättää alusta, joten hyödyllinen tarkistus on nähdä kyseisen sovelluksen epäonnistuvan, kun tunneli on päällä.
Sovelluskaupan „aina päällä“ -merkintä ei sekään korvaa tätä sopimusta. Aina päällä ja lukitus ovat laiteasetuksia, usein laitteen omistajan käyttöön ottamia, ja niiden toiminnan poissuljetuille sovelluksille määrittelee alusta. Lue asetus, älä merkkiä.
Neljä kysymystä suunnitelman arviointiin
Ensinnäkin, kuka antoi suostumuksen: mikä paketti, mikä profiili ja oliko kyseessä käyttäjä vai hallitun laitteen käytäntö? Toiseksi, mitä sovellus pyysi: mitkä reitit, mitkä osoiteperheet, mitkä sisällytetyt tai poissuljetut sovellukset? Kolmanneksi, mitä tapahtuu, kun tunneli ei ole käytettävissä: estääkö järjestelmä vai putoaako liikenne alla olevaan verkkoon? Neljänneksi, mitä sovellus tekee vastaanottamilleen paketeille?
Neljäs kysymys on se, johon lupamalli ei voi vastata. Suostumus ja TUN-rajapinta todistavat, että sovellus voi vastaanottaa liikennettä, ei sitä että se salaa sen, todentaa vastapuolen tai palautuu siististi. Ne ovat toteutuksen ominaisuuksia, ja siinä rehellinen arviointi viettää aikansa.
Tarpeeton root-pyyntö ei muutu lailliseksi kutsumalla tulosta kill switchiksi, eikä suostumusvalintaikkuna ole tietoturva-auditointi. Pidä kolme lupaa erillään, niin jokaisesta väitteestä tulee tarkistettava.