Priodoliad VPN Android: getConnectionOwnerUid yn erbyn /proc/net
Mae Android 10 yn cuddio /proc/net rhag apiau. Mae VPN yn dal i gael pecynnau, ond mae priodoliad yn symud i getConnectionOwnerUid, gyda'i reolau tuple a chaniatâd ei hun.
Ar Android 10 ac yn ddiweddarach, mae ap sy'n agor /proc/net/tcp yn cael gwrthodiad mynediad yn lle tabl soced. Nid yw rhyngwyneb y VPN yn poeni: mae pecynnau'n dal i gyrraedd, oherwydd penderfyniad llwybro yw'r twnnel, nid caniatâd ffeil. Yr hyn a newidiodd yw'r ateb i gwestiwn culach: “pa ap sy'n berchen ar y cysylltiad hwn?” Yr olynydd yw ConnectivityManager.getConnectionOwnerUid, yr ymholiad fesul cysylltiad a gefnogir, ac mae dewis rhwng yr arfer hen a'r API newydd yn dibynnu ar ba un o dri swydd sydd gennych mewn gwirionedd: derbyn pecynnau, priodoli llif, neu gyfrifo defnydd.
Dwy ffordd i ateb cwestiwn y perchennog
Cyn API 29, gallai proses freintiedig neu root ddarllen tablau soced y cnewyllyn, paru'r bedwaredd a dysgu'r UID perchennog. Roedd hynny'n rhoi rhestr ar draws y ddyfais mewn un ffeil. O API 29 ymlaen mae'r olwg ar y system ffeiliau'n gyfyngedig, a'r llwybr a gefnogir yw ymholiad fesul cysylltiad gyda'r protocol, y cyfeiriad lleol a'r cyfeiriad pell.
| 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 |
Nid “hen yn erbyn newydd” yw'r gymhariaeth. Tair swydd wahanol yw hi a oedd unwaith yn cael eu bodloni gan un ffeil ddarllenadwy ac sydd bellach yn cael eu bodloni gan dri rhyngwyneb gwahanol â thri chontract gwahanol.
Y cyfeiriad lleol yw pen yr ap
Mae llofnod y dull yn cymryd protocol, cyfeiriad soced lleol a chyfeiriad soced pell. Mae “lleol” yn golygu ochr yr ap i'r cysylltiad, nid pa bynnag ben sy'n digwydd bod yn ffynhonnell y pecyn ar y funud rydych chi'n archwilio. Mae gan becyn sy'n teithio o'r gweinydd pell yn ôl i'r ap ei ffynhonnell a'i gyrchfan wedi'u gwrthdroi o ran y diffiniad hwnnw.
ConnectivityManager cm = getSystemService(ConnectivityManager.class);
int uid = cm.getConnectionOwnerUid(
OsConstants.IPPROTO_TCP, appLocalAddress, appRemoteAddress);Y camgymeriad cyfeiriad hwn yw'r rheswm mwyaf cyffredin dros i ymholiad gweithredol ddychwelyd yr ateb anghywir, neu ddim. Cofnodwch y ddau ben cyn yr alwad a chadarnhewch y pâr yn erbyn y cysylltiad a agorodd yr ap mewn gwirionedd. Mae teulu cyfeiriad yn bwysig hefyd: mae cyfeiriad wedi'i fapio gan IPv4 a chyfeiriad IPv6 brodorol yn tuple gwahanol, ac felly hefyd llifau TCP a UDP ar yr un pyrth.
Mae awdurdodiad a chanlyniadau anhysbys yn rhan o'r contract
Mae'r ymholiad wedi'i gyfyngu i alwyr awdurdodedig, gan gynnwys yr ap VPN gweithredol ar gyfer y defnyddiwr perthnasol. Ni all ap monitro diberth dybio y gall restru cysylltiadau proffil arall, a gall galwad heb awdurdod daflu eithriad diogelwch yn lle dychwelyd gwall cyfeillgar. Triniwch y ddau ganlyniad yn benodol.
Nid enw pecyn yw perchennog coll. Efallai bod y llif wedi cau rhwng y pecyn a'r ymholiad, efallai bod y tuple yn anghyflawn, neu efallai nad yw'r galwr yn cael gwybod. Mae cadw'r ateb llwyddiannus cyntaf a'i ailddefnyddio'n ddiweddarach yn priodoli cysylltiad newydd i hen ap, sy'n waeth nag adrodd anhysbys.
Pan fydd priodoliad yn methu, mae angen penderfyniad ar y traffig o hyd: ei rwystro lle mae'r polisi'n mynnu hynny, caniatáu dim ond cwmpas rydych chi'n ei ddeall, neu ddangos y bwlch. Mae'r cwymp hwnnw'n perthyn i'r dyluniad, nid i sylw.
Mae cyfrifyddu'n gwestiwn gwahanol
Mae NetworkStatsManager yn adrodd defnydd o dan ei reolau mynediad ei hun. Gall ddweud faint a drosglwyddodd UID dros gyfnod; ni all ddweud perchennog pecyn byw mympwyol. Mae galluoedd rhwydwaith yn disgrifio priodweddau rhwydwaith, nid cyfeiriadur socedi. Mae cymysgu'r tri yn cynhyrchu dangosfyrddau sy'n edrych yn gyson ac nad ydynt.
Ar gyfer yr achos syml o benderfynu pa apiau sy'n defnyddio'r twnnel, mae rhestrau apiau a ganiateir ac a waharddir Android eisoes yn mynegi'r polisi heb grafu unrhyw beth. Cadwch briodoliad fesul llif ar gyfer yr achosion sydd wir ei angen, a chyllidebwch ar gyfer gweithrediad a gynhelir sy'n trin cyfeiriad, caniatadau a chyflyrau anhysbys gyda'i gilydd.
Dewiswch yr offeryn yn ôl y swydd, yna profwch yr ymylon
Os yw'r gofyniad yn ddewis twnnel, defnyddiwch restr y platfform. Os yw'n briodoliad byw, defnyddiwch yr ymholiad perchennog a thriniwch bob tuple na ellir ei ateb fel anhysbys. Os yw'n gyfansymiau hanesyddol, defnyddiwch stats API. Yna profwch y tri ymyl sy'n torri gweithrediadau naïf: pecyn i'r cyfeiriad arall, llif sy'n cau cyn i chi ymholi, a galwr nad yw'n VPN gweithredol.
Nid oes angen analluogi SELinux, gwreiddio'r ffôn na gwneud tablau cnewyllyn yn ddarllenadwy'n fyd-eang. Y cyfyngiad yw'r pwynt: symudodd y platfform briodoliad y tu ôl i gontract fel bod yr ateb ar gael i'r gydran sydd ei angen yn gyfreithlon, ac i neb arall.