V Androidu 10 in novejših dobi aplikacija, ki odpre /proc/net/tcp, zavrnitev dostopa namesto tabele socketov. Vmesniku VPN je to vseeno: paketi še vedno prihajajo, ker je tunel odločitev o usmerjanju, ne dovoljenje za datoteko. Spremenil se je odgovor na ožje vprašanje: »katera aplikacija ima to povezavo?« Zamenjava je ConnectivityManager.getConnectionOwnerUid, podprta poizvedba za posamezno povezavo, izbira med staro navado in novim API-jem pa je odvisna od tega, katero od treh opravil v resnici imate: sprejemanje paketov, atribucijo toka ali seštevanje porabe.

Dva načina odgovora na vprašanje o lastniku

Pred API 29 je privilegiran ali root proces lahko bral tabele socketov jedra, uskladil četverico in izvedel UID lastnika. To je dalo popis celotne naprave v eni datoteki. Od API 29 je pogled na datotečni sistem omejen, podprta pot pa je poizvedba za posamezno povezavo s protokolom, lokalnim naslovom in oddaljenim naslovom.

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

Primerjava ni »staro proti novemu«. To so tri različna opravila, ki jih je včasih zadovoljila ena berljiva datoteka, zdaj pa jih zadovoljijo trije različni vmesniki s tremi različnimi pogodbami.

Lokalni naslov je konec aplikacije

Podpis metode sprejme protokol, lokalni naslov socketa in oddaljeni naslov socketa. »Lokalno« pomeni stran aplikacije v povezavi, ne tisti konec, ki je v trenutku pregleda slučajno vir paketa. Paket, ki potuje z oddaljenega strežnika nazaj k aplikaciji, ima vir in cilj glede na to definicijo obrnjena.

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

Ta napaka smeri je najpogostejši razlog, da delujoča poizvedba vrne napačen odgovor ali nobenega. Zabeležite oba konca pred klicem in potrdite par glede na povezavo, ki jo je aplikacija res odprla. Pomembna je tudi družina naslovov: naslov, preslikan prek IPv4, in izvorni naslov IPv6 sta različna tuplea, prav tako toka TCP in UDP na istih vratih.

Pooblastilo in neznani izidi so del pogodbe

Poizvedba je omejena na pooblaščene klicatelje, vključno z aktivno aplikacijo VPN za ustreznega uporabnika. Nepovezana aplikacija za nadzor ne more domnevati, da lahko našteje povezave drugega profila, nepooblaščen klic pa lahko vrže varnostno izjemo namesto prijazne napake. Oba izida obravnavajte izrecno.

Manjkajoči lastnik ni ime paketa. Tok se je morda zaprl med paketom in poizvedbo, tuple je morda nepopoln ali pa klicatelju preprosto ni dovoljeno vedeti. Predpomnjenje prvega uspešnega odgovora in njegova poznejša ponovna uporaba pripiše novo povezavo stari aplikaciji, kar je slabše od poročanja neznanega.

Ko atribucija spodleti, promet še vedno potrebuje odločitev: blokirajte ga tam, kjer to zahteva politika, dovolite le obseg, ki ga razumete, ali pokažite vrzel. Ta rezerva sodi v zasnovo, ne v komentar.

Obračunavanje je drugo vprašanje

NetworkStatsManager poroča o porabi po lastnih pravilih dostopa. Lahko vam pove, koliko je UID prenesel v obdobju; ne more vam povedati lastnika poljubnega živega paketa. Zmogljivosti omrežja opisujejo lastnosti omrežja, ne imenika socketov. Mešanje treh ustvari nadzorne plošče, ki so videti skladne in niso.

Za preprost primer odločanja, katere aplikacije uporabljajo tunel, podprti seznami dovoljenih in prepovedanih aplikacij v Androidu že izražajo politiko brez kakršnega koli scrapinga. Atribucijo na tok prihranite za primere, ki jo resnično potrebujejo, in predvidite proračun za vzdrževano izvedbo, ki skupaj obravnava smer, dovoljenja in neznana stanja.

Izberite orodje glede na opravilo, nato preizkusite robove

Če je zahteva izbira tunela, uporabite seznam platforme. Če gre za atribucijo v živo, uporabite poizvedbo po lastniku in vsako četverico brez odgovora obravnavajte kot neznano. Če gre za zgodovinske vsote, uporabite stats API. Nato preizkusite tri robove, ki zlomijo naivne izvedbe: paket v nasprotni smeri, tok, ki se zapre pred poizvedbo, in klicatelja, ki ni aktivni VPN.

Nič od tega ne zahteva izklopa SELinuxa, rootanja telefona ali globalno berljivih tabel jedra. Omejitev je bistvo: platforma je atribucijo premaknila za pogodbo, da je odgovor na voljo komponenti, ki ga zakonito potrebuje, in nikomur drugemu.

Sorodni članki