Android VPN bez roota: kome pripadaju pristanak, rute i blokiranje
Pristanak, TUN interfejs i sistemska politika blokiranja tri su različita odobrenja. Pratite koji komponent posjeduje svako od njih prije nego što pregledate Android VPN aplikaciju.
Root nije ono što omogućava Android VPN aplikaciji da prenosi saobraćaj, blokira curenja ili preživi restart. Ljudi sve to sažimaju u „aplikacija ima VPN dozvolu“, što skriva tri odvojena mehanizma: pristanak koji daje korisnik, paketni interfejs koji sistem uspostavlja i platformsku politiku blokiranja koju aplikacija ne definiše. Pregledati dizajn Android VPN-a znači pitati na koje se od ta tri zaista oslanja neka tvrdnja, jer svako ima drugog vlasnika i drugi način kvara.
Pristanak dolazi kroz sistemsku aktivnost
VpnService.prepare() ne daje ništa. On vraća intent sistemskoj aktivnosti za pristanak kada pristanak nedostaje, a aplikacija pokreće taj dijalog kako bi korisnik odobrio uslugu. Pokretanje vlastitog procesa aplikacije, dodavanje dozvole u manifest ili prikaz vlastitog ekrana „omogući VPN“ ne stvara odobrenje.
Odobrenje je i ograničenog obima. Pripada paketu u korisničkom profilu, pa su lična kopija i radna kopija odvojene odluke, a vlasnik uređaja može pripremiti upravljani profil drugačije od ličnog. Ako se dijalog nikad ne pojavi i prepare() vrati null, pristanak već postoji za taj paket u tom profilu; to nije dokaz da je aplikacija pouzdana, samo da je odobrenje na mjestu.
Interfejs je zahtjev koji sistem ispunjava
Nakon pristanka aplikacija opisuje šta želi pomoću VpnService.Builder: adrese, rute, DNS servere, MTU i, gdje je podržano, aplikacije koje treba uključiti ili isključiti. establish() traži od sistema da stvori tunelski interfejs i usmjeri odgovarajući saobraćaj u njega. Sistem posjeduje odluku o rutiranju; aplikacija dobija deskriptor datoteke i zatim mora učiniti nešto korisno s paketima.
| 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 |
Ta tabela je arhitektura na jednom mjestu. Aplikacija učestvuje u obradi paketa; ne posjeduje interfejs, tabelu rutiranja ni broj usluga koje smiju raditi.
Tunelski socket mora pobjeći iz vlastitog tunela
Veza koja prenosi šifrovani saobraćaj i sama je socket. Ako se usmjeri natrag u interfejs koji je aplikacija upravo stvorila, tunel zavisi od tunela i staje. VpnService.protect() veže taj socket za donju mrežu tako da zaobiđe hvatanje, i zato ispravan klijent štiti svoj vanjski socket prije prvog rukovanja.
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
Ove komande prikazuju instaliranu VPN mrežu, paket za stalno uključeno stanje i da li je zaključavanje postavljeno. To su zapažanja samo za čitanje: ako se vrijednosti ne poklapaju s onim što dizajn tvrdi, tvrdnja se odnosi na interfejs aplikacije, a ne na stanje sistema.
Blokiranje može pripadati platformi
Android dokumentuje politiku koja blokira veze koje ne koriste VPN. To provođenje je ugovor platforme, a ne aplikacija koja u petlji ponovo pokušava veze. Prekidač je u VPN postavkama uređaja kao Blokiraj veze bez VPN-a, a na upravljanom uređaju vlasnik ga može uključiti za cijeli profil. Razlika je važna kada procjenjujete marketinšku tvrdnju: klijent može prikazati ikonu katanca i agresivno se ponovo povezivati dok je direktan saobraćaj još moguć, ili pokrivene aplikacije mogu ostati offline jer sistem provodi zaključavanje.
Ikonu katanca crta aplikacija, pa ona dokazuje samo da aplikacija vjeruje da je povezana. O tome da li će druga aplikacija izgubiti mrežni pristup odlučuje platforma, pa je korisna provjera gledati tu aplikaciju kako ne uspijeva dok je tunel aktivan.
Oznaka „stalno uključeno“ iz prodavnice aplikacija takođe ne zamjenjuje taj ugovor. Stalno uključeno i zaključavanje su postavke uređaja, koje često primjenjuje vlasnik uređaja, a njihovo ponašanje za izuzete aplikacije definiše platforma. Čitajte postavku, ne značku.
Četiri pitanja za pregled dizajna
Prvo, ko je dao pristanak: koji paket, koji profil i da li je to bio korisnik ili politika upravljanog uređaja? Drugo, šta je aplikacija zatražila: koje rute, koje porodice adresa, koje uključene ili isključene aplikacije? Treće, šta se dešava kada tunel nije dostupan: da li sistem blokira ili saobraćaj pada natrag na donju mrežu? Četvrto, šta aplikacija radi s paketima koje primi?
Četvrto pitanje je ono na koje model dozvola ne može odgovoriti. Pristanak i TUN interfejs dokazuju da aplikacija može primati saobraćaj, ne da ga šifruje, autentifikuje drugu stranu ili se čisto oporavlja. To su svojstva implementacije i tu iskren pregled troši svoje vrijeme.
Nepotreban zahtjev za root ne postaje legitiman ako se rezultat nazove prekidačem za ubijanje, a dijalog pristanka nije sigurnosni audit. Držite tri odobrenja odvojeno i svaka tvrdnja postaje provjerljiva.