Op Android 10 a méi Jonken kritt eng App, déi /proc/net/tcp opmécht, eng Zougangsverweigerung anstatt eng Socket-Tabell. D'VPN-Interface stéiert dat net: d'Pakete kommen nach ëmmer un, well den Tunnel eng Routingentscheedung ass, net eng Dateiberechtegung. Wat sech geännert huet, ass d'Äntwert op eng méi enk Fro: „wéi eng App besëtzt dës Verbindung?“ Den Ersatz ass ConnectivityManager.getConnectionOwnerUid, déi ënnerstëtzt Ufro pro Verbindung, an d'Wiel tëschent der aler Gewunnecht an der neier API hänkt dovun of, wéi eng vun dräi Aufgaben Dir tatsächlech hutt: Paketen empfangen, e Flux attributéieren oder d'Benotzung zesummen ze rechnen.

Zwee Weeër, d'Besëtzerfro ze beäntweren

Virum API 29 konnt e privilegéierte Prozess oder Root d'Socket-Tabellen vum Kernel liesen, de Véier-Tupel ofgläichen an d'besëtzend UID gewuer ginn. Dat huet en Apparat-wäiten Inventar an enger Datei ginn. Zënter API 29 ass d'Dateisystem-Vue limitéiert, an den ënnerstëtzten Wee ass eng Ufro pro Verbindung mam Protokoll, der lokaler Adress an der ferner Adress.

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

De Verglach ass net „al géint nei“. Et sinn dräi verschidden Aufgaben, déi fréier vun enger liesbarer Datei erfëllt goufen an elo vun dräi verschiddenen Interfaces mat dräi verschiddene Kontrakter erfëllt ginn.

D'lokal Adress ass den Ennpunkt vun der App

D'Methodesignatur hëlt e Protokoll, eng lokal Socket-Adress an eng fern Socket-Adress. „Lokal“ heescht d'Säit vun der App an der Verbindung, net dee Punkt, deen am Moment vun der Inspektioun just d'Quell vum Paket ass. E Paket, dee vum ferne Server zréck op d'App geet, huet Quell a Ziel vis-à-vis vun där Definitioun ëmgedréit.

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

Dëse Richtungsfeeler ass de heefegsten Grond, datt eng funktionéierend Ufro déi falsch Äntwert gëtt, oder keng. Log béid Enner virun dem Opruff a bestätegt d'Pair géint d'Verbindung, déi d'App tatsächlech opgemaach huet. D'Adressfamill zielt och: eng IPv4-gemappt Adress an eng nativ IPv6-Adress sinn ënnerschiddlech Tuples, an dat selwecht gëllt fir TCP- an UDP-Flëss op deene selwechte Ports.

Autorisatioun an onbekannt Resultater sinn Deel vum Kontrakt

D'Ufro ass op autoriséiert Opruffer limitéiert, dorënner d'aktiv VPN-App fir den entspriechende Benotzer. Eng onverbonnen Iwwerwaachungs-App kann net unhuelen, datt si d'Verbindunge vun engem anere Profil ophuele kann, an en net autoriséierten Opruff kann eng Sécherheetsausnam werfen, anstatt eng frëndlech Feeler zréckzeginn. Behandelt béid Resultater ausdrécklech.

En fehlende Besëtzer ass keen Paketnumm. De Flux kann tëschent dem Paket an der Ufro zougemaach gi sinn, den Tuple kann onkomplett sinn, oder dem Opruffer ass et einfach net erlaabt ze wëssen. Déi éischt erfollegräich Äntwert cache an duerno nach eng Kéier benotzen attributéiert eng nei Verbindung enger aler App, wat schlëmmer ass wéi onbekannt ze mellen.

Wann d'Attributioun feelt, brauch den Traffic nach ëmmer eng Entscheedung: blockéiert en do, wou d'Politik et verlaangt, erlaabt just en Ëmfang, deen Dir verstitt, oder weist d'Lück. Dee Fallback gehéiert zum Design, net zu engem Kommentar.

D'Comptabilitéit ass eng aner Fro

NetworkStatsManager mellt d'Benotzung ënner sengen eegene Zougangsregelen. Et kann Iech soen, wéi vill eng UID iwwer eng Period transferéiert huet; et kann Iech net de Besëtzer vun engem arbiträre liewege Paket soen. Netz-fäegkeeten beschreiwen d'Eegeschafte vun engem Netz, net en Verzeechnes vu Sockets. D'dräi ze mëschen erzeugt Dashboards, déi konsequent ausgesinn an et net sinn.

Fir de einfachen Fall ze entscheeden, wéi eng Appen den Tunnel benotzen, drécken d'ënnerstëtzt Lëschte vun erlaabten an verbuedenen Appen vun Android d'Politik schonn aus, ouni eppes ze scrapen. Reservéiert d'Attributioun pro Flux fir d'Fäll, déi se wierklech brauchen, a rechent mat enger ënnerhalleter Implementatioun, déi Richtung, Berechtegungen an onbekannt Zoustränd zesummen behandelt.

Wielt d'Instrument no Aufgab, test dann d'Kanten

Wann d'Ufuerderung d'Tunnelwahl ass, benotzt d'Lëscht vun der Plattform. Wann et Live-Attributioun ass, benotzt d'Besëtzer-Ufro a behandelt all onbeäntwertbaren Tuple als onbekannt. Wann et historesch Summe sinn, benotzt d'Stats-API. Test dann déi dräi Kanten, déi naiv Implementatiounen briechen: e Paket an der Géigerichtung, e Flux, deen zougeet ier Dir frot, an en Opruffer, deen net déi aktiv VPN ass.

Näischt vun dësem erfuerdert SELinux auszeschalten, den Telefon ze rooten oder Kernel-Tabellen global liesbar ze maachen. D'Restriktioun ass de Punkt: d'Plattform huet d'Attributioun hannert e Kontrakt geréckelt, fir datt d'Äntwert fir dee Komponent disponibel ass, deen se legitimerweis brauch, an fir keen aneren.

Ähnlech Artikelen