Cualquier app que tenga el permiso INTERNET
puede acceder a los dispositivos de una LAN.
Esto facilita que las apps se conecten a dispositivos locales, pero también tiene implicaciones de privacidad, como la formación de una huella digital del usuario y ser un proxy para la ubicación.
El objetivo del proyecto de protecciones de red local es proteger la privacidad del usuario mediante la restricción del acceso a la red local con un nuevo permiso de tiempo de ejecución.
Impacto
En Android 16, este permiso es una función que se habilita, lo que significa que solo se verán afectadas las apps que lo hagan. El objetivo de la habilitación es que los desarrolladores de apps comprendan qué partes de su app 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 lo siguiente:
- Uso directo o de biblioteca de sockets sin procesar en direcciones de red locales (p.ej., protocolo de descubrimiento de servicios mDNS o SSDP)
- Uso de clases a nivel del framework que acceden a la red local (p.ej., 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 muestran algunos casos comunes:
Operación de red de bajo nivel de la app | Se requiere permiso de red local |
---|---|
Cómo establecer una conexión TCP saliente | sí |
Cómo aceptar una conexión TCP entrante | sí |
Envío de un unicast, multicast o transmisión UDP | sí |
Cómo recibir una transmisión, una multidifusión o una unidifusión UDP entrante | sí |
Estas restricciones se implementan en 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 ellas. Si intentas resolver servicios en la red local (es decir, aquellos con un sufijo .local), se requerirá el 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 o 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:
- Escribe en la memoria flash de tu dispositivo una compilación con Android 16 beta 3 o una versión posterior
- Instala la app que se probará
Cómo activar o desactivar la configuración de Appcompat con adb
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
Reinicia el dispositivo
Ahora, el acceso de tu app a la red local está restringido, y cualquier intento de acceder a ella generará errores de socket. Si usas APIs que realizan operaciones de red local fuera del proceso de tu app (p. ej., 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 manifiesto. - 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 todas las situaciones deberían funcionar como antes de habilitar la app. A continuación, se muestra cómo se verá afectado el tráfico de red de la app.
Permiso | Solicitud de LAN saliente | Solicitud de Internet saliente o entrante | 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 mostrarán en el 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 (no crees que un acceso determinado deba considerarse acceso a "red local")
- Errores en los que se debería bloquear el acceso a la LAN, pero no se hace
- Errores en los que el acceso a la LAN no debería estar bloqueado, pero sí lo está
Este cambio no debería afectar a lo siguiente:
- Acceso a Internet
- Red móvil