Na Androidu 10 i novijem aplikacija koja otvori /proc/net/tcp dobija odbijen pristup umesto tabele soketa. VPN interfejs to ne zanima: paketi i dalje stižu, jer je tunel odluka o rutiranju, a ne dozvola za datoteku. Promenio se odgovor na uže pitanje: „koja aplikacija poseduje ovu vezu?“ Zamena 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

Pre API 29 privilegovani ili root proces mogao je da čita kernelove tabele soketa, upari četvorku i sazna 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 soketa i udaljenu adresu soketa. „Lokalno“ znači stranu aplikacije u vezi, a ne onaj kraj koji se u trenutku provere 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 smeru najčešći je razlog zašto ispravan upit vrati pogrešan odgovor ili nikakav. Zabeležite oba kraja pre poziva i proverite 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šćenje i nepoznati rezultati deo su ugovora

Upit je ograničen na ovlašćene pozivaoce, uključujući aktivnu VPN aplikaciju za odgovarajućeg korisnika. Nepovezana aplikacija za nadzor ne može da pretpostavi da može da nabroji veze drugog profila, a neovlašćeni poziv može da baci sigurnosni izuzetak umesto prijatne greške. Oba ishoda reš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 uspešnog odgovora i njegovo kasnije korišćenje pripisuje novu vezu staroj aplikaciji, što je gore od prijave nepoznatog.

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

Obračun je drugo pitanje

NetworkStatsManager izveštava o potrošnji po sopstvenim pravilima pristupa. Može vam reći koliko je UID preneo u periodu; ne može reći vlasnika proizvoljnog živog paketa. Mrežne mogućnosti opisuju svojstva mreže, ne imenik soketa. Mešanje troje daje table koje izgledaju dosledno 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 rešava smer, dozvole i nepoznata stanja.

Izaberite alat prema poslu, pa testirajte ivice

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

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

Povezani članci