A root nem az, ami lehetővé teszi egy Android VPN-alkalmazásnak, hogy forgalmat vigyen, szivárgásokat blokkoljon vagy túléljen egy újraindítást. Az emberek ezt mind úgy foglalják össze, hogy „az alkalmazásnak van VPN-engedélye“, ami három külön mechanizmust rejt el: a felhasználó által adott hozzájárulást, a rendszer által létrehozott csomaginterfészt és a platform blokkolási házirendjét, amelyet nem az alkalmazás határoz meg. Egy Android VPN-terv átvizsgálása azt jelenti, hogy megkérdezzük, melyikre támaszkodik valójában egy állítás, mert mindegyiknek más a tulajdonosa és más a hibamódja.

A hozzájárulás rendszertevékenységen keresztül érkezik

VpnService.prepare() semmit nem ad. Intentet ad vissza a rendszer hozzájárulási tevékenységének, amikor hiányzik a hozzájárulás, és az alkalmazás elindítja ezt a párbeszédablakot, hogy a felhasználó jóváhagyja a szolgáltatást. Az alkalmazás saját folyamatának elindítása, engedély hozzáadása a manifesthez vagy egyéni „VPN engedélyezése“ képernyő megjelenítése nem hozza létre az engedélyt.

Az engedély hatóköre is korlátozott. Egy felhasználói profilban lévő csomaghoz tartozik, így a személyes példány és a munkapéldány külön döntés, és az eszköz tulajdonosa a felügyelt profilt másképp készítheti elő, mint a személyest. Ha a párbeszédablak soha nem jelenik meg, és a prepare() null értéket ad vissza, a hozzájárulás már létezik ehhez a csomaghoz abban a profilban; ez nem bizonyítja, hogy az alkalmazás megbízható, csak azt, hogy az engedély rendben van.

Az interfész egy kérés, amelyet a rendszer teljesít

A hozzájárulás után az alkalmazás a VpnService.Builder segítségével írja le, mit akar: címeket, útvonalakat, DNS-kiszolgálókat, MTU-t és ahol támogatott, a belefoglalandó vagy kizárandó alkalmazásokat. A establish() arra kéri a rendszert, hogy hozza létre az alagút-interfészt, és irányítsa bele a megfelelő forgalmat. Az útválasztási döntés a rendszeré; az alkalmazás megkapja a fájlleírót, és utána valami hasznosat kell tennie a csomagokkal.

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

Ez a táblázat az architektúra egy helyen. Az alkalmazás részt vesz a csomagkezelésben; nem birtokolja az interfészt, az útválasztási táblázatot vagy a futtatható szolgáltatások számát.

Az alagút socketjének ki kell menekülnie a saját alagútjából

A titkosított forgalmat vivő kapcsolat maga is socket. Ha visszairányítják abba az interfészbe, amelyet az alkalmazás éppen létrehozott, az alagút az alagúttól függ, és megakad. A VpnService.protect() ehhez a sockethez köti a mögöttes hálózatot, hogy megkerülje az elfogást, és ezért egy helyes kliens még az első kézfogás előtt megvédi a külső socketjét.

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

Ezek a parancsok a telepített VPN-hálózatot, az always-on csomagot és a zárolás beállítását mutatják. Csak olvasható megfigyelések: ha az értékek nem egyeznek azzal, amit a terv állít, az állítás az alkalmazás felületéről szól, nem a rendszer állapotáról.

A blokkolás a platformé lehet

Az Android dokumentál egy házirendet, amely blokkolja azokat a kapcsolatokat, amelyek nem használják a VPN-t. Ez a kényszerítés platformszerződés, nem pedig egy alkalmazás, amely ciklusban újrapróbálja a kapcsolatokat. A kapcsoló az eszköz VPN-beállításaiban található VPN nélküli kapcsolatok blokkolása néven, felügyelt eszközön pedig a tulajdonos az egész profilra bekapcsolhatja. A megkülönböztetés akkor számít, amikor egy marketingállítást értékel: a kliens mutathat lakatikont és agresszíven újracsatlakozhat, miközben a közvetlen forgalom továbbra is lehetséges, vagy a lefedett alkalmazások offline maradhatnak, mert a rendszer érvényesíti a zárolást.

A lakatikont az alkalmazás rajzolja, tehát csak azt bizonyítja, hogy az alkalmazás úgy hiszi, csatlakozva van. Hogy egy másik alkalmazás elveszíti-e a hálózati hozzáférést, azt a platform dönti el, ezért a hasznos ellenőrzés annak megfigyelése, hogy az az alkalmazás meghiúsul, miközben az alagút aktív.

Az alkalmazásbolt „mindig bekapcsolva“ címkéje sem helyettesíti ezt a szerződést. Az always-on és a zárolás eszközbeállítások, amelyeket gyakran az eszköz tulajdonosa alkalmaz, és a kizárt alkalmazásokra vonatkozó viselkedésüket a platform határozza meg. A beállítást olvassa, ne a jelvényt.

Négy kérdés egy tervátvizsgáláshoz

Először, ki adott hozzájárulást: melyik csomag, melyik profil, és a felhasználó vagy egy felügyelt eszköz házirendje volt-e? Másodszor, mit kért az alkalmazás: mely útvonalakat, mely címcsaládokat, mely belefoglalt vagy kizárt alkalmazásokat? Harmadszor, mi történik, ha az alagút nem elérhető: blokkol a rendszer, vagy a forgalom visszaesik a mögöttes hálózatra? Negyedszer, mit tesz az alkalmazás a fogadott csomagokkal?

A negyedik kérdés az, amelyre az engedélymodell nem tud válaszolni. A hozzájárulás és a TUN interfész bizonyítja, hogy az alkalmazás fogadhat forgalmat, nem azt, hogy titkosítja, hitelesíti a partnert vagy tisztán helyreáll. Ezek megvalósítási tulajdonságok, és egy őszinte átvizsgálás itt tölti az idejét.

A fölösleges root-kérés nem válik jogszerűvé azzal, hogy az eredményt kill switchnek nevezik, és a hozzájárulási párbeszédablak nem biztonsági audit. Tartsa külön a három engedélyt, és minden állítás ellenőrizhetővé válik.

Kapcsolódó cikkek