Na, ni all ap VpnService droi VPN y ffôn ymlaen
Mae’r ap yn berchen ar un twndwl a’i gylchred fywyd, nid ar switsh VPN y ffôn. Gellir tynnu cydsyniad yn ôl, dim ond un VPN sy’n rhedeg ar y tro, a’ch gwaith chi yw dosrannu’r pecynnau.
Y camdybiaeth gyfeiliornus yw bod ap VpnService yn troi switsh system ac o’r pwynt hwnnw ymlaen mae’r ffôn yn cael ei diogelu. Yr hyn sy’n digwydd mewn gwirionedd sy’n gulach: mae’r ap yn gofyn am gydsyniad, yn adeiladu rhyngwyneb, yn darllen ac yn ysgrifennu pecynnau drwy ddangosydd ffeil, ac yn dychwelyd y rhyngwyneb pan fydd yn stopio. Dim ond un twndwl o’r fath all fod yn fyw ar y tro, a gall y system ei dynnu ymaith heb ofyn. Daw’r rhan fwyaf o’r ymddygiad dryslyd y mae pobl yn ei feio ar y protocol o’r model perchnogaeth hwnnw.
Triniwch bob trawsnewidiad yn y gylchred fywyd fel rhan o’r cynllun yn hytrach nag fel achos ymylol.
Chwedl: mae’r ap yn troi VPN y ffôn ymlaen
Mae’r llif yn dechrau gyda VpnService.prepare(), sy’n dychwelyd Intent y mae’n rhaid i’r defnyddiwr ei dderbyn, ac yn parhau gyda establish(), a all fethu wedyn am resymau nad yw’r ap yn eu rheoli. Mae sefydlu ail dwndwl yn dadactifadu’r rhyngwyneb cyntaf ac yn disodli hysbysiad y system. Nid yw’r ap yn berchen ar switsh ar draws y ddyfais yn unman yn y dilyniant hwnnw; fe sy’n berchen ar y dangosydd a roddwyd iddo a’r pecynnau sy’n glanio arno. Mae hyd yn oed yr hysbysiad parhaus yn perthyn i’r system yn hytrach nag i gynllun yr ap.
Gan fod y rhyngwyneb yn cael ei roi yn hytrach na’i gipio, gall cleient arall gymryd y lle ar unrhyw adeg. Mae’r ap yn dysgu hynny drwy alwad yn ôl, nid drwy werth dychwelyd.
Mae gorfod stopio’r ap yn weladwy yn y cysgod hysbysu am yr un rheswm: mae’r system yn adrodd yr hyn a roddodd, nid yr hyn a ddewisodd yr ap ei ddangos.
Chwedl: rhoddir cydsyniad unwaith
Pan fydd y system yn trosglwyddo’r twndwl i gleient arall, mae’n anfon trafodiad dirymu ar y binder y mae’r dosbarth sylfaenol yn ei ddychwelyd o onBind(). Rhaid i ap sy’n disodli’r binder hwnnw â’i un ei hun anfon y trafodiad dirymu ymlaen ei hun, neu ni fydd VpnService.onRevoke() byth yn tanio ac mae’r gwasanaeth yn parhau i ysgrifennu i ddangosydd nad yw’n bodoli mwyach. Gall y defnyddiwr hefyd dynnu cymeradwyaeth yn ôl, a gall y system stopio’r gwasanaeth yn ystod ailgychwyn neu ailgysylltu bob amser ymlaen.
Mae ymdrin â hyn yn waith concrit yn hytrach na llinell log: stopiwch ddarllen y dangosydd, caewch ef, cliriwch y faner gysylltiedig a dywedwch wrth y defnyddiwr ym mha gyflwr y mae. Yna penderfynwch a ddylai’r ap ailsefydlu, gofyn eto neu aros, oherwydd mewn cyfluniad bob amser ymlaen gall y system ddod â’r gwasanaeth yn ôl ei hun.
Bydd ap sy’n trin dirymu fel eithriad yn hytrach na chyflwr yn adrodd ei fod wedi cysylltu tra bod pob pecyn y mae’n ei ysgrifennu’n cael ei ollwng, sef y modd methu gwaethaf posibl ar gyfer offeryn preifatrwydd.
Chwedl: mae’r rhyngwyneb yn hidlo traffig drosoch
Yr hyn sy’n cyrraedd yw IP amrwd. Mae dal neu hidlo yn golygu dosrannu penawdau IP, TCP, UDP ac IPv6, olrhain llifoedd ac ysgrifennu atebion yn ôl i’r dangosydd, sy’n gwneud ap dal yn stac rhwydwaith bach yn hytrach na chyfleuster system. Mae protect() yn bodoli fel bod soced cludo’r ap ei hun yn osgoi ei dwndwl yn hytrach na dal ei hun, ac mae’n dychwelyd boole a haedda wiriad ar bob soced a grëir ar ôl i’r twndwl godi.
Mae’r rhestrau apiau a ganiateir ac a waharddir yn yr adeiladwr yn penderfynu pwy y mae ei draffig yn mynd i mewn i’r rhyngwyneb. Nid ydynt yn rhoi mynediad at lwythi y tu hwnt i’r pecynnau IP y mae’r rhyngwyneb yn eu cario, ac nid oes unrhyw API yn datgelu twndwl cleient arall nac yn rhestru proffiliau VPN y system. Gall galluoedd rhwydwaith ddweud bod rhwydwaith yn gludiant VPN, ond nid o bwy yw’r twndwl.
Dyna pam mae cwestiynau statws am apiau eraill yn cael atebion croes: nid yw’r wybodaeth yn syml yn cael ei datgelu i’ch proses.
Yr hyn y mae’r gylchred fywyd yn ei ofyn mewn gwirionedd
Olrheiniwch y cyflyrau rydych yn eu rheoli: parod, sefydledig, dirymedig, stopiedig. Dylai ailgysylltu fod yn ddarnio ac yna’n sefydlu, gydag un perchennog ar y dangosydd a’r soced cludo, oherwydd bydd dau gydran sy’n rasio i sefydlu’n ymladd dros yr un lle sydd ar gael. Mae cychwyn cefndir wedi’i gyfyngu ar Android modern, felly nid yw darllediad cychwyn yn warant; defnyddiwch wasanaeth blaen gyda’i hysbysiad lle mae lefel API yn caniatáu.
Cofnodwch y trawsnewidiad yn hytrach na dim ond y cyflwr terfynol, a chadwch y peiriant cyflwr yn ddigon bach i brofi pob llwybr. Mae cyflwr na allwch ei gyrraedd mewn prawf yn gyflwr y byddwch yn ei gyfarfod yn y maes heb log.
Profwch y gylchred fywyd ar ddyfais
Gall efelychwyr ffugio cysylltedd ond nid llwybr cydsyniad a dirymu’n argyhoeddiadol, felly rhedwch y rhain ar ddyfais go iawn gydag ail gleient VPN wedi’i osod i ddwyn y lle.
adb shell dumpsys connectivity | grep -i -A3 vpn
adb shell dumpsys activity services | grep -i -A2 vpnservice
adb logcat -s VpnService:V AndroidRuntime:E
adb shell am force-stop com.example.vpnapp
Dechreuwch y twndwl, cadarnhewch yr hysbysiad a’r rhyngwyneb, yna cysylltwch y cleient arall a gwyliwch a yw’r alwad yn ôl dirymu’n rhedeg ac a yw’r cyflwr yn clirio. Gorfod-stopiwch yr ap a gwiriwch a oes unrhyw beth yn dal i adrodd am ddangosydd byw.
Ailadroddwch y dilyniant ar ôl ailgychwyn bob amser ymlaen, oherwydd mae’r llwybr hwnnw’n wahanol i gysylltiad a gychwynnwyd gan y defnyddiwr. Yr hyn rydych yn chwilio amdano nid yw eicon gwyrdd ond tystiolaeth bod yr ap wedi stopio defnyddio dangosydd nad oedd yn berchen arno mwyach.