Na Androidu 10 i novijim aplikacija koja otvori /proc/net/tcp dobija odbijen pristup umjesto tablice socketa. VPN interfejs to ne zanima: paketi i dalje stižu, jer je tunel odluka o rutiranju, a ne dozvola za datoteku. Promijenio se odgovor na uže pitanje: „koja aplikacija posjeduje ovu vezu?“ Zamjena je ConnectivityManager.getConnectionOwnerUid, podržani upit po vezi, a izbor između stare navike i novog API-ja zavisi od toga koji od tri posla zapravo imate: primanje paketa, atribuciju toka ili sabiranje potrošnje.

Dva načina da odgovorite na pitanje o vlasniku

Prije API 29 privilegovani ili root proces mogao je čitati kernelove tablice socketa, upariti četvorku i saznati UID vlasnika. To je davalo inventar na nivou uređaja u jednoj datoteci. Od API 29 prikaz datotečnog sistema je ograničen, a podržani put je upit po vezi sa protokolom, lokalnom adresom i udaljenom adresom.

QuestionLegacy socket tablesgetConnectionOwnerUid
Who owns this flow?Scan and match the tupleAsk once per tuple
Device-wide inventory?Yes, when readableNo, one flow at a time
Historical usage?NoNo; that is NetworkStatsManager
Works without root?No on modern releasesYes, for authorized callers

Poređenje nije „staro protiv novog“. To su tri različita posla koja je nekad zadovoljavala jedna čitljiva datoteka, a sada ih zadovoljavaju tri različita interfejsa sa tri različita ugovora.

Lokalna adresa je krajnja tačka aplikacije

Potpis metode prima protokol, lokalnu adresu socketa i udaljenu adresu socketa. „Lokalno“ znači stranu aplikacije u vezi, a ne onaj kraj koji se u trenutku provjere slučajno nađe kao izvor paketa. Paket koji putuje od udaljenog servera nazad ka aplikaciji ima izvor i odredište obrnute u odnosu na tu definiciju.

ConnectivityManager cm = getSystemService(ConnectivityManager.class);
int uid = cm.getConnectionOwnerUid(
    OsConstants.IPPROTO_TCP, appLocalAddress, appRemoteAddress);

Ta greška u smjeru najčešći je razlog zašto ispravan upit vrati pogrešan odgovor ili nikakav. Zabilježite oba kraja prije poziva i provjerite par prema vezi koju je aplikacija zaista otvorila. Porodica adresa je takođe važna: adresa predstavljena kroz IPv4 i izvorna IPv6 adresa su različite četvorke, kao i TCP i UDP tokovi na istim portovima.

Ovlaštenje i nepoznati rezultati dio su ugovora

Upit je ograničen na ovlaštene pozivaoce, uključujući aktivnu VPN aplikaciju za odgovarajućeg korisnika. Nepovezana aplikacija za nadzor ne može pretpostaviti da može nabrojati veze drugog profila, a neovlašten poziv može baciti sigurnosni izuzetak umjesto prijazne greške. Oba ishoda rješavajte eksplicitno.

Nedostajući vlasnik nije naziv paketa. Tok se mogao zatvoriti između paketa i upita, četvorka može biti nepotpuna ili pozivaocu jednostavno nije dozvoljeno da zna. Keširanje prvog uspješnog odgovora i njegovo kasnije korištenje pripisuje novu vezu staroj aplikaciji, što je gore od prijave nepoznatog.

Kada atribucija ne uspije, saobraćaj i dalje traži odluku: blokirajte ga gdje politika to zahtijeva, dozvolite samo obim koji razumijete ili pokažite prazninu. Taj rezervni put pripada dizajnu, ne komentaru.

Obračun je drugo pitanje

NetworkStatsManager izvještava o potrošnji po vlastitim pravilima pristupa. Može vam reći koliko je UID prenio u periodu; ne može reći vlasnika proizvoljnog živog paketa. Mrežne mogućnosti opisuju svojstva mreže, ne imenik socketa. Miješanje troje daje table koje izgledaju dosljedno i nisu.

Za jednostavan slučaj odlučivanja koje aplikacije koriste tunel, podržane liste dozvoljenih i zabranjenih aplikacija na Androidu već izražavaju politiku bez ikakvog struganja. Sačuvajte atribuciju po toku za slučajeve kojima zaista treba, i planirajte budžet za održavanu implementaciju koja zajedno rješava smjer, dozvole i nepoznata stanja.

Odaberite alat prema poslu, pa testirajte ivice

Ako je zahtjev odabir tunela, koristite listu platforme. Ako je riječ o atribuciji uživo, koristite upit vlasnika i svaku četvorku bez odgovora tretirajte kao nepoznatu. Ako su historijski zbrojevi, koristite stats API. Zatim testirajte tri ivice koje lome naivne implementacije: paket u obrnutom smjeru, tok koji se zatvori prije upita i pozivaoca koji nije aktivni VPN.

Ništa od ovoga ne zahtijeva isključivanje SELinuxa, root telefona ili globalno čitljive kernel tablice. Ograničenje je poenta: platforma je premjestila atribuciju iza ugovora kako bi odgovor bio dostupan komponenti kojoj legitimno treba, i nikome drugom.

Povezani članci