Android VPN и разрешения приложений: что означает предупреждение
Диалог согласия на VPN в Android даёт позицию на уровне пакетов, а не доступ к вашей почте, фотографиям или контактам. Вот где на самом деле проходит эта граница.
Два диалога в 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 — авторитетный список того, что раскрывает интерфейс.