Android VPN esleipena: getConnectionOwnerUid versus /proc/net
Android 10ek /proc/net ezkutatzen die aplikazioei. VPNak paketeak jasotzen jarraitzen du, baina esleipena getConnectionOwnerUid-ra pasatzen da, bere tuple eta baimen arauekin.
Android 10 eta geroago, /proc/net/tcp irekitzen duen aplikazioak sarbide ukapena jasotzen du socket taula baten ordez. VPN interfazea ez zaio axola: paketeak iristen jarraitzen dute, tunela bideratze erabakia baita, ez fitxategi baimena. Aldatu zena galdera estuago baten erantzuna da: «zein aplikaziok dauka konexio hau?» Ordezkoa ConnectivityManager.getConnectionOwnerUid da, konexio bakoitzeko onartutako kontsulta, eta ohitura zaharraren eta API berriaren arteko hautua benetan dituzun hiru lanetako zein duzun araberakoa da: paketeak jasotzea, fluxu bat esleitzea edo erabilera batzea.
Bi modu jabearen galderari erantzuteko
API 29 baino lehen, prozesu pribilegiatu edo root batek kernelaren socket taulei irakur ziezaiokeen, laukoitza parekatu eta jabearen UIDa jakin. Honek gailu osoko inbentarioa ematen zuen fitxategi bakarrean. API 29tik aurrera fitxategi sistemaren ikuspegia mugatuta dago, eta onartutako bidea konexio bakoitzeko kontsulta da, protokoloarekin, tokiko helbidearekin eta urruneko helbidearekin.
| Question | Legacy socket tables | getConnectionOwnerUid |
|---|---|---|
| Who owns this flow? | Scan and match the tuple | Ask once per tuple |
| Device-wide inventory? | Yes, when readable | No, one flow at a time |
| Historical usage? | No | No; that is NetworkStatsManager |
| Works without root? | No on modern releases | Yes, for authorized callers |
Konparazioa ez da «zaharra berriaren aurka». Hiru lan desberdin dira: lehen fitxategi irakurgarri batek betetzen zituenak eta orain hiru interfaze desberdinek hiru kontratu desberdinekin betetzen dituztenak.
Tokiko helbidea aplikazioaren muturra da
Metodoaren sinadurak protokolo bat, tokiko socket helbide bat eta urruneko socket helbide bat hartzen ditu. «Tokikoa» konexioaren aplikazioaren aldea da, ez momentuan paketearen iturria izaten den muturra. Urruneko zerbitzaritik aplikaziora itzultzen den paketeak iturria eta helmuga trukatuta ditu definizio horrekiko.
ConnectivityManager cm = getSystemService(ConnectivityManager.class);
int uid = cm.getConnectionOwnerUid(
OsConstants.IPPROTO_TCP, appLocalAddress, appRemoteAddress);Norabide errore hau da kontsulta zuzen batek erantzun okerra edo bat ere ez emateko arrazoi ohikoena. Erregistratu bi muturrak deia baino lehen eta egiaztatu bikotea aplikazioak benetan ireki zuen konexioarekin. Helbide familia ere garrantzitsua da: IPv4 bidez mapatutako helbidea eta IPv6 helbide natiboa tuple desberdinak dira, eta berdin TCP eta UDP fluxuak portu beretan.
Baimena eta emaitza ezezagunak kontratuaren parte dira
Kontsulta baimendutako dei-egileetara mugatuta dago, dagokion erabiltzailearen VPN aplikazio aktiboa barne. Erlaziorik gabeko monitorizazio aplikazio batek ezin du suposatu beste profil baten konexioak zenbatu ditzakeenik, eta baimenik gabeko dei batek segurtasun salbuespena jaurti dezake errore atsegin baten ordez. Kudeatu bi emaitzak modu esplizituan.
Jabe falta ez da pakete izen bat. Fluxua paketearen eta kontsultaren artean itxi zitekeen, tuplea osatugabea izan daiteke, edo dei-egileari ez zaio jakiten uzten. Lehen erantzun arrakastatsua gordetzeak eta gero berrerabiltzeak konexio berria aplikazio zahar bati esleitzen dio, ezezaguna jakinaraztea baino okerragoa dena.
Esleipenak huts egiten duenean, trafikoak erabaki bat behar du oraindik: blokeatu politika horrela eskatzen duen tokian, baimendu ulertzen duzun esparru bat soilik, edo erakutsi hutsunea. Erreserba hori diseinuarena da, ez iruzkin batena.
Kontabilitatea beste galdera bat da
NetworkStatsManager-k erabilera jakinarazten du bere sarbide arauen arabera. Esan dezake zenbat transferitu duen UID batek epe batean; ezin du esan edozein pakete biziren jabea. Sare gaitasunek sare baten propietateak deskribatzen dituzte, ez socket direktorio bat. Hirurak nahasteak koherenteak diruditen eta ez diren panelak sortzen ditu.
Tunela zein aplikaziok erabiltzen duten erabakitzeko kasu sinplean, Androiden onartutako eta debekatutako aplikazio zerrendek politika adierazten dute jada, ezer scraping egin gabe. Gorde fluxu bakoitzeko esleipena benetan behar duten kasuetarako, eta aurrekontua egin norabidea, baimenak eta egoera ezezagunak batera kudeatzen dituen mantendutako inplementazio baterako.
Aukeratu tresna lanaren arabera, gero probatu ertzak
Baldintza tunel hautaketa bada, erabili plataformaren zerrenda. Zuzeneko esleipena bada, erabili jabearen kontsulta eta tratatu erantzunik gabeko tuple bakoitza ezezagun gisa. Guztizko historikoak badira, erabili stats APIa. Ondoren probatu inplementazio inozoa hausten duten hiru ertzak: kontrako norabideko pakete bat, kontsultatu aurretik ixten den fluxu bat, eta VPN aktiboa ez den dei-egile bat.
Hauetako ezein ez du SELinux desgaitzea, telefonoa root egitea edo kernel taulak mundu osoan irakurgarri egitea eskatzen. Muga da kontua: plataformak esleipena kontratu baten atzera eraman zuen, erantzuna legitimoki behar duen osagaiarentzat eskuragarri egon dadin, eta inor gehiagorentzat ez.