Paliečiate VPN patvirtinimo mygtuką, o dialogas nereaguoja. Natūrali išvada – sugedo VPN programa arba serveris, todėl žmonės pakeičia slaptažodžius, DNS arba iš naujo įdiegia klientą. Įprastai niekas iš to gedimo neliečia, nes Android atmeta prisilietimus, kurie ateina per kliūtį, o VPN patvirtinimo ekranas yra būtent toks jautraus sutikimo pranešimas, kuriam ta apsauga taikoma. Prisilietimas niekada nepasiekia mygtuko.

Ką iš tikrųjų atmeta apsauga

Android saugo jautrią sąveiką nuo tapjacking atakų, kai kitas langas užsideda ant dialogo ir arba perima prisilietimą, arba padaro jį dviprasmišką. Vaizdas įsijungia tai funkcijai su View.setFilterTouchesWhenObscured, o įvykis atkeliauja su MotionEvent.FLAG_WINDOW_IS_OBSCURED, kai kitas langas pažymėtas kaip iš dalies ar visiškai jį dengiantis. Kai taip atsitinka, įvykis išmetamas, o ne perduodamas ne į tą vietą. Android 12 (API 31) išplėtė tą pačią apsaugą nepatikimų prisilietimų blokavimu sisteminėse sutikimo sąsajose, todėl patvirtinimo dialogas gali atmesti prisilietimą iš perdangos, kurį kitos programos vis tiek priimtų.

Trys dalykai įprastai sukuria kliūtį: programa, turinti rodymo virš kitų programų leidimą, prieinamumo paslauga, braižanti turinį, ir plaukiojantis valdiklis iš ekrano įrašymo ar filtro įrankio. Kai kurios gamintojų ekrano funkcijos taip pat prideda savo sluoksnį, todėl tas pats dialogas gali elgtis skirtingai dviejuose telefonuose su ta pačia Android versija. Iš dalies dengiantis langas nustato FLAG_WINDOW_IS_PARTIALLY_OBSCURED, ir prisilietimas išmetamas dar prieš mygtukui jį pamatant. Tai ekrano savybė, o ne tinklo. Prisilietimo atmetimo momentu į VPN serverį niekas nebuvo nusiųsta, todėl joks serverio pakeitimas negali paveikti rezultato.

Atskirkite negyvą prisilietimą nuo nepavykusio prisijungimo

Šis atskyrimas yra visa diagnostika ir užima dešimt sekundžių. Jei prisilietimas ignoruojamas ir dialogas lieka toks pat, kliūtis yra vietinė. Jei dialogas užsidaro ir po to pasirodo klaida, sutikimas buvo priimtas ir jūs perėjote į kitą etapą, kuriam reikia pačios VPN programos įvykių informacijos.

Vietinę interpretaciją galite patvirtinti patikrinę, ar užklausą siunčianti programa apskritai bandė prisijungti. Klientas, kuris niekada neužregistruoja rankos paspaudimo bandymo, kol sutikimo dialogas rodomas ekrane, nepasiekė tinklo.

adb shell cmd appops get com.example.vpn SYSTEM_ALERT_WINDOW
adb shell settings get secure enabled_accessibility_services

Išvardykite, kas turi perdangos leidimą ir kurios prieinamumo paslaugos įjungtos, tada palyginkite tai su tuo, kas veikia. Neišjunkite pačios platformos apsaugos; būtent ji neleidžia paslėptam langui atsakyti į sutikimo prašymą jūsų vardu.

Pašalinkite kliūtį, tada pakartokite įprastą eigą

Pirmiausia nustatykite programą, kuri paprašė VPN patvirtinimo, kad žinotumėte, kokį sutikimą suteikiate. Tada sustabdykite konkrečią perdangą per jos pačios nustatymą, o ne atšaukdami platų leidimą, kurio galbūt prireiks vėliau. Ekrano filtras paprastai turi jungiklį savo programoje; plaukiojantis valdiklis turi uždarymo valdiklį; gamintojo ekrano režimas turi jungiklį Ekrano nustatymuose.

Po to grįžkite į VPN programą ir dar kartą paprašykite patvirtinimo, kad dialogas būtų sukurtas iš naujo. Jei prisilietimas dabar veikia, pakoreguokite perdangos suderinamumo elgseną arba palikite ją išjungtą, kol prisijungiate, ir palikite prisilietimo apsaugą įjungtą.

Jei negalite pasakyti, kuris langas atsakingas, šalinkite juos po vieną ir po kiekvieno pakeitimo pakartokite sutikimo dialogą. Įrašymo valdymo juosta ar plaukiojanti nuoroda paprastai būna kaltininkas, o tas, kurį pašalinote prieš pat pavykus, yra atsakymas.

Atkurkite viską, kas nesusiję, ką išjungėte pakeliui. Ekrano filtras ar naktinis režimas nėra priešas; priešas yra konkretus langas, kuris persidengia su dialogu.

Ko nedaryti, kad apeitumėte dialogą

Nesuteikite prieinamumo prieigos nepažįstamai programai, kad ji galėtų paspausti mygtuką, ir neįdiekite tam pagalbinės programos. Tai suteikia būtent tą galimybę, kurios apsauga siekia neleisti, ekrane, kuris įgalioja VPN.

Taip pat neautomatizuokite dialogo įvesties įrankiu. Tai duoda tą patį rezultatą kaip kenkėjiška perdanga ir nieko nepasako apie priežastį.

Valdomame įrenginyje politika, kuri riboja VPN pakeitimus, yra administratoriaus sprendimas. Perdangos eksperimentas nėra leidimas ją apeiti. Taip pat nereaguojantis sutikimo mygtukas nėra priežastis susilpninti sertifikatų tikrinimą ar keisti paskyros prisijungimo duomenis: nė vienas nustatymas nepašalina vietinės prisilietimo kliūties.

Jei vis tiek nepavyksta, praneškite tikslią elgseną

Aprašykite dialogą, o ne išvadą: kuri programa paprašė patvirtinimo, ar dialogas liko atidarytas, ar užsidarė, ar kiti jautrūs pranešimai, pavyzdžiui, nežinomų šaltinių ar prieinamumo įspėjimai, taip pat ignoruoja prisilietimus, įrenginio modelį ir Android versiją, bei užfiksuotus perdangų ir prieinamumo sąrašus.

Dar vieno klausimo paklauskite palaikymo savininko, kol ten esate: ar įrenginio politika apskritai riboja VPN konfigūracijos pakeitimus. Valdomas blokavimas atrodo kitaip nei ignoruojamas prisilietimas, ir žinojimas, su kuriuo susiduriate, sutaupo antrą ratą.

Šis rinkinys atskiria užtemdytų prisilietimų problemą nuo sugedusio įvesties įrenginio, užšalusio dialogo ar politikos blokavimo. Jis taip pat pasako kitam žmogui, ar žiūrėti į ekraną, ar į tinklą.

Android tapjacking gairės aprašo užtemdytų langų sąlygas ir API, kurie yra už šio elgesio. Jei norite įrodymų pėdsako, ieškokite FLAG_WINDOW_IS_OBSCURED ir FLAG_WINDOW_IS_PARTIALLY_OBSCURED įvykyje, kuris niekada nepasiekė mygtuko. Dialogas, kuris lieka atidarytas, yra tai, ką reikia užfiksuoti, nes jis rodo, kad prisilietimas buvo sulaikytas, o ne perduotas kitam langui.

Susiję straipsniai