Klepnete na tlačítko schválení VPN a dialog nereaguje. Přirozený závěr je, že aplikace nebo server jsou rozbité, a lidé proto resetují hesla, mění DNS nebo přeinstalovávají klienta. Obvykle se nic z toho netýká příčiny, protože Android zahazuje doteky, které přicházejí přes překážku, a obrazovka schválení VPN je právě takový citlivý dialog souhlasu. Klepnutí se k tlačítku nikdy nedostane.

Co ochrana vlastně odmítá

Android chrání citlivé interakce před tapjackingem, kdy jiné okno sedí nad dialogem a klepnutí ukradne nebo ho učiní nejednoznačným. Zobrazení se přihlásí pomocí View.setFilterTouchesWhenObscured a událost dorazí s MotionEvent.FLAG_WINDOW_IS_OBSCURED, když je jiné okno označeno jako částečně nebo plně zakrývající. Událost se pak zahodí, místo aby byla doručena na špatné místo. Android 12 (API 31) rozšířil stejnou ochranu blokováním nedůvěryhodných doteků v systémových plochách souhlasu, a proto dialog schválení může odmítnout klepnutí z překryvu, které by jiné aplikace ještě přijaly.

Překážku pravidelně vytvářejí tři věci: aplikace s oprávněním zobrazovat se nad jinými aplikacemi, služba přístupnosti, která kreslí obsah, a plovoucí widget ze záznamníku obrazovky nebo filtrovacího nástroje. Některé funkce displeje výrobce přidávají vlastní vrstvu, a proto se stejný dialog může na dvou telefonech se stejnou verzí Androidu chovat jinak. Částečně zakrývající okno nastavuje FLAG_WINDOW_IS_PARTIALLY_OBSCURED a dotek se zahodí dřív, než ho tlačítko vůbec uvidí. To je vlastnost obrazovky, ne sítě. V okamžiku zahození klepnutí nebylo na server VPN nic odesláno, takže žádná změna na straně serveru nemůže výsledek ovlivnit.

Oddělte mrtvé klepnutí od neúspěšného připojení

Rozdíl je celá diagnóza a trvá deset sekund. Pokud je klepnutí ignorováno a dialog zůstane přesně takový, jaký byl, je překážka místní. Pokud se dialog zavře a potom se objeví chyba, souhlas byl přijat a vy jste v jiné fázi, která potřebuje vlastní informace o událostech aplikace.

Místní čtení potvrdíte kontrolou, zda žádající aplikace vůbec zkusila připojení. Klient, který nikdy nezaznamená pokus o handshake, dokud je dialog souhlasu na obrazovce, se k síti nedostal.

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

Vypište, kdo drží oprávnění překryvu a které služby přístupnosti jsou zapnuté, a porovnejte to s tím, co běží. Nevypínejte samotnou ochranu platformy; právě ona brání skrytému oknu odpovědět za vás na dialog souhlasu.

Odstraňte překážku a zopakujte běžný postup

Nejprve zjistěte, která aplikace požádala o schválení VPN, abyste věděli, jaký souhlas dáváte. Potom zastavte konkrétní překryv jeho vlastním nastavením, ne odebráním širokého oprávnění, které můžete později potřebovat. Filtr obrazovky má obvykle přepínač ve své aplikaci; plovoucí widget má ovládání zavření; režim displeje výrobce má přepínač v nastavení displeje.

Potom se vraťte do aplikace VPN a znovu požádejte o schválení, aby dialog vznikl nanovo. Pokud klepnutí nyní funguje, upravte chování kompatibility překryvu nebo ho nechte vypnuté, dokud se připojujete, a ochranu doteku ponechte zapnutou.

Pokud nepoznáte, které okno je odpovědné, odstraňujte je jedno po druhém a po každé změně zkuste dialog znovu. Ovládací lišta záznamníku nebo plovoucí zkratka bývá obvyklý viník a to, co jste odstranili těsně před úspěchem, je odpověď.

Vraťte vše nesouvisející, co jste cestou vypnuli. Filtr obrazovky nebo noční režim nejsou nepřítel; nepřítelem je konkrétní okno, které se s dialogem překrývá.

Co nedělat, abyste dialog obešli

Nedávejte neznámé aplikaci přístupnost, aby mohla stisknout tlačítko, a neinstalujte kvůli tomu pomocnou aplikaci. Dáváte tím přesně tu schopnost, kterou má ochrana odepřít, na obrazovce, která povoluje VPN.

Neautomatizujte dialog nástrojem pro vstup. Dává stejný výsledek jako škodlivý překryv a nic vás o příčině nenaučí.

Na spravovaném zařízení je zásada omezující změny VPN rozhodnutím správce. Experiment s překryvem není oprávnění ji obcházet. Stejně tak nereagující tlačítko souhlasu není důvod oslabit ověřování certifikátů nebo měnit přihlašovací údaje: ani jedno z nastavení neodstraní místní překážku doteku.

Pokud to stále nejde, nahlaste přesné chování

Popište dialog, ne závěr: která aplikace požádala o schválení, zda dialog zůstal otevřený nebo se zavřel, zda i jiné citlivé výzvy jako upozornění na neznámé zdroje či přístupnost ignorují klepnutí, model zařízení a verzi Androidu a seznamy překryvů a služeb přístupnosti, které jste zaznamenali.

Zeptejte se vlastníka podpory ještě na jedno: zda zásada zařízení omezuje změny konfigurace VPN vůbec. Spravované zablokování vypadá jinak než ignorované klepnutí a vědomí, co vidíte, ušetří druhé kolo.

Tato sada rozliší problém zakrytého doteku od vadného vstupního zařízení, zamrzlého dialogu nebo blokace zásadou. Řekne také dalšímu člověku, zda se má dívat na obrazovku, nebo na síť.

Pokyny Androidu k tapjackingu pokrývají podmínky zakrytých oken a API za tímto chováním. Pokud chcete stopu důkazů, hledejte FLAG_WINDOW_IS_OBSCURED a FLAG_WINDOW_IS_PARTIALLY_OBSCURED na události, která se k tlačítku nikdy nedostala. Dialog, který zůstane otevřený, je to, co je třeba zachytit, protože ukazuje, že klepnutí bylo zadrženo, a ne předáno jinému oknu.

Související články