Root-сыз Android VPN: келісім, маршруттар мен бұғаттау кімге тиесілі
Келісім, TUN интерфейсі және жүйенің бұғаттау саясаты — үш түрлі рұқсат. Android VPN қолданбасын қарастырмас бұрын олардың әрқайсысы қай құрамдасқа тиесілі екенін анықтаңыз.
Root — Android VPN қолданбасына трафикті тасымалдауға, ағып кетулерді бұғаттауға немесе қайта жүктеуден кейін жұмыс істеуге мүмкіндік беретін нәрсе емес. Адамдар мұның бәрін «қолданбаның VPN рұқсаты бар» деп қорытындылайды, бұл үш бөлек механизмді жасырады: пайдаланушы берген келісім, жүйе құратын пакеттік интерфейс және қолданба анықтайтын емес платформаның бұғаттау саясаты. Android VPN дизайнын қарастыру — бұл үшеуінің қайсысына мәлімдеме шын мәнінде сүйенетінін сұрау, өйткені әрқайсысының иесі мен істен шығу режимі бөлек.
Келісім жүйелік әрекет арқылы келеді
VpnService.prepare() ештеңе бермейді. Келісім жоқ кезде ол жүйенің келісім әрекетіне intent қайтарады, ал қолданба сол диалогты ашады, сонда пайдаланушы қызметті мақұлдай алады. Қолданбаның өз процесін іске қосу, манифестке рұқсат қосу немесе жеке «VPN қосу» экранын көрсету рұқсатты жасамайды.
Рұқсат көлемімен де шектеулі. Ол пайдаланушы профиліндегі пакетке тиесілі, сондықтан жеке көшірме мен жұмыс көшірмесі бөлек шешімдер, ал құрылғы иесі басқарылатын профильді жекеден өзгеше дайындай алады. Егер диалог ешқашан шықпаса және prepare() null қайтарса, сол профильдегі сол пакетке келісім бұрыннан бар; бұл қолданбаның сенімді екендігінің дәлелі емес, тек рұқсаттың бар екенін білдіреді.
Интерфейс — жүйе орындайтын сұраныс
Келісімнен кейін қолданба не қалайтынын VpnService.Builder арқылы сипаттайды: мекенжайлар, маршруттар, DNS серверлері, MTU және қолдау болған жерде қосылатын немесе шығарылатын қолданбалар. establish() жүйеден туннель интерфейсін құруды және сәйкес трафикті соған бағыттауды сұрайды. Маршруттау шешімі жүйеге тиесілі; қолданба файл дескрипторын алады, содан кейін пакеттермен пайдалы бірдеңе істеуі керек.
| What you observe | Who actually owns it |
|---|---|
| VPN consent dialog | The system, triggered by prepare() |
| Routes, DNS and app lists | The app requests them; the system applies them |
| One active VPN per profile | The platform; a new service replaces the old one |
| Always-on and block-without-VPN | Device policy enforced by the platform |
Осы кесте — архитектура бір жерде. Қолданба пакеттерді өңдеуге қатысады; интерфейс, маршруттау кестесі немесе жұмыс істей алатын қызметтер саны оған тиесілі емес.
Туннель сокеті өз туннелінен шығуы керек
Шифрланған трафикті тасымалдайтын қосылымның өзі сокет. Егер ол қолданба жаңа ғана жасаған интерфейске қайта бағытталса, туннель туннельге тәуелді болып, тоқтайды. VpnService.protect() сол сокетті астындағы желіге байланыстырады, сондықтан ол ұстап алуды айналып өтеді, сондықтан дұрыс клиент бірінші қол алысудан бұрын сыртқы сокетін қорғайды.
adb shell dumpsys connectivity | grep -i -A5 vpn
adb shell settings get global always_on_vpn_app
adb shell settings get global always_on_vpn_lockdown
Бұл командалар орнатылған VPN желісін, әрдайым қосулы пакетті және құлыптау орнатылғанын көрсетеді. Бұлар тек оқуға арналған бақылаулар: мәндер дизайн айтқанға сәйкес келмесе, мәлімдеме жүйе күйіне емес, қолданба интерфейсіне қатысты.
Бұғаттау платформаға тиесілі болуы мүмкін
Android VPN-ді пайдаланбайтын қосылымдарды бұғаттайтын саясатты құжаттайды. Бұл орындау — платформаның келісімшарты, ал қолданбаның циклде қосылымды қайталап көруі емес. Ажыратқыш құрылғының VPN параметрлерінде «VPN-сіз қосылымдарды бұғаттау» ретінде орналасқан, ал басқарылатын құрылғыда иесі оны бүкіл профиль үшін қоса алады. Бұл айырмашылық маркетингтік мәлімдемені бағалағанда маңызды: клиент құлып белгішесін көрсетіп, агрессивті түрде қайта қосыла алады, ал тікелей трафик әлі де мүмкін болуы мүмкін, немесе қамтылған қолданбалар желіден тыс қалуы мүмкін, өйткені жүйе құлыптауды орындайды.
Құлып белгішесін қолданба салады, сондықтан ол қолданбаның қосылғанына сенетінін ғана дәлелдейді. Басқа қолданба желілік қатынасты жоғалта ма, оны платформа шешеді, сондықтан пайдалы тексеру — туннель қосулы кезде сол қолданбаның сәтсіздікке ұшырауын бақылау.
Қолданба дүкенінің «әрдайым қосулы» белгісі де бұл келісімшартты алмастырмайды. Әрдайым қосулы және құлыптау — құрылғы параметрлері, оларды жиі құрылғы иесі қолданады, ал олардың шығарылған қолданбаларға әрекетін платформа анықтайды. Параметрді оқыңыз, белгіні емес.
Дизайнды қарауға арналған төрт сұрақ
Біріншіден, кім келісім берді: қай пакет, қай профиль және бұл пайдаланушы ма әлде басқарылатын құрылғы саясаты ма? Екіншіден, қолданба не сұрады: қандай маршруттар, қандай мекенжай тұқымдастары, қандай қолданбалар қосылды немесе шығарылды? Үшіншіден, туннель қолжетімсіз болғанда не болады: жүйе бұғаттай ма, әлде трафик астындағы желіге қайта ма? Төртіншіден, қолданба алған пакеттермен не істейді?
Төртінші сұрақ — рұқсат моделі жауап бере алмайтын сұрақ. Келісім мен TUN интерфейсі қолданбаның трафик ала алатынын дәлелдейді, оны шифрлайтынын, тарапты аутентификациялайтынын немесе таза қалпына келетінін емес. Бұлар — іске асыру қасиеттері, және адал қарау уақытын сол жерде өткізеді.
Артық root сұранысы нәтижені «kill switch» деп атағаннан заңды болмайды, ал келісім диалогы қауіпсіздік аудиті емес. Үш рұқсатты бөлек ұстаңыз, сонда әр мәлімдеме тексерілетін болады.