Натискате бутона за одобрение на VPN, а диалогът не реагира. Естественият извод е, че приложението или сървърът са повредени, затова хората сменят пароли, DNS или преинсталират клиента. Обикновено нищо от това не засяга причината, защото Android отхвърля докосвания, дошли през препятствие, а екранът за одобрение на VPN е точно такъв чувствителен диалог за съгласие. Натискането така и не стига до бутона.

Какво всъщност отхвърля защитата

Android пази чувствителните взаимодействия от tapjacking, при което друг прозорец стои над диалога и открадва натискането или го прави двусмислено. Изгледът се включва с View.setFilterTouchesWhenObscured, а събитието пристига с MotionEvent.FLAG_WINDOW_IS_OBSCURED, когато друг прозорец е отбелязан като частично или напълно закриващ. Тогава събитието се изхвърля, вместо да бъде доставено на грешното място. Android 12 (API 31) разшири същата защита с блокиране на недоверени докосвания в системните повърхности за съгласие, затова диалогът може да откаже натискане от наслагване, което други приложения биха приели.

Три неща редовно създават препятствие: приложение с разрешение за показване над други приложения, услуга за достъпност, която рисува съдържание, и плаващ widget от записващ екрана или инструмент за филтриране. Някои функции на дисплея на производителя добавят свой слой, затова един и същ диалог може да се държи различно на два телефона с една и съща версия на Android. Частично закриващият прозорец задава FLAG_WINDOW_IS_PARTIALLY_OBSCURED и докосването се изхвърля, преди бутонът да го види. Това е свойство на екрана, не на мрежата. Към VPN сървъра не е изпратено нищо в момента на отхвърлянето, така че промяна от страна на сървъра не може да повлияе на резултата.

Отделете мъртвото натискане от неуспешната връзка

Разликата е целият диагноз и отнема десет секунди. Ако натискането се игнорира и диалогът остане точно както е, пречката е местна. Ако диалогът се затвори и после се появи грешка, съгласието е прието и сте в друг етап, който се нуждае от собствените данни за събития на приложението.

Потвърдете местния прочит, като проверите дали заявилото приложение изобщо е опитало връзка. Клиент, който никога не записва опит за ръкостискане, докато диалогът е на екрана, не е стигнал до мрежата.

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

Избройте кой държи разрешението за наслагване и кои услуги за достъпност са включени, после ги сравнете с това, което работи. Не изключвайте самата защита на платформата; тя пречи на скрит прозорец да отговори вместо вас на диалог за съгласие.

Премахнете препятствието и опитайте отново нормалния път

Първо установете кое приложение е поискало одобрение за VPN, за да знаете какво съгласие давате. После спрете конкретното наслагване през собствената му настройка, а не чрез отнемане на широко разрешение, което може да ви потрябва по-късно. Екранният филтър обикновено има превключвател в приложението си; плаващият widget има контрола за затваряне; режимът на дисплея на производителя има превключвател в настройките за дисплей.

След това се върнете в приложението за VPN и поискайте одобрение отново, за да се създаде диалогът наново. Ако натискането вече работи, нагласете съвместимостта на наслагването или го оставете изключено, докато се свързвате, а защитата на докосването оставете включена.

Ако не можете да определите кой прозорец е виновен, премахвайте ги един по един и повтаряйте диалога след всяка промяна. Контролната лента на записващото устройство или плаващият пряк път обикновено е виновникът, а това, което сте премахнали непосредствено преди успеха, е отговорът.

Върнете всичко несвързано, което сте изключили по пътя. Екранният филтър или нощният режим не са врагът; врагът е конкретният прозорец, който застъпва диалога.

Какво да не правите, за да подминете диалога

Не давайте достъпност на непознато приложение, за да натиска бутона, и не инсталирайте помощно приложение за целта. Така давате точно способността, която защитата съществува да откаже, на екран, който разрешава VPN.

Не автоматизирайте диалога с инструмент за въвеждане. Той дава същия резултат като злонамерено наслагване и не ви учи на нищо за причината.

На управлявано устройство политиката, която ограничава промените на VPN, е решение на администратора. Експеримент с наслагване не е разрешение да я заобикаляте. По същия начин неотзивчивият бутон не е причина да отслабите проверката на сертификата или да смените данните за профила: нито една от двете настройки не премахва местната пречка за докосване.

Ако все още не става, опишете точното поведение

Опишете диалога, а не извода: кое приложение поиска одобрение, дали диалогът остана отворен или се затвори, дали други чувствителни подкани като предупрежденията за неизвестни източници или достъпност също игнорират натискане, моделът на устройството и версията на Android, както и списъците с наслагвания и услуги за достъпност, които сте събрали.

Попитайте собственика на поддръжката още нещо: дали политиката на устройството ограничава изобщо промени в конфигурацията на VPN. Управляваната блокировка изглежда различно от игнорирано натискане и знанието кое виждате спестява втори тур.

Този набор различава проблема със закрито докосване от повредено входно устройство, замръзнал диалог или блокировка от политика. Казва и на следващия човек дали да гледа екрана, или мрежата.

Ръководството на Android за tapjacking описва условията за закрити прозорци и API зад това поведение. Ако искате следата от доказателства, търсете FLAG_WINDOW_IS_OBSCURED и FLAG_WINDOW_IS_PARTIALLY_OBSCURED в събитието, което така и не е стигнало до бутона. Диалогът, който остава отворен, е нещото за заснемане, защото показва, че натискането е задържано, а не предадено на друг прозорец.

Подобни статии