Android chroot VPN: tunel niyə işləyir və proqramlar onu niyə görmür
chroot yol axtarışını dəyişir, nüvəni, şəbəkə ad sahəsini və ya Android-in VPN qeydiyyatını deyil. Bundan iki nəticə çıxır və hər ikisi insanları təəccübləndirir.
Telefonda chroot altında işləyən Linux paylanması qurursunuz, içinə VPN müştərisi yazırsınız və shell tunelin tamamlandığını bildirir. Sonra brauzerə keçirsiniz və trafik sanki heç nə olmamış kimi mobil data ilə çıxır. Ya da əksi: müştəri Android-in həqiqətən istifadə etdiyi ad sahəsinə standart marşrut yazdığı üçün telefondaki bütün proqramlar bağlantını itirir. Bu iki simptom eyni çatışmayan hissədən gəlir və heç biri VPN müştərisinin xətası deyil.
Shell bağlıdır deyir, proqramlar razılaşmır
Birinci nəticə adi haldır. chroot-dan açılan istifadəçi məkanı tuneli öz handshake-ni tamamlaya, statistikasını çap edə və eyni shell-in yaratdığı trafiki daşıya bilər, Android proqramları isə telefonun standart şəbəkəsindən istifadə etməyə davam edir. Onları heç nə tutmur, çünki Android-ə VPN-in mövcud olduğunu deyən olmayıb.
İkinci nəticə təhlükəlidir. chroot Android-in şəbəkə ad sahəsini paylaşırsa, standart olaraq belə olur, kifayət qədər imtiyazı olan proses bütün telefona təsir edən marşrutlar və TUN interfeysi əlavə edə bilər. Sonra tunel marşrutlaşdırmaq istəmədikləriniz də daxil olmaqla hər proqram üçün işləyir və telefonun bağlantısı indi həyat dövrü idarəsi, bağlantı indikatoru və həmişə aktiv siyasəti olmayan demon-dan asılı olur.
Hansını aldığınızı bir əmrlə cavablandırmaq olar. ip route chroot içində, eyni əmrlə çöldəki Android shell-dən müqayisə edin. Eyni çıxış chroot-un host ad sahəsində olduğunu bildirir: etdiyi hər şəbəkə dəyişikliyi bütün telefon üçündür. Fərqli çıxış isə başladıcının onun üçün ad sahəsi yaratdığını göstərir və tuneli konstruksiyasına görə Android üçün görünməzdir.
chroot nəyi dəyişdi və nəyi dəyişmədi
| Object | Effect of a chroot |
|---|---|
| Pathname resolution | Changed: lookups start at the new root |
| Kernel and drivers | Unchanged: the phone's kernel, its TUN driver, its limits |
| Network namespace | Unchanged unless the launcher creates one |
| Android VPN registration | Unchanged: no app consented, no VPN is selected |
chroot sistem çağırışı bir şey edir: yol axtarışı üçün istifadə olunan kataloqu dəyişir. man səhifəsi bunun təhlükəsizlik sərhədi olmadığını açıq deyir və interfeyslər, marşrutlar və ya VPN vəziyyəti haqqında heç nə demir. İnsanların Linux konteynerindən gözlədikləri hər şey — ayrı şəbəkə yığını, filtrlənmiş fayl sistemi, resurs limitləri — başladıcının istifadə edib-etmədiyi başqa mexanizmlərdən gəlir.
Buna görə chroot-un VPN-i təcrid etdiyi iddiaları adətən səhv suala cavab verir. Əsl sual prosesin hansı ad sahəsində işlədiyi və hansı SELinux domeninə həbs olunduğudur və hər ikisi onun necə başladılmasının xassəsidir, chroot sözünün deyil.
TUN üç şey tələb edir və cihaz qovşağı yalnız biridir
Ənənəvi istifadəçi məkanı tuneli aça bildiyi TUN cihazı, həmin cihaz üçün nüvə dəstəyi və interfeysi və marşrutları konfiqurasiya etmək icazəsi tələb edir. Bunlar ayrı tələblərdir və /dev altında yol adı yaratmaq özlüyündə heç birini ödəmir:
ls -l /dev/net/tun
ip tuntap add dev tun0 mode tun
Android-də nüvə adətən TUN dəstəyini kompilyasiya edib, çünki platformanın öz VPN xidməti ondan istifadə edir, amma bu, sizin prosesinizin ondan istifadə edə biləcəyi demək deyil. İnterfeys konfiqurasiyası şəbəkə idarəetmə qabiliyyəti tələb edir və SELinux prosesin cihaz qovşağına ümumiyyətlə çatıb-çatmayacağını həll edir. İmtina aşkar səbəbi olmayan icazə xətası kimi görünür və cavab audit izindədir:
dmesg | grep avc
logcat -d | grep "avc: denied"
Root bunu həll etmir. SELinux uid 0 altında işləyən prosesləri digərləri kimi məhdudlaşdırır, ona görə root shell-dən başladılan chroot görə bildiyi cihazdan yenə məhrum edilə bilər. Köhnə quraşdırıcını işlətmək üçün icranı söndürmək tuneldən qat-qat uzaq nəticələri olan bütün telefon üçün qərardır və köhnəlmiş binar üçün düzəliş deyil.
Android proqramları tunelinizi niyə görmür
Android-in dəstəklənən modeli platformanın VPN xidmətində qeydiyyatdan keçən, istifadəçidən bir dəfə razılıq alan və tuneli üçün fayl deskriptoru alan VPN proqramıdır. Sonra platforma trafiki həmin deskriptora yönəldir və istifadəçinin və ya administratorun seçdiyi proqram əhatəsini tətbiq edir, buna görə eyni mexanizm proqram üzrə, profil üzrə və həmişə aktiv və VPN-siz bloklama parametrləri ilə birləşə bilər. Android VPN inkişaf təlimatı həmin handshake-i təsvir edir və əsas məqam onun marşrutlaşdırma hiyləsi deyil, qeydiyyat olmasıdır.
chroot içindəki demon heç vaxt qeydiyyatdan keçmir. Razılıq dialoqu, status panelində açar ikonu, proqram üzrə daxil etmə və ya xaric etmə siyahısı və həmişə aktiv siyasətdə iştirak yoxdur. Buna görə proqramlar standart şəbəkədən istifadə etməyə davam edir və tunel yalnız shell-in özünün göndərdiyini daşıyır.
Əks istiqamət də kömək etmir. Marşrutları host ad sahəsinə itələmək hər şeyi tutur, platformanın lokal saxlamaq istədiyi trafik də daxil olmaqla, və bunu proqram üzrə nəzarət olmadan, istifadəçinin görə və ya ləğv edə bilmədiyi şəkildə edir. chroot demonunun yalnız bir proqram üçün trafik yönəltdiyi aralıq ayar yoxdur.
Binar uyğunluğu ayrı divardır
Şəbəkə tərəfi maraqlı olsa da, icra olunan faylın öz tələbləri var: CPU arxitekturası, dinamik yükləyici, C kitabxanası və gözlədiyi nüvə imkanları. Android glibc əvəzinə bionic istifadə edir və masaüstü paylanması üçün qurulmuş köhnə binar cihazda artıq olmayan kitabxanalara ehtiyac duya bilər.
Kitabxana fayl adını daha yeni versiyaya bağlamaq ABI uyğunluğu yaratmır və on il yaşlı paketdən arxivlənmiş kriptoqrafiya kitabxanası saxlanılan komponent deyil. Plan bundan asılıdırsa, plan telefondaki şəbəkə imtiyazları ilə saxlanılmayan kod işlətməkdir.
Bunu Android kontekstində sübut edin və sonra təmizləyin
Həqiqətən əhəmiyyət verdiyinizi, əhəmiyyətli olan tərəfdən sınaqdan keçirin: konkret proqramı açın, konkret şəxsi ünvanı əldə edin, hansı resolver-in cavab verdiyini təsdiqləyin, sonra tuneli ayırın və sənədləşdirilmiş davranışı təsdiqləyin. chroot içindəki terminaldan alınan nəticə yalnız həmin terminalın icra konteksti haqqında sübutdur, başqa heç nə deyil.
Təcrübə zamanı host marşrutlarını dəyişmisinizsə, onları geri qaytarın və nəyi dəyişdiyinizi qeyd edin. Sonra telefonun həmişə aktiv VPN-i olub-olmadığını yoxlayın, çünki geridə qayda qoyan köhnə təcrübə aylar sonra platforma nasazlığı kimi görünə bilər.
Həqiqi uzaqdan giriş tələbi üçün xidmətin dəstəklənən müştərisini və ya təsdiqlənmiş şlüz dizaynını istifadə edin. Sormağa dəyər sual root quraşdırıcının işlədilə bilinib-bilməməsi deyil, dəstəklənən tətbiqin lazım olan proqramları nəzərdə tutduğunuz sərhəddən keçirib-keçirmədiyi və cihazda sahibsiz imtiyazlı dəyişikliklər qoyub-qoymadığıdır.