Na telefonu zaženete distribucijo Linuxa pod chroot, v njej namestite odjemalca VPN in lupina sporoči, da je tunel pripravljen. Nato prestavite v brskalnik in promet odide prek mobilnih podatkov, kot da se ni zgodilo nič. Ali obratno: vsaka aplikacija na telefonu izgubi povezljivost, ker je odjemalec nastavil privzeto pot v imenskem prostoru, ki ga Android dejansko uporablja. Oba simptoma izhajata iz istega manjkajočega dela in nobeden ni napaka odjemalca VPN.

Lupina pravi povezano, aplikacije se ne strinjajo

Prvi izid je običajen. Tunel v uporabniškem prostoru, odprt iz chroot, lahko dokonča rokovanje, izpiše statistiko in prenaša promet, ki ga ustvarja ista lupina, medtem ko aplikacije Androida še naprej uporabljajo privzeto omrežje telefona. Nič jih ne prestreže, ker nič ni povedalo Androidu, da VPN obstaja.

Drugi izid je nevaren. Če chroot deli omrežni imenski prostor Androida, kar privzeto počne, lahko proces z dovolj privilegiji doda poti in vmesnik TUN, ki vplivajo na celoten telefon. Takrat tunel deluje za vsako aplikacijo, tudi za tiste, ki jih niste nameravali usmerjati, povezljivost telefona pa je zdaj odvisna od demona brez upravljanja življenjskega cikla, brez kazalnika povezave in brez pravilnika vedno vklopljeno.

Kateri od obeh vam je uspel, je mogoče ugotoviti z enim ukazom. Primerjajte ip route znotraj chroot z istim ukazom iz lupine Android zunaj. Enak izhod pomeni, da je chroot v imenskem prostoru gostitelja: vsaka omrežna sprememba, ki jo naredi, velja za celoten telefon. Različen izhod pomeni, da je zaganjalnik zanj ustvaril imenski prostor in je njegov tunel za Android neviden že po zgradbi.

Kaj je chroot spremenil in kaj ne

ObjectEffect of a chroot
Pathname resolutionChanged: lookups start at the new root
Kernel and driversUnchanged: the phone's kernel, its TUN driver, its limits
Network namespaceUnchanged unless the launcher creates one
Android VPN registrationUnchanged: no app consented, no VPN is selected

Sistemski klic chroot naredi eno stvar: spremeni imenik, ki se uporablja za razreševanje imen poti. Priročnik izrecno pravi, da to ni varnostna meja, in ne pove ničesar o vmesnikih, poteh ali stanju VPN. Vse, kar ljudje pričakujejo od vsebnika Linux — zasebni omrežni sklad, filtriran datotečni sistem, omejitve virov — izhaja iz drugih mehanizmov, ki jih je zaganjalnik morda uporabil ali ne.

Zato trditve, da chroot izolira VPN, običajno odgovarjajo na napačno vprašanje. Relevantno vprašanje je, v katerem imenskem prostoru proces teče in na katero domeno SELinux je omejen, oboje pa sta lastnosti načina zagona, ne besede chroot.

TUN potrebuje tri stvari, vozlišče naprave pa je le ena

Tradicionalni tunel v uporabniškem prostoru potrebuje napravo TUN, ki jo lahko odpre, podporo jedra za to napravo in dovoljenje za nastavitev vmesnika in poti. To so ločene zahteve in ustvarjanje imena poti pod /dev samo po sebi ne izpolni nobene od njih:

ls -l /dev/net/tun
ip tuntap add dev tun0 mode tun

V Androidu ima jedro običajno vgrajeno podporo TUN, ker jo uporablja lastna storitev VPN platforme, vendar to ne pomeni, da jo vaš proces sme uporabljati. Nastavitev vmesnika zahteva zmožnost upravljanja omrežja, SELinux pa odloči, ali lahko proces sploh doseže vozlišče naprave. Zavrnitev je videti kot napaka dovoljenj brez očitnega vzroka, odgovor pa je v revizijskem dnevniku:

