Permiso de red local

Cualquier app que tenga el permiso INTERNET puede acceder a los dispositivos de una red de área local (LAN). Esto facilita que las apps se conecten a dispositivos locales, pero también tiene implicaciones para la privacidad, como la formación de una huella digital del usuario y la posibilidad de servir como proxy de la ubicación.

El proyecto de Protecciones de red local tiene como objetivo proteger la privacidad del usuario limitando el acceso a la red local con un nuevo permiso de tiempo de ejecución.

Impacto

Durante Android 16, este permiso será una función opcional, lo que significa que solo se verán afectadas las apps que lo habiliten. El objetivo de la habilitación es que los desarrolladores de apps comprendan qué partes de sus apps dependen del acceso implícito a la red local para que puedan prepararse para protegerlas con permisos en una versión futura de Android.

Las apps se verán afectadas si acceden a la red local del usuario con los siguientes métodos:

  • Uso directo o de biblioteca de sockets sin procesar en direcciones de red locales, por ejemplo, Multicast DNS (mDNS) o Simple Service Discovery Protocol (SSDP)
  • Uso de clases a nivel del framework que acceden a la red local, por ejemplo, NsdManager

Detalles del impacto

El tráfico hacia y desde una dirección de red local requiere permiso de acceso a la red local. En la siguiente tabla, se enumeran algunos casos comunes:

Operación de red de bajo nivel de la app Se requiere permiso de red local
Cómo realizar una conexión TCP saliente
Cómo aceptar una conexión TCP entrante
Envía una transmisión unidifusión, multidifusión o difusión de UDP
Recepción de una unidifusión, multidifusión o transmisión de UDP entrante

Estas restricciones se implementan en lo profundo de la pila de redes y, por lo tanto, se aplican a todas las APIs de redes. Esto incluye los sockets creados en la plataforma o el código administrado, las bibliotecas de redes como Cronet y OkHttp, y cualquier API implementada sobre ellos. Intentar resolver servicios en la red local que tienen un sufijo .local requiere permiso de red local.

Excepciones a las reglas anteriores:

  • Si el servidor DNS de un dispositivo está en una red local, el tráfico hacia él y desde él (en el puerto 53) no requiere permiso de acceso a la red local.
  • Las aplicaciones que usen el Selector de salida como selector integrado en la app no necesitarán permisos de red local (se proporcionará más orientación en una versión posterior).

Orientación

Para habilitar las restricciones de red local, haz lo siguiente:

  1. Escribe en la memoria flash de tu dispositivo una compilación con Android 16 Beta 3 o una versión posterior
  2. Instala la app que se probará
  3. Cómo activar o desactivar la configuración de Appcompat con adb

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. Reinicia el dispositivo

Ahora, el acceso de tu app a la red local está restringido, y cualquier intento de acceder a la red local generará errores de socket. Si usas APIs que realizan operaciones de red local fuera del proceso de tu app (por ejemplo, NsdManager), no se verán afectadas durante la habilitación.

Para restablecer el acceso, debes otorgarle permiso a tu app para NEARBY_WIFI_DEVICES.

  • Asegúrate de que la app declare el permiso NEARBY_WIFI_DEVICES en su manifest.
  • Ve a Configuración > Apps > [Nombre de la aplicación] > Permisos > Dispositivos cercanos > Permitir.

Ahora se debería restablecer el acceso de tu app a la red local, y todos tus casos de uso deberían funcionar como lo hacían antes de habilitar la app. A continuación, se explica cómo se verá afectado el tráfico de la red de aplicaciones.

Permiso Solicitud de LAN saliente Solicitud de Internet entrante o saliente Solicitud de LAN entrante
Concedido Works Works Works
Sin otorgar Errores Works Errores

Usa el siguiente comando para desactivar la configuración de Appcompat.

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

Errores

Los errores que surjan de estas restricciones se devolverán al socket de llamada cada vez que invoque send o una variante de send a una dirección de red local.

Ejemplos de errores:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

Errores

Envía errores y comentarios sobre lo siguiente:

  • Discrepancias en el acceso a la LAN (crees que un determinado acceso no debería considerarse como acceso a la "red local")
  • Errores en los que se debería bloquear el acceso a la LAN, pero no se hace
  • Errores en los que no se debería bloquear el acceso a la LAN, pero se bloquea

Los siguientes elementos no se verán afectados por este cambio:

  • Acceso a Internet
  • Red móvil