Kwenye Android 10 na baadaye, programu inayofungua /proc/net/tcp hupata katazo la ufikiaji badala ya jedwali la socket. Kiolesura cha VPN hakijali: pakiti bado zinafika, kwa sababu handaki ni uamuzi wa uelekezaji, si ruhusa ya faili. Kilichobadilika ni jibu la swali jembamba zaidi: “programu gani inamiliki muunganisho huu?” Mbadala ni ConnectivityManager.getConnectionOwnerUid, swali linalotumika kwa kila muunganisho, na uchaguzi kati ya tabia ya zamani na API mpya hutegemea ni kazi ipi kati ya tatu unayo kweli: kupokea pakiti, kuhusisha mtiririko, au kujumlisha matumizi.

Njia mbili za kujibu swali la mmiliki

Kabla ya API 29, mchakato wenye ruhusa maalum au root ungeweza kusoma majedwali ya socket ya kerneli, kulinganisha nne, na kujua UID ya mmiliki. Hilo lilitoa orodha ya kifaa kizima katika faili moja. Kuanzia API 29 mwonekano wa mfumo wa faili umezuiwa, na njia inayotumika ni swali kwa kila muunganisho lenye itifaki, anwani ya ndani na anwani ya mbali.

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

Ulinganisho si “wa zamani dhidi ya mpya”. Ni kazi tatu tofauti ambazo hapo awali zilitoshelezwa na faili moja linaloweza kusomwa na sasa zinatolewa na violesura vitatu tofauti vyenye mikataba mitatu tofauti.

Anwani ya ndani ni ncha ya programu

Sahihi ya mbinu inachukua itifaki, anwani ya socket ya ndani na anwani ya socket ya mbali. “Ya ndani” inamaanisha upande wa programu katika muunganisho, si upande ambao kwa bahati ni chanzo cha pakiti wakati unakagua. Pakiti inayosafiri kutoka seva ya mbali kurudi kwa programu ina chanzo na lengwa zilizopinduliwa kulingana na fasili hiyo.

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

Kosa hili la mwelekeo ndilo sababu ya kawaida zaidi ya swali linalofanya kazi kurudisha jibu lisilo sahihi, au hakuna. Rekodi ncha zote mbili kabla ya mwito na uthibitishe jozi dhidi ya muunganisho ambao programu ilifungua kweli. Familia ya anwani pia ni muhimu: anwani iliyopangwa kwa IPv4 na anwani asilia ya IPv6 ni tuple tofauti, na vivyo hivyo mitiririko ya TCP na UDP kwenye bandari zile zile.

Idhini na matokeo yasiyojulikana ni sehemu ya mkataba

Swali limezuiwa kwa wapigaji waliothibitishwa, ikiwa ni pamoja na programu hai ya VPN kwa mtumiaji husika. Programu ya ufuatiliaji isiyohusiana haiwezi kudhani inaweza kuhesabu miunganisho ya wasifu mwingine, na mwito usioidhinishwa unaweza kutupa hitilafu ya usalama badala ya kurudisha kosa la kirafiki. Shughulikia matokeo yote mawili kwa uwazi.

Mmiliki asiyekuwepo si jina la kifurushi. Mtiririko unaweza kuwa umefungwa kati ya pakiti na swali, tuple inaweza kuwa haijakamilika, au mpigaji anaweza asiwe na ruhusa ya kujua. Kuhifadhi jibu la kwanza lililofanikiwa na kulitumia tena baadaye humhusisha muunganisho mpya na programu ya zamani, jambo ambalo ni baya kuliko kuripoti haijulikani.

Uhusiano unaposhindikana, trafiki bado inahitaji uamuzi: zuia mahali sera inahitaji, ruhusu wigo unaoelewa tu, au dhihirisha pengo. Mbadala huo ni wa muundo, si wa maoni.

Uhasibu ni swali lingine

NetworkStatsManager huripoti matumizi chini ya kanuni zake za ufikiaji. Inaweza kukuambia UID ilihamisha kiasi gani kwa kipindi; haiwezi kukuambia mmiliki wa pakiti yoyote hai ya kiholela. Uwezo wa mtandao hufafanua sifa za mtandao, si orodha ya socket. Kuchanganya zote tatu hutoa dashboards zinazoonekana kuwa thabiti na haziko.

Kwa kisa rahisi cha kuamua ni programu zipi zinazotumia handaki, orodha zinazotumika za Android za programu zinazoruhusiwa na zilizokatazwa tayari zinaeleza sera bila scraping yoyote. Weka kando uhusiano kwa kila mtiririko kwa visa vinavyohitaji kweli, na tenga bajeti kwa utekelezaji unaodumishwa unaoshughulikia mwelekeo, ruhusa na hali zisizojulikana kwa pamoja.

Chagua chombo kwa kazi, kisha jaribu ncha

Ikiwa hitaji ni uchaguzi wa handaki, tumia orodha ya jukwaa. Ikiwa ni uhusiano wa moja kwa moja, tumia swali la mmiliki na uchukue kila tuple isiyojibika kama haijulikani. Ikiwa ni jumla za kihistoria, tumia stats API. Kisha jaribu ncha tatu zinazovunja utekelezaji sahili: pakiti ya mwelekeo kinyume, mtiririko unaofungwa kabla ya kuuliza, na mpigaji ambaye si VPN hai.

Hakuna chochote kati ya haya kinachohitaji kuzima SELinux, kufanya root ya simu au kufanya majedwali ya kerneli yasomeke kwa wote. Kizuizi ndicho kiini: jukwaa lilihamisha uhusiano nyuma ya mkataba ili jibu lipatikane kwa sehemu inayohitaji kwa njia halali, na si kwa mtu mwingine yeyote.

Makala zinazohusiana