dmesg | grep avc
logcat -d | grep "avc: denied"

Root tega ne reši. SELinux omejuje procese, ki tečejo kot uid 0, enako kot druge, zato je lahko chroot, zagnan iz lupine root, še vedno zavrnjen pri napravi, ki jo vidi. Izklop izvajanja, da bi deloval star namestitveni program, je odločitev za celoten telefon s posledicami daleč onkraj tunela in ni popravek zastarele binarne datoteke.

Zakaj aplikacije Androida ignorirajo vaš tunel

Podprti model Androida je aplikacija VPN, ki se registrira prek storitve VPN platforme, enkrat vpraša uporabnika za soglasje in prejme opisnik datoteke za svoj tunel. Platforma nato usmeri promet v ta opisnik in uveljavi obseg aplikacij, ki ga je izbral uporabnik ali skrbnik, zato je isti mehanizem lahko za vsako aplikacijo, za vsak profil in kombiniran z nastavitvami vedno vklopljeno ter blokiranje brez VPN. Vodnik za razvoj VPN v Androidu opisuje to rokovanje in ključno je, da gre za registracijo, ne za trik z usmerjanjem.

Demon znotraj chroot se nikoli ne registrira. Ni pogovornega okna za soglasje, ni ikone ključa v vrstici stanja, ni seznama za vključitev ali izključitev po aplikacijah in ni sodelovanja v pravilniku vedno vklopljeno. Aplikacije zato še naprej uporabljajo privzeto omrežje, tunel pa prenaša le tisto, kar pošlje sama lupina.

Tudi pot v drugo smer ne pomaga. Potiskanje poti v imenski prostor gostitelja zajame vse, tudi promet, za katerega je platforma pričakovala, da ostane lokalen, in to brez nadzora po aplikacijah ter brez možnosti, da bi ga uporabnik videl ali preklical. Ni vmesne nastavitve, kjer bi demon chroot usmerjal promet samo ene aplikacije.

Binarna združljivost je ločen zid

Tudi ko je omrežna stran zanimiva, ima izvršljiva datoteka svoje zahteve: arhitekturo CPU, dinamični nalagalnik, knjižnico C in zmogljivosti jedra, ki jih pričakuje. Android uporablja bionic namesto glibc in stara binarna datoteka, zgrajena za namizno distribucijo, lahko potrebuje knjižnice, ki jih v napravi ni več.

Simbolično povezovanje imena knjižnice na novejšo različico ne ustvari združljivosti ABI, arhivirana kriptografska knjižnica iz paketa, starega desetletje, pa ni vzdrževana komponenta. Če je načrt odvisen od tega, je načrt izvajati nevzdrževano kodo z omrežnimi privilegiji na telefonu.

Dokažite to v kontekstu Androida in pospravite za seboj

Preizkusite tisto, kar vam je res pomembno, s tiste strani, ki šteje: odprite določeno aplikacijo, dosezite določen zasebni cilj, potrdite, kateri razreševalnik je odgovoril, nato prekinite tunel in potrdite dokumentirano vedenje. Rezultat iz terminala znotraj chroot je dokaz le o izvajalnem kontekstu tega terminala in nič več.

Če ste med poskusi spreminjali poti gostitelja, jih vrnite in zapišite, kaj ste spremenili. Nato preverite, ali ima telefon nastavljen VPN vedno vklopljeno, ker je lahko starejši poskus, ki je pustil pravilo, mesece pozneje videti kot okvara platforme.

Za resnično potrebo po oddaljenem dostopu uporabite podprtega odjemalca storitve ali odobreno zasnovo prehoda. Vprašanje, ki ga velja postaviti, ni, ali je mogoče zagnati namestitveni program z rootom, ampak ali podprta izvedba prenese potrebne aplikacije čez načrtovano mejo, ne da bi v napravi pustila privilegirane spremembe brez lastnika.

Sorodni članki