chroot-ով VPN Android-ում. ինչու թունելը աշխատում է, իսկ հավելվածները անտեսում են այն
chroot-ը փոխում է ուղիների լուծումը, ոչ միջուկը, ոչ ցանցի անվանատարածքը և ոչ Android-ի VPN գրանցումը։ Դրանից բխում է երկու արդյունք, և երկուսն էլ զարմացնում են։
Դուք հեռախոսի վրա chroot-ի տակ գործարկում եք Linux տարածում, մեջը տեղադրում VPN հաճախորդ, և shell-ը հայտարարում է, որ թունելը պատրաստ է։ Հետո անցնում եք զննարկիչին, և թրաֆիկը դուրս է գալիս բջջային տվյալներով, կարծես ոչինչ չի եղել։ Կամ հակառակը՝ հեռախոսի բոլոր հավելվածները կորցնում են կապը, որովհետև հաճախորդը լռելյայն երթուղի է ավելացրել այն անվանատարածքում, որն Android-ն իրականում օգտագործում է։ Այս երկու ախտանիշները գալիս են նույն բացակայող մասից, և ոչ մեկը VPN հաճախորդի սխալ չէ։
Shell-ը ասում է միացված, հավելվածները համաձայն չեն
Առաջին արդյունքը սովորականն է։ chroot-ից բացված օգտագործողի տարածության թունելը կարող է ավարտել ձեռքսեղմումը, տպել իր վիճակագրությունը և կրել այն թրաֆիկը, որն արտադրում է նույն shell-ը, մինչ Android-ի հավելվածները շարունակում են օգտագործել հեռախոսի լռելյայն ցանցը։ Ոչինչ չի ընդհատում նրանց, որովհետև ոչինչ չի ասել Android-ին, որ VPN գոյություն ունի։
Երկրորդ արդյունքը վտանգավորն է։ Եթե chroot-ը կիսում է Android-ի ցանցի անվանատարածքը, ինչը լռելյայն այդպես է, բավարար արտոնություններով գործընթացը կարող է ավելացնել երթուղիներ և TUN ինտերֆեյս, որոնք ազդում են ամբողջ հեռախոսի վրա։ Այնուհետև թունելը աշխատում է բոլոր հավելվածների համար, ներառյալ նրանք, որոնք դուք չէիք ուզում երթուղավորել, և հեռախոսի կապը այժմ կախված է դեմոնից, որը չունի կենսացիկլի կառավարում, կապի ցուցիչ և մշտապես միացված քաղաքականություն։
Երկուսից որը ստացաք, կարելի է պարզել մեկ հրամանով։ Համեմատեք ip route-ը chroot-ի ներսում նույն հրամանի հետ դրսի Android shell-ից։ Նույն ելքը նշանակում է, որ chroot-ը հոսթի անվանատարածքում է. նրա ցանցային ցանկացած փոփոխություն վերաբերում է ամբողջ հեռախոսին։ Տարբեր ելքը նշանակում է, որ գործարկիչը նրա համար անվանատարածք է ստեղծել, և նրա թունելը կառուցվածքով անտեսանելի է Android-ի համար։
Ինչ փոխեց chroot-ը և ինչ ոչ
| 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 համակարգային կանչը մեկ բան է անում. փոխում է ուղիների լուծման համար օգտագործվող պանակը։ man էջը հստակ ասում է, որ դա անվտանգության սահման չէ, և ոչինչ չի ասում ինտերֆեյսների, երթուղիների կամ VPN վիճակի մասին։ Այն ամենը, ինչ մարդիկ սպասում են Linux կոնտեյներից՝ առանձին ցանցային կույտ, զտված ֆայլային համակարգ, ռեսուրսների սահմաններ, գալիս է այլ մեխանիզմներից, որոնք գործարկիչը կարող էր օգտագործել կամ ոչ։
Այդ պատճառով chroot-ի՝ VPN-ը մեկուսացնելու պնդումները սովորաբար սխալ հարցի են պատասխանում։ Կարևոր հարցն այն է, թե որ անվանատարածքում է գործում գործընթացը և որ SELinux տիրույթում է սահմանափակված, և երկուսն էլ այն բանի հատկություններն են, թե ինչպես է այն սկսվել, ոչ թե chroot բառի։
TUN-ը երեք բան է պահանջում, և սարքի հանգույցը միայն մեկն է
Ավանդական օգտագործողի տարածության թունելը պահանջում է TUN սարք, որը կարող է բացել, միջուկի աջակցություն այդ սարքին և թույլտվություն կարգավորելու ինտերֆեյսը և երթուղիները։ Սրանք առանձին պահանջներ են, և /dev-ի տակ ուղու անուն ստեղծելը ինքնին ոչ մեկին չի բավարարում.
ls -l /dev/net/tun
ip tuntap add dev tun0 mode tun
Android-ում TUN աջակցությունը սովորաբար ներկառուցված է միջուկում, որովհետև հարթակի սեփական VPN ծառայությունն օգտագործում է այն, բայց դա չի նշանակում, որ ձեր գործընթացը կարող է օգտագործել այն։ Ինտերֆեյսի կարգավորումը պահանջում է ցանցի կառավարման ունակություն, և SELinux-ը որոշում է՝ գործընթացը կարող է հասնել սարքի հանգույցին թե ոչ։ Մերժումը թվում է թույլտվության սխալ՝ առանց ակնհայտ պատճառի, և պատասխանը աուդիտի հետքում է.
dmesg | grep avc
logcat -d | grep "avc: denied"
root-ը սա չի լուծում։ SELinux-ը uid 0-ով աշխատող գործընթացները սահմանափակում է ճիշտ այնպես, ինչպես մյուսներին, ուստի root shell-ից սկսված chroot-ը դեռ կարող է մերժվել մի սարքի համար, որը տեսնում է։ Կիրառումն անջատելը հին տեղադրիչը աշխատեցնելու համար ամբողջ հեռախոսի որոշում է՝ թունելից շատ ավելի հեռու հետևանքներով, և դա հնացած բինարի լուծում չէ։
Ինչու Android-ի հավելվածները անտեսում են ձեր թունելը
Android-ի աջակցվող մոդելը VPN հավելվածն է, որը գրանցվում է հարթակի VPN ծառայության միջոցով, մեկ անգամ խնդրում է օգտագործողի համաձայնությունը և ստանում ֆայլի նկարագրիչ իր թունելի համար։ Այնուհետև հարթակը թրաֆիկը ուղղում է այդ նկարագրիչ, և կիրառում է օգտագործողի կամ ադմինիստրատորի ընտրած հավելվածների շրջանակը, դրա համար նույն մեխանիզմը կարող է լինել ըստ հավելվածի, ըստ պրոֆիլի և համակցվել մշտապես միացված և առանց VPN արգելափակման կարգավորումների հետ։ Android-ի VPN մշակման ուղեցույցը նկարագրում է այդ ձեռքսեղմումը, և հիմնականը այն է, որ դա գրանցում է, ոչ թե երթուղավորման հնարք։
chroot-ի ներսի դեմոնը երբեք չի գրանցվում։ Չկա համաձայնության երկխոսություն, բանալու պատկերակ կարգավիճակի տողում, ըստ հավելվածի ներառման կամ բացառման ցանկ և մասնակցություն մշտապես միացված քաղաքականությանը։ Ուստի հավելվածները շարունակում են օգտագործել լռելյայն ցանցը, և թունելը կրում է միայն այն, ինչ ուղարկում է ինքը shell-ը։
Հակառակ ուղղությունը նույնպես չի օգնում։ Երթուղիները հոսթի անվանատարածք մղելը բռնում է ամեն ինչ, ներառյալ թրաֆիկը, որը հարթակը ակնկալում էր պահել տեղական, և դա անում է առանց ըստ հավելվածի վերահսկողության և առանց օգտագործողի համար տեսնելու կամ չեղարկելու հնարավորության։ Չկա միջանկյալ կարգավորում, որտեղ chroot-ի դեմոնը թրաֆիկը ուղղում է միայն մեկ հավելվածի համար։
Բինար համատեղելիությունը առանձին պատ է
Անգամ երբ ցանցային կողմը հետաքրքիր է, գործարկվող ֆայլն ունի իր պահանջները՝ պրոցեսորի ճարտարապետություն, դինամիկ բեռնիչ, C գրադարան և միջուկի այն ունակությունները, որոնք սպասում է։ Android-ը օգտագործում է bionic, ոչ glibc, և սեղանադիր տարածման համար կառուցված հին բինարը կարող է պահանջել գրադարաններ, որոնք այլևս չկան սարքում։
Գրադարանի ֆայլի անունը ավելի նոր տարբերակին կապելը ABI համատեղելիություն չի ստեղծում, և տասը տարվա փաթեթից արխիվացված գաղտնագրման գրադարանը պահպանվող բաղադրիչ չէ։ Եթե պլանը կախված է դրանից, պլանը հեռախոսի վրա ցանցային արտոնություններով չպահպանվող կոդ գործարկելն է։
Ապացուցեք դա Android-ի համատեքստում և հետո մաքրեք
Փորձարկեք այն, ինչ իրոք կարևոր է ձեզ համար, այն կողմից, որ կարևոր է. բացեք կոնկրետ հավելվածը, հասեք կոնկրետ մասնավոր նպատակակետին, հաստատեք, թե որ լուծիչը պատասխանեց, ապա անջատեք թունելը և հաստատեք փաստաթղթավորված վարքը։ chroot-ի ներսի տերմինալից ստացված արդյունքը ապացույց է այդ տերմինալի կատարման համատեքստի մասին և ոչ ավելին։
Եթե փորձի ընթացքում փոխել եք հոսթի երթուղիները, վերադարձրեք դրանք և գրի առեք, թե ինչ փոխեցիք։ Ապա ստուգեք, արդյոք հեռախոսում կարգավորված է մշտապես միացված VPN, որովհետև կանոն թողած հին փորձը ամիսներ անց կարող է թվալ հարթակի խափանում։
Հեռավար հասանելիության իրական կարիքի համար օգտագործեք ծառայության աջակցվող հաճախորդը կամ հաստատված դարպասի ձևավորում։ Հարցը, որ արժե տալ, այն չէ՝ կարելի է աշխատեցնել root տեղադրիչ, այլ այն՝ աջակցվող իրականացումը ձեզ անհրաժեշտ հավելվածները տեղափոխում է ձեր նախատեսած սահմանով, առանց սարքում անտեր արտոնյալ փոփոխություններ թողնելու։