Android VPN атрибуциясы: getConnectionOwnerUid /proc/net-ке каршы
Android 10 /proc/netти колдонмолордон жашырат. VPN пакеттерди дагы эле алат, бирок атрибуция өз tuple жана уруксат эрежелери менен getConnectionOwnerUidке өтөт.
Android 10 жана андан кийинки версияларда /proc/net/tcp ачкан колдонмо socket таблицасынын ордуна кирүүгө тыюу алат. VPN интерфейсине бул баарыбир: пакеттер дагы келет, анткени туннель — маршруттоо чечими, файл уруксаты эмес. Өзгөргөн нерсе — тар суроого жооп: «бул байланышты кайсы колдонмо ээлейт?» Орун басары ConnectivityManager.getConnectionOwnerUid, ар бир байланыш боюнча колдоого алынган суроо, ал эми эски адат менен жаңы APIнин ортосундагы тандоо сизде чынында үч иштин кайсынысы бар экенине көз каранды: пакеттерди кабыл алуу, агымды атрибуциялоо же керектөөнү кошуу.
Ээнин суроосуна эки жооп жолу
API 29га чейин артыкчылыгы бар же root процесс ядронун socket таблицаларын окуп, төрттүктү дал келтирип, ээсинин UIDин биле алмак. Бул бир файлда бүт түзмөктүн тизмесин берчү. API 29дан баштап файл системасынын көрүнүшү чектелген, ал эми колдоого алынган жол — протокол, жергиликтүү дарек жана алыскы дарек менен ар бир байланыш боюнча суроо.
| 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 |
Салыштыруу «эскиге каршы жаңы» эмес. Бул мурун бир окула турган файл менен канааттандырылган, азыр үч түрдүү келишим менен үч түрдүү интерфейс тарабынан канааттандырылган үч түрдүү иш.
Жергиликтүү дарек — колдонмонун чети
Ыкманын колтамгасы протоколду, жергиликтүү socket дарегин жана алыскы socket дарегин алат. «Жергиликтүү» — байланыштагы колдонмонун тарабы, текшерүү учурунда пакеттин булагы болуп калган чет эмес. Алыскы серверден колдонмого кайткан пакеттин булагы жана дареги бул аныктамага карата тескери.
ConnectivityManager cm = getSystemService(ConnectivityManager.class);
int uid = cm.getConnectionOwnerUid(
OsConstants.IPPROTO_TCP, appLocalAddress, appRemoteAddress);Бул багыт катасы иштеген суроонун туура эмес жооп же такыр жооп бербешинин эң кеңири тараган себеби. Чалуудан мурун эки четти тең жазып алыңыз жана жупту колдонмо чындап ачкан байланыш менен салыштырыңыз. Дарек үй-бүлөсү да маанилүү: IPv4 аркылуу картага түшүрүлгөн дарек жана жергиликтүү IPv6 дареги ар башка төрттүктөр, ошондой эле бир порттогу TCP жана UDP агымдары да.
Ыйгарым укук жана белгисиз натыйжалар келишимдин бөлүгү
Суроо ыйгарым укуктуу чакыруучулар менен чектелет, анын ичинде тиешелүү колдонуучунун активдүү VPN колдонмосу. Байланышы жок мониторинг колдонмосу башка профилдин байланыштарын санай алат деп болжолдой албайт, ал эми укуксуз чакыруу достук катанын ордуна коопсуздук искэрин ыргытышы мүмкүн. Эки натыйжаны тең ачык иштетиңиз.
Жок ээ — пакеттин аты эмес. Агым пакет менен суроонун ортосунда жабылышы мүмкүн, төрттүк толук эмес болушу мүмкүн, же чакыруучуга билүүгө уруксат берилбеген болушу мүмкүн. Биринчи ийгиликтүү жоопту кэштеп, кийин кайра колдонуу жаңы байланышты эски колдонмого таандык кылат, бул белгисиз деп билдирүүдөн жаман.
Атрибуция ийгиликсиз болгондо, трафикке баары бир чечим керек: саясат талап кылган жерде блоктоп, өзүңүз түшүнгөн аймакка гана уруксат берип, же боштукту көрсөтүңүз. Бул камдык жол долбоорго таандык, комментарийге эмес.
Эсеп — башка суроо
NetworkStatsManager керектөөнү өзүнүн кирүү эрежелери боюнча билдирет. Ал UIDдин белгилүү мезгилде канча өткөргөнүн айта алат; ал каалаган тирүү пакеттин ээсин айта албайт. Тармак мүмкүнчүлүктөрү тармактын касиеттерин сүрөттөйт, socket тизмесин эмес. Үчөөнү аралаштыруу ырааттуу көрүнгөн жана андай болбогон такталарды жаратат.
Кайсы колдонмолор туннелди колдонорун чечүүнүн жөнөкөй учуру үчүн Androidдин колдоого алынган уруксат берилген жана тыюу салынган колдонмолор тизмелери эч кандай scraping жок эле саясатты билдирет. Агым боюнча атрибуцияны чындап керек болгон учурларга калтырыңыз жана багытты, уруксаттарды жана белгисиз абалдарды чогуу иштеткен колдоого алынган ишке ашырууга бюджет бөлүңүз.
Куралды ишке жараша тандап, анан четтерин текшериңиз
Талап туннелди тандоо болсо, платформанын тизмесин колдонуңуз. Тирүү атрибуция болсо, ээнин суроосун колдонуңуз жана жоопсуз төрттүктүн баарын белгисиз деп эсептеңиз. Тарыхый суммалар болсо, stats API колдонуңуз. Андан кийин жөнөкөй ишке ашырууларды бузган үч четти текшериңиз: каршы багыттагы пакет, суроого чейин жабылган агым жана активдүү VPN болуп саналбаган чакыруучу.
Булардын эч бири SELinuxти өчүрүүнү, телефонду root кылууну же ядро таблицаларын дүйнө жүзү боюнча окула турган кылууну талап кылбайт. Чектөө — бул маани: платформа атрибуцияны келишимдин артына жылдырды, ошондо жооп ага мыйзамдуу түрдө муктаж болгон компонентке гана жетет, башка эч кимге эмес.