Androidi VPN-i atributsioon: getConnectionOwnerUid vs /proc/net
Android 10 peidab /proc/net rakenduste eest. VPN saab endiselt pakette, kuid atributsioon liigub getConnectionOwnerUid juurde, oma tuple- ja õigusreeglitega.
Android 10 ja uuemates saab rakendus, mis avab /proc/net/tcp, ligipääsu keelu socketite tabeli asemel. VPN-liidesele on see ükskõik: paketid saabuvad endiselt, sest tunnel on marsruutimisotsus, mitte failiõigus. Muutus vastus kitsamale küsimusele: „milline rakendus omab seda ühendust?“ Asendaja on ConnectivityManager.getConnectionOwnerUid, toetatud päring ühenduse kohta, ja valik vana harjumuse ning uue API vahel sõltub sellest, milline kolmest tööst teil tegelikult on: pakettide vastuvõtmine, voo atributsioon või kasutuse liitmine.
Kaks viisi omanikuküsimusele vastata
Enne API 29 võis privileegiline või root-protsess lugeda kerneli socketite tabeleid, sobitada neliku ja teada saada omava UID-i. See andis ühes failis seadmeülest inventari. Alates API 29 on failisüsteemi vaade piiratud ja toetatud tee on päring ühenduse kohta koos protokolli, kohaliku aadressi ja kaugema aadressiga.
| Question | Legacy socket tables | getConnectionOwnerUid |
|---|---|---|
| Who owns this flow? | Scan and match the tuple | Ask once per tuple |
| Device-wide inventory? | Yes, when readable | No, one flow at a time |
| Historical usage? | No | No; that is NetworkStatsManager |
| Works without root? | No on modern releases | Yes, for authorized callers |
Võrdlus ei ole „vana versus uus“. Need on kolm erinevat tööd, mida varem rahuldas üks loetav fail ja nüüd rahuldavad kolm erinevat liidest kolme erineva lepinguga.
Kohalik aadress on rakenduse otspunkt
Meetodi signatuur võtab protokolli, kohaliku socketi aadressi ja kaugema socketi aadressi. „Kohalik“ tähendab rakenduse poolt ühenduses, mitte seda otspunkti, mis kontrollimise hetkel juhtub olema paketi allikas. Kaugserverist rakendusse tagasi liikuv pakett on selle määratluse suhtes allika ja sihtkoha osas ümberpööratud.
ConnectivityManager cm = getSystemService(ConnectivityManager.class);
int uid = cm.getConnectionOwnerUid(
OsConstants.IPPROTO_TCP, appLocalAddress, appRemoteAddress);See suunaviga on kõige tavalisem põhjus, miks töötav päring annab vale vastuse või üldse mitte. Logige mõlemad otspunktid enne kutset ja kinnitage paar ühendusega, mille rakendus tegelikult avas. Aadressipere loeb samuti: IPv4 kaudu kaardistatud aadress ja natiivne IPv6 aadress on erinevad nelikud, nagu ka TCP ja UDP vood samadel portidel.
Volitamine ja tundmatud tulemused on lepingu osa
Päring on piiratud volitatud kutsujatega, sealhulgas asjaomase kasutaja aktiivse VPN-rakendusega. Sõltumatu jälgimisrakendus ei saa eeldada, et saab teise profiili ühendusi loendada, ja volitamata kutse võib visata turvaeerandi, selle asemel et tagastada sõbralik viga. Käsitlege mõlemat tulemust selgesõnaliselt.
Puuduv omanik ei ole paketi nimi. Voog võis sulguda paketi ja päringu vahel, nelik võib olla puudulik või kutsujal lihtsalt ei ole lubatud teada. Esimese õnnestunud vastuse vahemällu salvestamine ja hilisem korduskasutus omistab uue ühenduse vanale rakendusele, mis on halvem kui teatada tundmatust.
Kui atributsioon ebaõnnestub, vajab liiklus ikkagi otsust: blokeerige see, kus poliitika seda nõuab, lubage ainult ulatust, millest aru saate, või näidake lünka. See varuvariant kuulub disaini, mitte kommentaari.
Arvestus on teine küsimus
NetworkStatsManager raporteerib kasutust oma juurdepääsureeglite järgi. See võib öelda, kui palju UID perioodi jooksul edastas; see ei saa öelda suvalise elava paketi omanikku. Võrgu võimekused kirjeldavad võrgu omadusi, mitte socketite kataloogi. Kolme segamine annab armatuurlaudu, mis näevad välja järjepidevad ja ei ole seda.
Lihtsal juhul, kui otsustate, millised rakendused tunnelit kasutavad, väljendavad Androidi toetatud lubatud ja keelatud rakenduste loendid poliitikat juba ilma midagi kraapimata. Jätke voopõhine atributsioon juhtudeks, mis seda tõesti vajavad, ja arvestage hooldatava teostusega, mis käsitleb suunda, õigusi ja tundmatuid olekuid koos.
Valige tööriist töö järgi, seejärel testige servi
Kui nõue on tunneli valik, kasutage platvormi loendit. Kui see on reaalajas atributsioon, kasutage omaniku päringut ja käsitlege iga vastamata nelikut tundmatuna. Kui need on ajaloolised summad, kasutage stats API-t. Seejärel testige kolme serva, mis murravad naiivseid teostusi: vastassuunas liikuv pakett, voog, mis sulgub enne päringut, ja kutsuja, kes ei ole aktiivne VPN.
Miski sellest ei nõua SELinuxi väljalülitamist, telefoni rootimist ega kerneli tabelite globaalselt loetavaks muutmist. Piirang ongi mõte: platvorm viis atributsiooni lepingu taha, et vastus oleks saadaval komponendile, kes seda seaduslikult vajab, ja mitte kellelegi teisele.