Á Android 10 og nýrri fær forrit sem opnar /proc/net/tcp aðgangsneitun í stað socket-töflu. VPN-viðmótið hirðir ekki um það: pakkar berast áfram, því göngin eru ákvörðun um leiðarval, ekki skráarheimild. Það sem breyttist er svarið við þrengri spurningu: „hvaða forrit á þessa tengingu?“ Staðgengillinn er ConnectivityManager.getConnectionOwnerUid, studda fyrirspurnin fyrir hverja tengingu, og valið milli gömlu venjunnar og nýja API-sins fer eftir því hvert þriggja verkefnanna þú hefur í raun: að taka á móti pökkum, að tilvísa flæði eða að leggja saman notkun.

Tvær leiðir til að svara spurningu eigandans

Fyrir API 29 gat forréttindaforrit eða root lesið socket-töflur kjarnans, parað fjórgildið og fundið UID eigandans. Það gaf yfirlit yfir allt tækið í einni skrá. Frá API 29 er sýn skráarkerfisins takmörkuð, og studda leiðin er fyrirspurn fyrir hverja tengingu með samskiptareglunni, staðbundnu heimilisfangi og fjartengdu heimilisfangi.

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

Samanburðurinn er ekki „gamalt gegn nýju“. Þetta eru þrjú ólík verkefni sem eitt læsilegt skjal uppfyllti áður og þrjú ólík viðmót með þremur ólíkum samningum uppfylla nú.

Staðbundið heimilisfang er endi forritsins

Aðferðarundirskriftin tekur samskiptareglu, staðbundið socket-heimilisfang og fjartengt socket-heimilisfang. „Staðbundið“ þýðir hlið forritsins í tengingunni, ekki endinn sem verður fyrir tilviljun uppruni pakkans þegar þú skoðar hann. Pakki sem fer frá fjartengda þjóninum aftur til forritsins hefur uppruna og áfangastað öfugan miðað við þessa skilgreiningu.

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

Þessi stefnuvilla er algengasta ástæðan fyrir því að vinnandi fyrirspurn skilar röngu svari, eða engu. Skráðu báða enda fyrir kallið og staðfestu parið gegn tengingunni sem forritið opnaði í raun. Heimilisfangaættin skiptir líka máli: IPv4-vörpuð heimilisfang og innfædd IPv6-heimilisfang eru ólík tuple, og svo eru TCP- og UDP-flæði á sömu portum.

Heimild og óþekktar niðurstöður eru hluti samningsins

Fyrirspurnin er takmörkuð við heimilaða kallendur, þar á meðal virka VPN-forritið fyrir viðkomandi notanda. Ótengt eftirlitsforrit getur ekki gert ráð fyrir að geta talið upp tengingar annars sniðs, og óheimilt kall getur kastað öryggisundantekningu í stað þess að skila vingjarnlegri villu. Meðhöndlaðu báðar niðurstöður skýrt.

Vantar eiganda er ekki pakkanafn. Flæðið gæti hafa lokast milli pakkans og fyrirspurnarinnar, tuple-ið gæti verið ófullkomið, eða kallandanum einfaldlega ekki heimilað að vita. Að skyggja fyrsta árangursríka svarið og endurnýta það seinna tilvísar nýrri tengingu til gamals forrits, sem er verra en að tilkynna óþekkt.

Þegar tilvísun mistekst þarf umferðin samt ákvörðun: lokaðu henni þar sem stefnan krefst þess, leyfðu aðeins umfang sem þú skilur, eða sýndu eyðuna. Sá varaleiður tilheyrir hönnuninni, ekki athugasemd.

Bókhald er önnur spurning

NetworkStatsManager tilkynnir notkun samkvæmt eigin aðgangsreglum. Það getur sagt þér hversu mikið UID flutti yfir tímabil; það getur ekki sagt þér eiganda handahófskennds lifandi pakka. Netgeta lýsir eiginleikum nets, ekki skrá yfir socket. Að blanda þessu þrennu framleiðir mælaborð sem líta samræmd út og eru það ekki.

Fyrir einfalda tilfellið að ákveða hvaða forrit nota göngin, tjá studdu listar Android yfir leyfð og bönnuð forrit stefnuna þegar án nokkurs skrape. Haltu tilvísun fyrir hvert flæði fyrir þau tilfelli sem þurfa hana virkilega, og gerðu ráð fyrir viðhaldinni útfærslu sem meðhöndlar stefnu, heimildir og óþekkt ástand saman.

Veldu tólið eftir verkefni og prófaðu svo brúnirnar

Ef krafan er val á göngum, notaðu lista kerfisins. Ef um er að ræða lifandi tilvísun, notaðu fyrirspurn eigandans og meðhöndlaðu hvert ósvarað tuple sem óþekkt. Ef um er að ræða sögulega heild, notaðu stats API. Prófaðu svo þrjár brúnir sem brjóta barnalegar útfærslur: pakka í gagnstæða átt, flæði sem lokast áður en þú spyrð, og kallanda sem er ekki virka VPN-ið.

Ekkert af þessu krefst þess að slökkva á SELinux, róta símanum eða gera kjarnatöflur almennt læsilegar. Takmörkunin er punkturinn: kerfið færði tilvísunina bak við samning svo svarið sé aðgengilegt fyrir þann hluta sem þarf á því að halda með lögmætum hætti, og fyrir engan annan.

Tengdir greinar