Android VPN atribusiyasi: getConnectionOwnerUid və /proc/net
Android 10 /proc/net-i tətbiqlərdən gizlədir. VPN hələ də paket alır, lakin atribusiya öz tuple və icazə qaydaları ilə getConnectionOwnerUid-ə keçir.
Android 10 və sonrakı versiyalarda /proc/net/tcp faylını açan tətbiq socket cədvəli əvəzinə giriş qadağası alır. VPN interfeysi buna əhəmiyyət vermir: paketlər yenə gəlir, çünki tunel marşrut qərarıdır, fayl icazəsi deyil. Dəyişən daha dar bir sualın cavabıdır: «bu bağlantı hansı tətbiqə aiddir?» Əvəzləyici ConnectivityManager.getConnectionOwnerUid, hər bağlantı üzrə dəstəklənən sorğu-dur və köhnə vərdişlə yeni API arasında seçim əslində hansı üç işdən birinə sahib olduğunuzdan asılıdır: paket qəbul etmək, axını atribusiya etmək və ya istifadəni toplamaq.
Sahib sualına iki cavab yolu
API 29-dan əvvəl imtiyazlı və ya root prosesi kernelin socket cədvəllərini oxuya, dördlüyü uyğunlaşdıra və sahib UID-i öyrənə bilərdi. Bu, bir faylda cihaz miqyaslı inventar verirdi. API 29-dan etibarən fayl sistemi görünüşü məhduddur və dəstəklənən yol protokol, yerli ünvan və uzaq ünvanla hər bağlantı üzrə sorğudur.
| 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 |
Müqayisə «köhnəyə qarşı yeni» deyil. Bu, əvvəllər bir oxuna bilən faylla ödənilən, indi isə üç fərqli müqaviləli üç fərqli interfeyslə ödənilən üç fərqli işdir.
Yerli ünvan tətbiqin uc nöqtəsidir
Metod imzası protokol, yerli socket ünvanı və uzaq socket ünvanı alır. «Yerli» bağlantının tətbiq tərəfini bildirir, yoxlama anında paketin mənbəyi olan uc nöqtəni deyil. Uzaq serverdən tətbiqə qayıdan paketin mənbəyi və təyinatı bu tərifə görə tərsinədir.
ConnectivityManager cm = getSystemService(ConnectivityManager.class);
int uid = cm.getConnectionOwnerUid(
OsConstants.IPPROTO_TCP, appLocalAddress, appRemoteAddress);Bu istiqamət səhvi işlək sorğunun səhv və ya heç bir cavab qaytarmasının ən çox rast gəlinən səbəbidir. Çağırışdan əvvəl hər iki uc nöqtəni loga yazın və cütü tətbiqin həqiqətən açdığı bağlantı ilə təsdiqləyin. Ünvan ailəsi də vacibdir: IPv4 ilə əks olunmuş ünvan və doğma IPv6 ünvanı fərqli dördlüklərdir, eyni portlardakı TCP və UDP axınları da belədir.
Səlahiyyət və naməlum nəticələr müqavilənin hissəsidir
Sorğu səlahiyyətli çağıranlarla məhduddur, o cümlədən müvafiq istifadəçi üçün aktiv VPN tətbiqi. Əlaqəsiz monitorinq tətbiqi başqa profilın bağlantılarını saya biləcəyini güman edə bilməz və səlahiyyətsiz çağırış mehriban xəta əvəzinə təhlükəsizlik istisnası ata bilər. Hər iki nəticəni açıq şəkildə idarə edin.
Çatışmayan sahib paket adı deyil. Axın paketlə sorğu arasında bağlanmış, dördlük natamam ola bilər və ya çağırana sadəcə bilmək icazəsi verilməmiş ola bilər. İlk uğurlu cavabı keşləyib sonra təkrar istifadə etmək yeni bağlantını köhnə tətbiqə aid edir ki, bu da naməlum bildirməkdən pisdir.
Atribusiya uğursuz olduqda trafik yenə qərar tələb edir: siyasətin tələb etdiyi yerdə bloklayın, yalnız anladığınız əhatəyə icazə verin və ya boşluğu göstərin. Bu ehtiyat plan şərhə deyil, dizayna aiddir.
Uçot başqa bir sualdır
NetworkStatsManager istifadəni öz giriş qaydaları ilə göstərir. Bir UID-in müəyyən dövrdə nə qədər köçürdüyünü deyə bilər; ixtiyari canlı paketin sahibini deyə bilməz. Şəbəkə imkanları şəbəkənin xassələrini təsvir edir, socket kataloqu deyil. Üçünü qarışdırmaq ardıcıl görünən və olmayan panellər yaradır.
Tuneldən hansı tətbiqlərin istifadə etdiyini müəyyən etmək kimi sadə hal üçün Android-in dəstəklənən icazəli və qadağan olunmuş tətbiq siyahıları heç nə qazımadan siyasəti ifadə edir. Axın üzrə atribusiyanı həqiqətən lazım olan hallara saxlayın və istiqaməti, icazələri və naməlum halları birlikdə idarə edən saxlanılan tətbiq üçün büdcə ayırın.
Aləti işə görə seçin, sonra kənarları sınayın
Tələb tunel seçimidirsə, platforma siyahısından istifadə edin. Canlı atribusiyadırsa, sahib sorğusundan istifadə edin və cavabsız hər dördlüyü naməlum sayın. Tarixi cəmlərdirsə, stats API-dən istifadə edin. Sonra sadəlövh tətbiqləri pozan üç kənarı sınayın: əks istiqamətli paket, sorğudan əvvəl bağlanan axın və aktiv VPN olmayan çağıran.
Bunların heç biri SELinux-u söndürməyi, telefonu root etməyi və ya kernel cədvəllərini hamıya oxunaqlı etməyi tələb etmir. Məhdudiyyət məqsədin özüdür: platforma atribusiyanı müqavilənin arxasına keçirdi ki, cavab ona qanuni ehtiyacı olan komponentə çatsın, başqasına yox.