Разрешение локальной сети

Доступ к устройствам в локальной сети может получить любое приложение, имеющее разрешение INTERNET . Это упрощает подключение приложений к локальным устройствам, но также влечет за собой последствия для конфиденциальности, такие как формирование отпечатка пальца пользователя и использование прокси-сервера для определения местоположения.

Проект «Защита локальной сети» направлен на защиту конфиденциальности пользователя путем ограничения доступа к локальной сети с помощью нового разрешения во время выполнения.

Влияние

В Android 16 это разрешение является функцией согласия, что означает, что оно будет затронуто только те приложения, которые согласились. Цель согласия — дать разработчикам приложений понять, какие части их приложения зависят от неявного доступа к локальной сети, чтобы они могли подготовиться к защите разрешений в будущих выпусках Android.

Приложения будут затронуты, если они получат доступ к локальной сети пользователя, используя:

  • Прямое или библиотечное использование необработанных сокетов на адресах локальной сети (например, протокол обнаружения службы mDNS или SSDP).
  • Использование классов уровня платформы, имеющих доступ к локальной сети (например, NsdManager).

Подробности воздействия

Для входящего и исходящего трафика по локальному сетевому адресу требуется разрешение на доступ к локальной сети. В следующей таблице перечислены некоторые распространенные случаи:

Низкоуровневая работа приложения в сети Требуется разрешение локальной сети
Создание исходящего TCP-соединения да
Принятие входящего TCP-соединения да
Отправка UDP одноадресной, многоадресной, широковещательной рассылки да
Получение входящего одноадресного, многоадресного или широковещательного сообщения UDP да

Эти ограничения реализованы глубоко в сетевом стеке и, следовательно, применимы ко всем сетевым API . Сюда входят сокеты, созданные на платформе или в управляемом коде, сетевые библиотеки, такие как Cronet и OkHttp, а также любые API-интерфейсы, реализованные поверх них. Попытка разрешить службы в локальной сети (т. е. службы с суффиксом .local) потребует разрешения локальной сети.

Исключения из предыдущих правил:

  • Если DNS-сервер устройства находится в локальной сети, трафик в/из него (по порту 53) не требует разрешения на доступ к локальной сети.
  • Приложениям, использующим переключатель вывода в качестве средства выбора внутри приложения, не потребуются разрешения локальной сети (дополнительные инструкции появятся в более позднем выпуске).

Руководство

Чтобы включить ограничения локальной сети, выполните следующие действия:

  1. Перепрограммируйте свое устройство на сборку с Android 16 Beta 3 или более поздней версии.
  2. Установите приложение для тестирования
  3. Переключите конфигурацию Appcompat с помощью adb

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. Перезагрузите устройство

Теперь доступ вашего приложения к локальной сети ограничен, и любая попытка доступа к локальной сети приведет к ошибкам сокета. Если вы используете API, которые выполняют операции в локальной сети вне процесса вашего приложения (например, NsdManager), это не повлияет на них во время подписки.

Чтобы восстановить доступ, вы должны предоставить своему приложению разрешение NEARBY_WIFI_DEVICES .

  • Убедитесь, что приложение декларирует разрешение NEARBY_WIFI_DEVICES в своем манифесте.
  • Откройте «Настройки» > «Приложения» > [Имя приложения] > «Разрешения» > «Устройства поблизости» > «Разрешить».

Теперь доступ вашего приложения к локальной сети должен быть восстановлен, и все ваши сценарии должны работать так же, как и до включения приложения. Вот как это повлияет на сетевой трафик приложения.

Разрешение Исходящий запрос локальной сети Исходящий/входящий интернет-запрос Входящий запрос локальной сети
Предоставленный Работает Работает Работает
Не предоставлено Не удалось Работает Не удалось

Используйте следующую команду, чтобы отключить конфигурацию Appcompat

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

Ошибки

Ошибки, возникающие из-за этих ограничений, будут возвращаться в вызывающий сокет всякий раз, когда он вызывает send или вариант send на адрес локальной сети.

Примеры ошибок:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

Ошибки

Отправляйте ошибки и отзывы о:

  • Расхождения в доступе к локальной сети (вы не считаете, что определенный доступ следует считать доступом к «локальной сети»)
  • Ошибки, при которых доступ к локальной сети должен быть заблокирован, но это не так.
  • Ошибки, при которых доступ к локальной сети не должен блокироваться, но блокируется.

Это изменение не должно затронуть следующее:

  • Доступ в Интернет
  • Мобильная сеть