Rydych yn cael dosbarthiad Linux yn rhedeg o dan chroot ar y ffôn, yn gosod cleient VPN ynddo, ac mae’r shell yn cyhoeddi bod y twnnel wedi’i gwblhau. Yna rydych yn newid i borwr ac mae’r traffig yn mynd allan dros ddata symudol fel pe na bai dim wedi digwydd. Neu’r gwrthwyneb: mae pob ap ar y ffôn yn colli cysylltiad oherwydd bod y cleient wedi ychwanegu llwybr diofyn yn y gofod enw y mae Android yn ei ddefnyddio mewn gwirionedd. Mae’r ddau symptom hyn yn dod o’r un darn coll, ac nid yw’r naill na’r llall yn fai yn y cleient VPN.

Mae’r shell yn dweud cysylltiedig, mae’r apiau’n anghytuno

Y canlyniad cyntaf yw’r un cyffredin. Gall twnnel gofod defnyddiwr a agorwyd o chroot gwblhau ei gyfarchiad, argraffu ei ystadegau a chario traffig y mae’r un shell yn ei gynhyrchu, tra bo apiau Android yn dal i ddefnyddio rhwydwaith diofyn y ffôn. Nid oes dim yn eu rhyng-gipio, oherwydd nid oes dim wedi dweud wrth Android bod VPN yn bodoli.

Yr ail ganlyniad yw’r un peryglus. Os yw’r chroot yn rhannu gofod enw rhwydwaith Android, fel y mae’n ei wneud yn ddiofyn, gall proses â digon o fraint ychwanegu llwybrau a rhyngwyneb TUN sy’n effeithio ar y ffôn gyfan. Yna mae’r twnnel yn gweithio i bob ap, gan gynnwys y rhai nad oeddech yn bwriadu eu cyfeirio, ac mae cysylltedd y ffôn bellach yn dibynnu ar ddaemon heb reolaeth cylch bywyd, heb ddangosydd cysylltiad a heb bolisi bob amser ymlaen.

Pa un o’r ddau a gawsoch ellir ei ateb ag un gorchymyn. Cymharwch ip route y tu mewn i’r chroot â’r un gorchymyn o shell Android y tu allan. Mae allbwn unfath yn golygu bod y chroot yng ngofod enw’r gwesteiwr: mae unrhyw newid rhwydwaith y mae’n ei wneud yn berthnasol i’r ffôn gyfan. Mae allbwn gwahanol yn golygu bod y lansiwr wedi creu gofod enw ar ei gyfer, ac mae ei dwnnel yn anweledig i Android o ran ei adeiladwaith.

Beth newidiodd chroot a beth na wnaeth

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

Mae galwad system chroot yn gwneud un peth: mae’n newid y cyfeiriadur a ddefnyddir ar gyfer datrys llwybrau. Mae tudalen man yn dweud yn glir nad yw’n ffin diogelwch, ac nid yw’n dweud dim am ryngwynebau, llwybrau na chyflwr VPN. Daw popeth y mae pobl yn ei ddisgwyl gan gynhwysydd Linux — pentwr rhwydwaith preifat, system ffeiliau hidledig, terfynau adnoddau — o fecanweithiau eraill y gallai’r lansiwr fod wedi’u defnyddio neu beidio.

Dyna pam mae honiadau bod chroot yn ynysu VPN fel arfer yn ateb y cwestiwn anghywir. Y cwestiwn perthnasol yw ym mha ofod enw mae’r broses yn rhedeg ac ym mha barth SELinux y mae wedi’i chyfyngu, ac mae’r ddau yn briodweddau o’r ffordd y cafodd ei chychwyn, nid o’r gair chroot.

Mae TUN angen tri pheth, a nodyn dyfais yn un yn unig

Mae twnnel gofod defnyddiwr traddodiadol angen dyfais TUN y gall ei hagor, cymorth cnewyllyn ar gyfer y ddyfais honno, a chaniatâd i ffurfweddu’r rhyngwyneb a’r llwybrau. Mae’r rhain yn ofynion ar wahân, ac nid yw creu enw llwybr o dan /dev yn bodloni’r un ohonynt ar ei ben ei hun:

ls -l /dev/net/tun
ip tuntap add dev tun0 mode tun

Ar Android mae cymorth TUN fel arfer wedi’i grynhoi i mewn i’r cnewyllyn, oherwydd bod gwasanaeth VPN y platfform yn ei ddefnyddio, ond nid yw hynny’n golygu y caiff eich proses ei ddefnyddio. Mae ffurfweddu’r rhyngwyneb angen y gallu i weinyddu rhwydwaith, ac mae SELinux yn penderfynu a all y broses gyrraedd nodyn y ddyfais o gwbl. Mae gwrthodiad yn edrych fel gwall caniatâd heb achos amlwg, ac mae’r ateb yn y trywydd archwilio:

dmesg | grep avc
logcat -d | grep "avc: denied"

