Դուք հեռախոսի վրա chroot-ի տակ գործարկում եք Linux տարածում, մեջը տեղադրում VPN հաճախորդ, և shell-ը հայտարարում է, որ թունելը պատրաստ է։ Հետո անցնում եք զննարկիչին, և թրաֆիկը դուրս է գալիս բջջային տվյալներով, կարծես ոչինչ չի եղել։ Կամ հակառակը՝ հեռախոսի բոլոր հավելվածները կորցնում են կապը, որովհետև հաճախորդը լռելյայն երթուղի է ավելացրել այն անվանատարածքում, որն Android-ն իրականում օգտագործում է։ Այս երկու ախտանիշները գալիս են նույն բացակայող մասից, և ոչ մեկը VPN հաճախորդի սխալ չէ։

Shell-ը ասում է միացված, հավելվածները համաձայն չեն

Առաջին արդյունքը սովորականն է։ chroot-ից բացված օգտագործողի տարածության թունելը կարող է ավարտել ձեռքսեղմումը, տպել իր վիճակագրությունը և կրել այն թրաֆիկը, որն արտադրում է նույն shell-ը, մինչ Android-ի հավելվածները շարունակում են օգտագործել հեռախոսի լռելյայն ցանցը։ Ոչինչ չի ընդհատում նրանց, որովհետև ոչինչ չի ասել Android-ին, որ VPN գոյություն ունի։

Երկրորդ արդյունքը վտանգավորն է։ Եթե chroot-ը կիսում է Android-ի ցանցի անվանատարածքը, ինչը լռելյայն այդպես է, բավարար արտոնություններով գործընթացը կարող է ավելացնել երթուղիներ և TUN ինտերֆեյս, որոնք ազդում են ամբողջ հեռախոսի վրա։ Այնուհետև թունելը աշխատում է բոլոր հավելվածների համար, ներառյալ նրանք, որոնք դուք չէիք ուզում երթուղավորել, և հեռախոսի կապը այժմ կախված է դեմոնից, որը չունի կենսացիկլի կառավարում, կապի ցուցիչ և մշտապես միացված քաղաքականություն։

Երկուսից որը ստացաք, կարելի է պարզել մեկ հրամանով։ Համեմատեք ip route-ը chroot-ի ներսում նույն հրամանի հետ դրսի Android shell-ից։ Նույն ելքը նշանակում է, որ chroot-ը հոսթի անվանատարածքում է. նրա ցանցային ցանկացած փոփոխություն վերաբերում է ամբողջ հեռախոսին։ Տարբեր ելքը նշանակում է, որ գործարկիչը նրա համար անվանատարածք է ստեղծել, և նրա թունելը կառուցվածքով անտեսանելի է Android-ի համար։

Ինչ փոխեց chroot-ը և ինչ ոչ

ObjectEffect of a chroot
Pathname resolutionChanged: lookups start at the new root
Kernel and driversUnchanged: the phone's kernel, its TUN driver, its limits
Network namespaceUnchanged unless the launcher creates one
Android VPN registrationUnchanged: 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 տեղադրիչ, այլ այն՝ աջակցվող իրականացումը ձեզ անհրաժեշտ հավելվածները տեղափոխում է ձեր նախատեսած սահմանով, առանց սարքում անտեր արտոնյալ փոփոխություններ թողնելու։

Առնչվող հոդվածներ