Le, app VpnService ma tistax tixgħel il-VPN tat-telefon
L-app tippossjedi mina waħda u ċ-ċiklu tal-ħajja tagħha, mhux is-swiċċ tal-VPN tat-telefon. Il-kunsens jista’ jiġi rtirat, VPN wieħed biss jaħdem kull darba, u l-pakketti huma tiegħek biex tanalizzahom.
Is-suppożizzjoni żbaljata hija li app VpnService iddawwar swiċċ tas-sistema u minn hemm ’il quddiem it-telefon ikun protett. Dak li fil-verità jiġri huwa aktar dejjaq: l-app titlob kunsens, tibni interface, taqra u tikteb pakketti permezz ta’ deskrittur tal-fajl, u terġa’ tagħti l-interface meta tieqaf. Mina waħda biss bħal din tista’ tkun ħajja kull darba, u s-sistema tista’ tieħuha mingħajr ma tistaqsi. Il-biċċa l-kbira tal-imġiba konfuża li n-nies jgħadduha lill-protokoll ġejja minn dak il-mudell ta’ pussess.
Ittratta kull tranżizzjoni taċ-ċiklu tal-ħajja bħala parti mid-disinn u mhux bħala każ estrem.
Mitu: l-app tixgħel il-VPN tat-telefon
Il-fluss jibda b’VpnService.prepare(), li jirritorna Intent li l-utent irid jaċċetta, u jkompli b’establish(), li xorta jista’ jonqos wara għal raġunijiet li l-app ma tikkontrollax. L-istabbiliment ta’ tieni mina jiddiżattiva l-ewwel interface u jissostitwixxi n-notifika tas-sistema. Imkien f’dik is-sekwenza l-app ma tippossjedi swiċċ għall-apparat kollu; hija tippossjedi d-deskrittur li ngħatalha u l-pakketti li jinżlu fuqu. Anki n-notifika persistenti tappartjeni lis-sistema u mhux lid-disinn tal-app.
Billi l-interface tingħata u mhix maħtufa, klijent ieħor jista’ jieħu l-post f’kull mument. L-app tiskopri dan permezz ta’ callback, mhux permezz ta’ valur irritornat.
Li l-app titwaqqaf bil-forza jidher fil-pannell tan-notifiki għall-istess raġuni: is-sistema tirrapporta dak li tat, mhux dak li l-app għażlet turi.
Mitu: il-kunsens jingħata darba
Meta s-sistema tgħaddi l-mina lil klijent ieħor, tibgħat tranżazzjoni ta’ revoka fuq il-binder li l-klassi bażi tirritorna minn onBind(). App li tissostitwixxi dak il-binder b’tagħha trid tgħaddi hija stess it-tranżazzjoni ta’ revoka, inkella VpnService.onRevoke() qatt ma jiskatta u s-servizz ikompli jikteb f’deskrittur li m’għadux jeżisti. L-approvazzjoni tista’ tiġi rtirata wkoll mill-utent, u s-sistema tista’ twaqqaf is-servizz waqt restart jew rikonnessjoni dejjem mixgħula.
Li timmaniġġja dan hija xogħol konkret u mhux linja tal-log: waqfa milli taqra d-deskrittur, agħlqu, neħħi l-bandiera tal-konnessjoni u għid lill-utent f’liema stat jinsab. Imbagħad iddeċiedi jekk l-app għandhiex terġa’ tistabbilixxi, terġa’ tistaqsi jew tistenna, għax f’konfigurazzjoni dejjem mixgħula s-sistema tista’ ġġib is-servizz lura waħedha.
App li tittratta r-revoka bħala eċċezzjoni u mhux bħala stat se tirrapporta konnessa filwaqt li kull pakkett li tikteb jiġi miċħud, u dan huwa l-agħar mod ta’ falliment possibbli għal għodda tal-privatezza.
Mitu: l-interface tiffiltra t-traffiku għalik
Dak li jasal huwa IP mhux maħdum. Li taqbad jew tiffiltra jfisser li tanalizza headers IP, TCP, UDP u IPv6, issib il-flussi u tikteb it-tweġibiet lura fid-deskrittur, li jagħmel app tal-qbid stack tan-netwerk żgħir u mhux faċilità tas-sistema. protect() jeżisti biex is-socket tat-trasport tal-app stess tgħaddi minn ħdejn il-mina tagħha minflok taqbad lilha nfisha, u jirritorna boolean li jistħoqqlu verifika fuq kull socket maħluq wara li l-mina tkun ’il fuq.
Il-listi tal-applikazzjonijiet permessi u pprojbiti fil-builder jiddeċiedu ta’ min it-traffiku jidħol fl-interface. Ma jagħtux aċċess għall-payload lil hinn mill-pakketti IP li l-interface ġġorr, u l-ebda API ma jikxef il-mina ta’ klijent ieħor jew telenka l-profili tal-VPN tas-sistema. Il-kapaċitajiet tan-netwerk jistgħu jgħidu li netwerk huwa trasport tal-VPN, imma mhux ta’ min hija l-mina.
Huwa għalhekk li mistoqsijiet dwar l-istat ta’ apps oħra jieħdu tweġibiet kontradittorji: l-informazzjoni sempliċement mhix esposta lill-proċess tiegħek.
X’jiġifieri verament iċ-ċiklu tal-ħajja
Sorvejlja l-istati li tikkontrolla: lesta, stabbilita, irtirata, imwaqqfa. Ir-rikonnessjoni għandha tkun tqassir segwit minn stabbiliment, b’sid wieħed għad-deskrittur u s-socket tat-trasport, għax żewġ komponenti li jtellgħu lil xulxin biex jistabbilixxu se jiġġieldu għall-unika post disponibbli. Il-bidiet fil-background huma ristretti fuq Android modern, għalhekk xandira tal-boot mhijiex garanzija; uża servizz fil-quddiem bin-notifika tiegħu fejn il-livell tal-API jippermetti.
Irreġistra t-tranżizzjoni u mhux biss l-istat finali, u żomm il-magna tal-istat żgħira biżżejjed biex tittestja kull rotta. Stat li ma tistax tilħaq fi prova huwa stat li se tlaqgħa miegħu fil-qasam mingħajr log.
Ittestja ċ-ċiklu tal-ħajja fuq apparat
L-emulaturi jistgħu jiffalsifikaw il-konnettività imma mhux il-mogħdija tal-kunsens u r-revoka b’mod konvinċenti, għalhekk ħaddem dawn fuq apparat reali b’tieni klijent VPN installat biex jisraq il-post.
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
Ibda l-mina, ikkonferma n-notifika u l-interface, imbagħad qabbad il-klijent l-ieħor u ara jekk il-callback tar-revoka jaħdimx u jekk l-istat huwiex imnaddaf. Waqqaf l-app bil-forza u ċċekkja jekk xi ħaġa għadhiex tirrapporta deskrittur ħaj.
Irrepeti s-sekwenza wara restart dejjem mixgħul, għax dik il-mogħdija hija differenti minn konnessjoni mibdija mill-utent. Dak li qed tfittex mhuwiex ikona ħadra imma prova li l-app waqfet milli tuża deskrittur li ma kinitx għadha tagħha.