Nid yw root yn datrys hyn. Mae SELinux yn cyfyngu prosesau sy’n rhedeg fel uid 0 yn union fel y mae’n cyfyngu eraill, felly gall chroot a gychwynnwyd o shell root gael ei wrthod rhag dyfais y mae’n ei gweld. Mae analluogi gorfodaeth i gael hen osodwr i weithio yn benderfyniad i’r ffôn gyfan gyda chanlyniadau ymhell y tu hwnt i’r twnnel, ac nid yw’n atgyweiriad ar gyfer deuaidd hen.

Pam mae apiau Android yn anwybyddu eich twnnel

Model a gefnogir gan Android yw ap VPN sy’n cofrestru trwy wasanaeth VPN y platfform, yn gofyn i’r defnyddiwr am gydsyniad unwaith, ac yn derbyn disgrifydd ffeil ar gyfer ei dwnnel. Yna mae’r platfform yn cyfeirio traffig i’r disgrifydd hwnnw ac yn gorfodi cwmpas yr apiau a ddewiswyd gan y defnyddiwr neu’r gweinyddwr, a dyna pam y gall yr un mecanwaith fod fesul ap, fesul proffil, a’i gyfuno â gosodiadau bob amser ymlaen a blocio heb VPN. Mae canllaw datblygu VPN Android yn disgrifio’r cyfarchiad hwnnw, a’r pwynt allweddol yw ei fod yn gofrestriad, nid yn dric cyfeirio.

Nid yw daemon y tu mewn i chroot byth yn cofrestru. Nid oes deialog cydsyniad, dim eicon allwedd yn y bar statws, dim rhestr cynnwys nac eithrio fesul ap, a dim cyfranogiad yn y polisi bob amser ymlaen. Felly mae apiau’n dal i ddefnyddio’r rhwydwaith diofyn, ac mae’r twnnel yn cario dim ond yr hyn y mae’r shell ei hun yn ei anfon.

Nid yw’r ffordd arall yn helpu chwaith. Mae gwthio llwybrau i ofod enw’r gwesteiwr yn dal popeth, gan gynnwys traffig yr oedd y platfform yn disgwyl ei gadw’n lleol, ac mae’n gwneud hynny heb reolaeth fesul ap a heb ffordd i’r defnyddiwr ei weld na’i ddirymu. Nid oes gosodiad canol lle mae daemon mewn chroot yn cyfeirio traffig un ap yn unig.

Mae cydweddoldeb deuaidd yn wal ar wahân

Hyd yn oed pan fo’r ochr rwydwaith yn ddiddorol, mae gan y ffeil weithredadwy ei gofynion ei hun: pensaernïaeth CPU, y llwythwr deinamig, y llyfrgell C, a galluoedd y cnewyllyn y mae’n eu disgwyl. Mae Android yn defnyddio bionic yn lle glibc, a gall deuaidd hen a adeiladwyd ar gyfer dosbarthiad bwrdd gwaith fod angen llyfrgelloedd nad ydynt ar gael ar y ddyfais mwyach.

Nid yw cysylltu enw ffeil llyfrgell â fersiwn mwy newydd yn creu cydweddoldeb ABI, ac nid yw llyfrgell ddehongli wedi’i harchifo o becyn deng mlynedd oed yn gydran a gynhelir. Os yw’r cynllun yn dibynnu ar hynny, y cynllun yw rhedeg cod heb ei gynnal â breintiau rhwydwaith ar ffôn.

Profwch yn y cyd-destun Android a glanhewch ar ôl

Profwch yr hyn y mae gwir angen arnoch, o’r ochr sy’n bwysig: agorwch yr ap penodol, cyrhaeddwch y cyrchfan preifat penodol, cadarnhewch pa ddatryswr a atebodd, yna datgysylltwch y twnnel a chadarnhau’r ymddygiad a ddogfennwyd. Mae canlyniad o derfynell y tu mewn i chroot yn dystiolaeth am gyd-destun gweithredu’r derfynell honno ac yn ddim mwy.

Os gwnaethoch newid llwybrau’r gwesteiwr wrth arbrofi, dychwelwch hwy a chofnodwch beth a newidiasoch. Yna gwiriwch a oes VPN bob amser ymlaen wedi’i ffurfweddu ar y ffôn, oherwydd gall arbrawf hen a adawodd reol ymddangos fel nam platfform fisoedd yn ddiweddarach.

Ar gyfer gwir angen mynediad o bell, defnyddiwch gleient a gefnogir gan y gwasanaeth neu ddyluniad porth a gymeradwywyd. Y cwestiwn sy’n werth ei ofyn yw nid a ellir cael gosodwr root i weithio, ond a yw gweithrediad a gefnogir yn cario’r apiau sydd eu hangen arnoch dros y ffin a fwriadwyd gennych, heb adael newidiadau breiniol heb berchennog ar y ddyfais.

Erthyglau cysylltiedig