Auf Geräte in einem lokalen Netzwerk (LAN) kann von jeder App zugegriffen werden, die die Berechtigung INTERNET hat.
Dadurch können Apps ganz einfach eine Verbindung zu lokalen Geräten herstellen. Es gibt aber auch datenschutzrechtliche Auswirkungen, z. B. die Erstellung eines Fingerabrucks des Nutzers und die Verwendung als Proxy für den Standort.
Das Projekt „Local Network Protections“ zielt darauf ab, die Privatsphäre des Nutzers zu schützen, indem der Zugriff auf das lokale Netzwerk durch eine neue Laufzeitberechtigung eingeschränkt wird.
Auswirkungen
In Android 16 ist diese Berechtigung eine optionale Funktion. Das bedeutet, dass nur Apps betroffen sind, die sich dafür entscheiden. Ziel ist es, dass App-Entwickler nachvollziehen können, welche Teile ihrer App auf impliziten Zugriff auf das lokale Netzwerk angewiesen sind, damit sie sich auf die Berechtigungsbeschränkung in einer zukünftigen Android-Version vorbereiten können.
Apps sind betroffen, wenn sie über eine der folgenden Methoden auf das lokale Netzwerk des Nutzers zugreifen:
- Direkte oder bibliotheksbasierte Verwendung von Raw Sockets für lokale Netzwerkadressen, z. B.
Multicast DNS (mDNS)oderSimple Service Discovery Protocol (SSDP). - Verwendung von Klassen auf Framework-Ebene, die auf das lokale Netzwerk zugreifen, z. B.
NsdManager.
Details zu den Auswirkungen
Für Traffic zu und von einer lokalen Netzwerkadresse ist die Berechtigung für den Zugriff auf das lokale Netzwerk erforderlich. In der folgenden Tabelle sind einige häufige Fälle aufgeführt:
| App-Netzwerkbetrieb auf niedriger Ebene | Berechtigung für das lokale Netzwerk erforderlich |
|---|---|
| Ausgehende TCP-Verbindung herstellen | Ja |
| Eingehende TCP-Verbindung akzeptieren | Ja |
| UDP-Unicast, -Multicast oder -Broadcast senden | Ja |
| Eingehende UDP-Unicast, -Multicast oder -Broadcast empfangen | Ja |
Diese Einschränkungen sind tief im Netzwerkstack implementiert und gelten daher für alle Netzwerk-APIs. Dazu gehören Sockets, die im Plattform- oder verwalteten Code erstellt wurden, Netzwerkbibliotheken wie Cronet und OkHttp sowie alle APIs, die darauf aufbauen. Wenn Sie versuchen, Dienste im lokalen Netzwerk aufzulösen, die das Suffix .local haben, ist die Berechtigung für das lokale Netzwerk erforderlich.
Ausnahmen von den oben genannten Regeln:
- Wenn sich der DNS-Server eines Geräts in einem lokalen Netzwerk befindet, ist für Traffic zu und von ihm (auf Port 53) keine Berechtigung für den Zugriff auf das lokale Netzwerk erforderlich.
- Für Anwendungen, die Output Switcher als In-App-Auswahl verwenden, sind keine Berechtigungen für das lokale Netzwerk erforderlich. Weitere Informationen folgen in einer späteren Version.
Erzwingung in Android 17
Ab Android 17 sind die Schutzmaßnahmen für das lokale Netzwerk obligatorisch und werden für Apps erzwungen, die auf Android 17 oder höher ausgerichtet sind.
| Aspekt | Android 16 | Android 17 |
|---|---|---|
| Ziel-SDK | 36 | 37 oder höher |
| Berechtigung | Vorübergehend verwendete Berechtigung NEARBY_WIFI_DEVICES | ACCESS_LOCAL_NETWORK |
| Standardzugriff | Zugriff auf das lokale Netzwerk ist offen | Der Zugriff auf das lokale Netzwerk ist standardmäßig für alle Apps blockiert, die ihr Ziel-SDK aktualisieren |
| Berechtigungsgruppe | Teil der vorhandenen Berechtigungsgruppe NEARBY_DEVICES | |
Damit die App-Funktionalität nach der Erzwingung nicht beeinträchtigt wird, müssen Anwendungen, die auf SDK 37 oder höher ausgerichtet sind, eine der folgenden Methoden verwenden, um den Zugriff auf das lokale Netzwerk zu verwalten:
Methode A: Datenschutzfreundliche Auswahl verwenden
Verwenden Sie für von Systemen vermittelte Erkennungs- und Verbindungsaufgaben Auswahl, um die Anforderung der umfassenden Laufzeitberechtigung ganz zu vermeiden. Verwenden Sie je nach Anwendungsfall die folgenden Auswahl:
- Medienstreaming: Für Anwendungen, die Google Cast unterstützen, können Sie
die Funktion „Ausgabe wechseln“ verwenden. So können Entwickler Nutzern die Möglichkeit geben, bestimmte Streaminggeräte auszuwählen, ohne dass die App die umfassende
ACCESS_LOCAL_NETWORKBerechtigung anfordern muss. - Allgemeine Konnektivität: Die
NsdManagerenthält eine vom System ausgeführte Dienstauswahl für die mDNS-Erkennung. Anstatt das gesamte Netzwerk zu scannen, zeigt das System ein Dialogfeld an, in dem der Nutzer ein einzelnes Gerät auswählen kann, auf das die App zugreifen soll.
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
}
})
Methode B: Laufzeitberechtigung anfordern (umfassender Zugriff)
Diese Methode ist für komplexe Anwendungsfälle wie die Heimautomatisierung oder die Verwaltung von IoT-Geräten erforderlich, die einen umfassenden, dauerhaften Zugriff auf das lokale Netzwerk benötigen.
Berechtigung im Manifest deklarieren: Deklarieren Sie
ACCESS_LOCAL_NETWORKexplizit in der DateiAndroidManifest.xml.Berechtigung zur Laufzeit anfordern:Bevor Anwendungen versuchen, auf das lokale Netzwerk zuzugreifen, müssen sie prüfen, ob die Berechtigung erteilt wurde. Wenn nicht, müssen sie
Activity.requestPermission()aufrufen, um die Standardaufforderung des Systems auszulösen.Szenario mit vorab erteilter Berechtigung:Die Berechtigung
ACCESS_LOCAL_NETWORKist Teil der BerechtigungsgruppeNEARBY_DEVICES. Wenn ein Nutzer bereits eine andere Berechtigung in dieser Gruppe erteilt hat (z. B. Bluetooth-Berechtigungen), wird er nicht noch einmal nach dem Zugriff auf das lokale Netzwerk gefragt.Ablehnung und Widerruf verarbeiten:Apps müssen Fälle angemessen verarbeiten, in denen der Nutzer die Anfrage ablehnt oder die Berechtigung später in den Systemeinstellungen widerruft. In solchen Fällen wird der Traffic im lokalen Netzwerk blockiert.
Strategie für den Zähler für das Zurücksetzen von Berechtigungsanfragen
Die Plattform implementiert eine Strategie zum Zurücksetzen des Zählers, die Szenarien berücksichtigt, in denen
die vorherige Ablehnung der Berechtigungsgruppe NEARBY_DEVICES
(die jetzt ACCESS_LOCAL_NETWORK umfasst) verhindert hat, dass die App nach einer angemessenen Begründung nach der Berechtigung gefragt hat. Dieser Mechanismus
bietet der App zusätzliche Möglichkeiten, die requestPermission()
API aufzurufen, wodurch der Zähler für die Ablehnung der ACCESS_LOCAL_NETWORK
Berechtigung zurückgesetzt wird. So kann der Nutzer noch einmal angesprochen werden, insbesondere wenn die erste Ablehnung erfolgte, bevor die App die Notwendigkeit des Zugriffs auf das lokale Netzwerk für ihre Hauptfunktionen erläutern konnte.
Geteiltes Berechtigungsmodell
Die Berechtigung für das lokale Netzwerk verwendet eine Migrationsstrategie für geteilte Berechtigungen, um neue und ältere Anwendungen je nach Ziel-SDK unterschiedlich zu behandeln.
| Kategorie | Ziel-SDK-Level | Verhalten beim Zugriff auf das lokale Netzwerk | Erforderliche Maßnahmen für Entwickler |
|---|---|---|---|
| Neue Apps / Aktualisierte Apps | >= 37 (Android 17) | Standardmäßig blockiert | Laufzeitberechtigung ACCESS_LOCAL_NETWORK deklarieren und anfordern |
| Ältere Apps | < 37 | Apps mit der Berechtigung INTERNET erhalten eine implizite Berechtigung für ACCESS_LOCAL_NETWORK, sodass sie den Zugriff behalten. Dies ist vorübergehend und wird standardmäßig blockiert, sobald das Ziel-SDK der App auf 37 aktualisiert wird. |
Es sind keine sofortigen Codeänderungen erforderlich. Fordern Sie ACCESS_LOCAL_NETWORK nicht zur Laufzeit an, bevor Sie auf SDK 37 ausgerichtet sind. |
LNP-Strategie nach Anwendungsfall
Streaming:Für Streamingfunktionen ist die am besten geeignete und datenschutzfreundlichste Strategie die Verwendung der Funktion „Ausgabe wechseln“. Mit dieser Methode kann das System die Erkennung und Verbindung im lokalen Netzwerk im Namen des Nutzers verarbeiten, sodass die App die Berechtigung
ACCESS_LOCAL_NETWORKnicht anfordern muss.Browser:Die Fehlerbehandlung erfordert je nach Protokoll unterschiedliche Ansätze. UDP-Fehler führen zum Fehlercode
EPERM. Bei TCP-Verbindungen sollten Browser die NDK-APIandroid_getnetworkblockedreason(int sockFd)verwenden, um zu ermitteln, ob ein Paket von LNP blockiert wurde. Diese API gibtANDROID_NETWORK_BLOCKED_REASON_LNPzurück.Andere Anwendungsfälle (z. B. IoT) : Anwendungen, die Geräte mit mDNS finden, sollten
android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKERverwenden, um Geräte ohne Berechtigung zu finden, undNsdManager#registerServiceInfoCallback/NsdManager#resolveService, um IP-Adressen zu erhalten. Für Verbindungen zu IP-Adressen, die auf diese Weise abgerufen werden, ist dieACCESS_LOCAL_NETWORKBerechtigung nicht erforderlich.
Für Anwendungen, die eine direkte Kommunikation im lokalen Netzwerk erfordern und keine von Systemen vermittelten Auswahl verwenden können, empfiehlt sich die Strategie für den Zähler für das Zurücksetzen von Berechtigungen, wenn sie auf Android 17 (SDK 37) oder höher ausgerichtet sind. Wenn die
ACCESS_LOCAL_NETWORK Berechtigung vom Nutzer widerrufen wird, bietet dieser Mechanismus
der App zusätzliche Möglichkeiten, die Berechtigung noch einmal anzufordern,
sodass Entwickler dem Nutzer eine klarere Begründung geben können.
Anleitung für Android 16
So aktivieren Sie die Einschränkungen für das lokale Netzwerk:
- Flashen Sie Ihr Gerät mit einem Build mit Android 16 Beta 3 oder höher.
- Installieren Sie die zu testende App.
Aktivieren oder deaktivieren Sie die Appcompat-Konfiguration mit adb.
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>Starten Sie das Gerät neu.
Der Zugriff Ihrer App auf das lokale Netzwerk ist jetzt eingeschränkt und jeder Versuch, auf das lokale Netzwerk zuzugreifen, führt zu Socket-Fehlern.
Wenn Sie APIs verwenden, die Vorgänge im lokalen Netzwerk außerhalb Ihres App-Prozesses ausführen (z. B. NsdManager), sind sie während der Aktivierung nicht betroffen.
Um den Zugriff wiederherzustellen, müssen Sie Ihrer App die Berechtigung für NEARBY_WIFI_DEVICES erteilen.
- Die App muss die Berechtigung
NEARBY_WIFI_DEVICESin ihremmanifestdeklarieren. - Gehen Sie zu den Einstellungen > Apps > [App-Name] > Berechtigungen > Geräte in der Nähe > Zulassen.
Der Zugriff Ihrer App auf das lokale Netzwerk sollte jetzt wiederhergestellt sein und alle Ihre Szenarien sollten wie vor der Aktivierung der App funktionieren. So wirkt sich das auf den App-Netzwerktraffic aus.
| Berechtigung | Ausgehende LAN-Anfrage | Ausgehende/eingehende Internetanfrage | Eingehende LAN-Anfrage |
|---|---|---|---|
| Gewährt | Funktioniert | Funktioniert | Funktioniert |
| Nicht gewährt | Fehler | Funktioniert | Fehler |
Verwenden Sie den folgenden Befehl, um die Appcompat-Konfiguration zu deaktivieren:
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
Fehler
Wenn eine Anfrage für den Zugriff auf das lokale Netzwerk aufgrund fehlender Berechtigungen fehlschlägt:
Bei TCP-Verbindungen tritt in der Regel ein Zeitüberschreitungsfehler auf.
UDP-Fehler und allgemeine Berechtigungsablehnungen führen in der Regel zum Fehlercode EPERM.
Fehler
Melden Sie Fehler und geben Sie Feedback zu folgenden Themen:
- Abweichungen beim LAN-Zugriff (Sie sind der Meinung, dass ein bestimmter Zugriff nicht als Zugriff auf das lokale Netzwerk betrachtet werden sollte)
- Fehler, bei denen der LAN-Zugriff blockiert werden sollte, aber nicht blockiert wird
- Fehler, bei denen der LAN-Zugriff nicht blockiert werden sollte, aber blockiert wird
Folgendes sollte von dieser Änderung nicht betroffen sein:
- Internetzugriff
- Mobilfunknetz