Устройства в локальной сети (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 17
Начиная с Android 17, защита локальной сети является обязательной и применяется к приложениям, ориентированным на Android 17 и выше.
| Аспект | Android 16 | Android 17 |
|---|---|---|
| Целевой SDK | 36 | 37 или выше |
| Разрешение | Временно используется NEARBY_WIFI_DEVICES | ДОСТУП К ЛОКАЛЬНОЙ СЕТИ |
| Доступ по умолчанию | Доступ к локальной сети открыт. | Локальная сеть по умолчанию заблокирована для всех приложений, обновляющих свой целевой SDK. |
| Группа разрешений | Часть существующей группы разрешений NEARBY_DEVICES |
Для проверки работоспособности приложения после применения соответствующих мер, приложения, использующие SDK 37 или выше, должны использовать один из следующих способов управления доступом к локальной сети:
Вариант А: Использование инструментов выбора, обеспечивающих конфиденциальность.
Для задач обнаружения и подключения, выполняемых системой автоматически, используйте средства выбора, чтобы полностью избежать запроса широких разрешений во время выполнения. Используйте следующие средства выбора в зависимости от вашего сценария использования:
- Потоковая передача мультимедиа: Приложения, поддерживающие Google Cast, могут использовать функцию переключения источников звука . Это позволяет разработчикам разрешать пользователям выбирать определенные устройства для потоковой передачи без необходимости запроса приложением общего разрешения
ACCESS_LOCAL_NETWORK. - Общие возможности подключения:
NsdManagerвключает в себя системный инструмент выбора служб для обнаружения mDNS. Вместо сканирования всей сети приложение отображает диалоговое окно, позволяющее пользователю выбрать одно устройство для доступа приложения.
val discoveryRequest = DiscoveryRequest.Builder("_http._tcp")
.setFlags(DiscoveryRequest.FLAG_SHOW_PICKER)
.build()
nsdManager.registerServiceInfoCallback(discoveryRequest, executor, object : NsdManager.ServiceInfoCallback {
override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
// Handle the user-selected and discovered service
// NsdServiceInfo.getHostAddresses() can now be connected to
// without ACCESS_LOCAL_NETWORK permission
}
})
Вариант B: Запрос разрешения во время выполнения (широкий доступ)
Этот путь необходим для сложных сценариев использования, таких как домашняя автоматизация или управление устройствами IoT, требующих широкого и постоянного доступа к локальной сети.
Указание разрешений в манифесте: Разработчики должны явно указать
ACCESS_LOCAL_NETWORKв файлеAndroidManifest.xml.Запрос разрешения во время выполнения: Прежде чем пытаться получить доступ к локальной сети, приложения должны проверить, было ли предоставлено разрешение. Если нет, они должны вызвать
Activity.requestPermission()чтобы запустить стандартный системный запрос.Предварительно предоставленное разрешение: разрешение
ACCESS_LOCAL_NETWORKвходит в группу разрешенийNEARBY_DEVICES. Если пользователь уже предоставил другое разрешение в этой группе (например, разрешение на использование Bluetooth), ему не будет повторно запрашиваться доступ к локальной сети.Обработка отказов и аннулирования разрешений: Приложения должны корректно обрабатывать случаи, когда пользователь отклоняет запрос или впоследствии отзывает разрешение в системных настройках. В таких сценариях локальный сетевой трафик будет заблокирован.
Стратегия сброса счетчика запросов на разрешение
Платформа реализует стратегию сброса счетчика, которая решает проблемы, возникающие, когда предыдущий отказ приложения в предоставлении разрешения группы NEARBY_DEVICES (которая теперь включает ACCESS_LOCAL_NETWORK ) не позволял приложению запросить разрешение после адекватного обоснования. Этот механизм предоставляет приложению дополнительные возможности для вызова API requestPermission() , фактически сбрасывая счетчик отказов для разрешения ACCESS_LOCAL_NETWORK . Это позволяет более тонко взаимодействовать с пользователем, особенно когда первоначальный отказ произошел до того, как приложение смогло сообщить о необходимости доступа к локальной сети для своей основной функциональности.
Модель разделения разрешений
Функция «Разрешения в локальной сети» использует стратегию миграции с раздельными разрешениями для обработки новых и устаревших приложений по-разному в зависимости от целевого SDK.
| Категория | Целевой уровень SDK | поведение при доступе к локальной сети | Требуются действия разработчика. |
|---|---|---|---|
| Новые приложения / Обновленные приложения | >= 37 (Android 17) | Заблокировано по умолчанию | Объявите и запросите разрешение ACCESS_LOCAL_NETWORK во время выполнения. |
| Устаревшие приложения | < 37 | Приложения, имеющие разрешение INTERNET, получают неявное разрешение ACCESS_LOCAL_NETWORK , позволяющее им сохранить доступ. Это временное разрешение, которое будет заблокировано по умолчанию после того, как приложение обновит целевую версию SDK до 37. | Немедленных изменений в коде не требуется. |
Стратегия LNP на основе конкретных примеров использования
Трансляция: Для функций трансляции мультимедиа наиболее подходящей и обеспечивающей конфиденциальность стратегией является использование переключателя вывода . Этот метод позволяет системе самостоятельно обнаруживать и подключаться к локальной сети от имени пользователя, устраняя необходимость запроса приложением разрешения
ACCESS_LOCAL_NETWORK.Браузеры: Обработка ошибок требует различных подходов в зависимости от протокола. Ошибки UDP приводят к коду ошибки
EPERM. Для TCP-соединений браузерам следует использовать API NDKandroid_getnetworkblockedreason(int sockFd)чтобы определить, был ли пакет заблокирован LNP; этот API возвращаетANDROID_NETWORK_BLOCKED_REASON_LNP.Другие варианты использования (например, IoT): Приложения, которые находят устройства с помощью mDNS, должны использовать
android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKERчто позволяет находить устройства без соответствующего разрешения, иNsdManager#registerServiceInfoCallback/NsdManager#resolveServiceдля получения IP-адресов. Для подключения к IP-адресам, полученным таким образом, разрешениеACCESS_LOCAL_NETWORKне требуется.
Для приложений, требующих прямой связи по локальной сети и не допускающих использования системных средств выбора, рекомендуется использовать стратегию счетчика сброса разрешений. Если пользователь отзывает разрешение ACCESS_LOCAL_NETWORK , этот механизм предоставляет приложению дополнительные возможности для повторного запроса разрешения, позволяя разработчикам представить пользователю более четкое обоснование.
Руководство по Android 16
Чтобы включить ограничения локальной сети, выполните следующие действия:
- Обновите ваше устройство до версии 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>
Ошибки
Если запрос на доступ к локальной сети не удается из-за отсутствия необходимых разрешений:
При установлении TCP-соединения обычно возникает ошибка тайм-аута .
Ошибки UDP и общие отказы в предоставлении доступа обычно приводят к ошибке с кодом EPERM.
Ошибки
Сообщайте об ошибках и оставляйте отзывы по следующим темам:
- Несоответствия в доступе к локальной сети (вы считаете, что определенный доступ не следует считать доступом к "локальной сети").
- Ошибки, из-за которых доступ к локальной сети должен быть заблокирован, но этого не происходит.
- Ошибки, из-за которых доступ к локальной сети не должен блокироваться, но блокируется.
Следующие изменения должны остаться без изменений:
- Доступ к интернету
- Мобильная сеть