Ви натискаєте кнопку підтвердження VPN, а діалог не реагує. Природний висновок — застосунок VPN або сервер зламані, тому люди скидають паролі, змінюють DNS або перевстановлюють клієнт. Зазвичай ніщо з цього не торкається несправності, бо Android відкидає дотики, що надходять крізь перешкоду, а екран підтвердження VPN — саме така чутлива підказка згоди, яка отримує цей захист. Натискання ніколи не доходить до кнопки.

Що насправді відхиляє захист

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

Три речі регулярно створюють перешкоду: застосунок із дозволом показувати поверх інших застосунків, служба доступності, що малює вміст, і плаваючий віджет від засобу запису екрана або інструмента фільтрації. Деякі функції екрана виробника додають і власний шар, тому той самий діалог може поводитися по-різному на двох телефонах з однією версією Android. Частково затуляюче вікно встановлює FLAG_WINDOW_IS_PARTIALLY_OBSCURED, і дотик відкидається ще до того, як кнопка його побачить. Це властивість екрана, а не мережі. У момент відкидання натискання на сервер VPN нічого не надіслано, тож жодна зміна на боці сервера не може вплинути на результат.

Відокремте мертве натискання від невдалого підключення

Ця різниця і є весь діагноз, і вона займає десять секунд. Якщо натискання ігнорується, а діалог залишається точно таким самим, перешкода локальна. Якщо діалог закривається і після цього з'являється помилка, згоду прийнято, і ви перейшли на інший етап, якому потрібна власна інформація про події застосунку VPN.

Локальне прочитання можна підтвердити, перевіривши, чи застосунок, що надсилає запит, узагалі намагався підключитися. Клієнт, який жодного разу не зафіксував спробу рукостискання, поки діалог згоди на екрані, не дістався мережі.

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

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

Приберіть перешкоду, потім повторіть звичайний сценарій

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

Після цього поверніться до застосунку VPN і знову запросіть підтвердження, щоб діалог створився заново. Якщо натискання тепер працює, налаштуйте поведінку сумісності оверлея або залиште його вимкненим на час підключення, і збережіть захист дотику ввімкненим.

Якщо не вдається визначити, яке вікно відповідальне, прибирайте їх по одному і повторюйте діалог згоди після кожної зміни. Панель керування записувача або плаваючий ярлик — звичайний винуватець, і те, що ви прибрали безпосередньо перед тим, як спрацювало, і є відповіддю.

Відновіть усе стороннє, що ви вимкнули дорогою. Екранний фільтр або нічний режим не ворог; ворог — конкретне вікно, що перекриває діалог.

Чого не варто робити, щоб обійти діалог

Не давайте доступ до спеціальних можливостей незнайомому застосунку, щоб він міг натиснути кнопку, і не встановлюйте для цього допоміжний застосунок. Вони дають саме ту можливість, яку захист покликаний не дати, на екрані, що авторизує VPN.

Не автоматизуйте діалог інструментом введення. Це дає той самий результат, що й шкідливий оверлей, і нічого не вчить про причину.

На керованому пристрої політика, що обмежує зміни VPN, — рішення адміністратора. Експеримент з оверлеєм не є дозволом його обходити. Так само кнопка згоди, що не реагує, не є приводом послаблювати перевірку сертифіката або змінювати облікові дані: жодне налаштування не прибирає локальну перешкоду для дотику.

Якщо все одно не працює, опишіть точну поведінку

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

Поки ви там, запитайте власника підтримки ще одне: чи політика пристрою взагалі обмежує зміни конфігурації VPN. Кероване блокування виглядає інакше, ніж проігнороване натискання, і розуміння того, з чим ви маєте справу, економить другий круг.

Цей набір відрізняє проблему перекритого дотику від зламаного пристрою введення, завислого діалогу або блокування політикою. Він також підказує наступній людині, дивитися на екран чи на мережу.

Рекомендації Android щодо tapjacking описують умови перекритих вікон і API, що стоять за цією поведінкою. Якщо потрібен слід доказів, шукайте FLAG_WINDOW_IS_OBSCURED і FLAG_WINDOW_IS_PARTIALLY_OBSCURED у події, яка так і не дійшла до кнопки. Діалог, що залишається відкритим, і треба зафіксувати, бо він показує: натискання було утримано, а не передано іншому вікну.

Схожі статті