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

Устройства в локальной сети (LAN) могут быть доступны любому приложению, имеющему разрешение на доступ INTERNET . Это упрощает подключение приложений к локальным устройствам, но также влечет за собой проблемы с конфиденциальностью, такие как формирование «отпечатка пальца» пользователя и использование его в качестве посредника для определения местоположения.

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

Влияние

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

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

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

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

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

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

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

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

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

Руководство

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

  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 в своем manifest .
  • Перейдите в Настройки > Приложения > [Название приложения] > Разрешения > Ближайшие устройства > Разрешить

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

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

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

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

Ошибки

Если запрос на доступ к локальной сети не удается из-за отсутствия необходимых разрешений:

  • При установлении TCP-соединения обычно возникает ошибка тайм-аута .
  • Ошибки UDP и общие отказы в предоставлении доступа обычно приводят к ошибке с кодом EPERM.

Ошибки

Сообщайте об ошибках и оставляйте отзывы по следующим темам:

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

Следующие изменения должны остаться без изменений:

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