К устройствам в локальной сети (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 в качестве встроенного средства выбора, не потребуются разрешения локальной сети (более подробные инструкции появятся в следующем выпуске).
Руководство
Чтобы включить ограничения локальной сети, выполните следующие действия:
- Перепрошить устройство до сборки с Android 16 Beta 3 или более поздней версии
- Установите приложение для тестирования
Переключите конфигурацию Appcompat с помощью adb
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
Перезагрузите устройство.
Теперь доступ вашего приложения к локальной сети ограничен, и любая попытка доступа к ней приведёт к ошибкам сокета. Если вы используете API, которые выполняют операции с локальной сетью вне процесса вашего приложения, например, NsdManager
, то на них это не повлияет во время регистрации.
Чтобы восстановить доступ, необходимо предоставить приложению разрешение NEARBY_WIFI_DEVICES
.
- Убедитесь, что приложение объявляет разрешение
NEARBY_WIFI_DEVICES
в своемmanifest
. - Откройте «Настройки» > «Приложения» > [Имя приложения] > «Разрешения» > «Устройства поблизости» > «Разрешить».
Теперь доступ вашего приложения к локальной сети должен быть восстановлен, и все ваши сценарии должны работать так же, как и до включения приложения. Вот как это повлияет на сетевой трафик приложения.
Разрешение | Исходящий запрос локальной сети | Исходящий/входящий Интернет-запрос | Входящий запрос локальной сети |
---|---|---|---|
Предоставленный | Работы | Работы | Работы |
Не предоставлено | Неудачи | Работы | Неудачи |
Используйте следующую команду для отключения конфигурации 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)
Ошибки
Отправляйте сообщения об ошибках и отзывы о:
- Расхождения в доступе к локальной сети (вы не считаете, что определенный доступ следует считать доступом к «локальной сети»)
- Ошибки, при которых доступ по локальной сети должен быть заблокирован, но этого не происходит
- Ошибки, при которых доступ к локальной сети не должен быть заблокирован, но блокируется
Это изменение не повлияет на следующее:
- Доступ к Интернету
- Мобильная сеть