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

Що насправді передає діалог згоди

Застосунок, що реалізує VpnService і оголошує BIND_VPN_SERVICE, просить систему стати VPN пристрою. Після схвалення фреймворк створює інтерфейс tun і надає застосунку дескриптор файлу для нього. Усе, що застосунок робить далі, тече через цей дескриптор: він читає пакети IP назовні, вирішує, що з ними робити, і записує пакети назад усередину.

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

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

Де закінчується огляд пакетів

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

Метадані навколо зашифрованого тексту — інша історія, і саме тут розсипається більшість упевнених тверджень. IP призначення, порт, розміри пакетів і час — усе видиме, плюс ім'я сервера в TLS ClientHello, яке зазвичай надсилається відкрито навіть під TLS 1.3. Encrypted Client Hello це змінює, але воно не універсальне. Звичайний DNS так само легко зливає імена, коли запити виходять без шифрування.

Старіші або неправильно налаштовані протоколи передають більше. Звичайний HTTP, IMAP без TLS і низка ігрових протоколів та протоколів IoT виставляють свої навантаження всьому, що має дескриптор tun.

Дозволи, які ніколи не приходять разом із ним

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

Встановлення сертифіката — це те, за чим варто стежити, бо воно виглядає як частина налаштування VPN, але нею не є. Встановлення користувацького CA у сховище облікових даних змінює те, які сертифікати Android прийматиме, а з Android 7.0 застосунок, націлений на API 24 або новіший, ігнорує додані користувачем CA, якщо його конфігурація мережевої безпеки не включає їх із користувацьким якорем довіри. Клієнт, який наполягає на CA, може здійснювати законне корпоративне перехоплення, а може просити те, про що діалог VPN ніколи не згадував.

Доступ через спеціальні можливості стоїть ще далі. Служба з увімкненими спеціальними можливостями може читати вміст екрана інших застосунків, чого не дає жодна позиція на рівні пакетів.

Локальний фільтр чи віддалений шлюз

Той самий API охоплює два продукти, які заслуговують різного рівня довіри. Брандмауер або блокувальник реклами на пристрої бере дескриптор tun і відповідає на трафік локально, ніколи не надсилаючи його на сервер, яким керує сам. Справжній тунель пересилає ці пакети до шлюзу в іншому місці, і той оператор бачить ті самі метадані з іншого кінця й водночас вирішує, що повернеться.

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

Обидва випадки — усе ще позиція на рівні пакетів. Різниця в тому, хто ще стоїть на виході.

Перевірте, що ви схвалили

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

Далі пройдіться іншими дозволами. Інформація про застосунок показує, які дозволи часу виконання має клієнт, а налаштування безпеки показують, чи було одночасно встановлено сертифікат користувача. Будь-яке з них можна видалити незалежно.

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

Схожі статті