Divulgación: seguimiento encubierto web-a-aplicación vía localhost en Android
Actualización: A partir del 3 de junio de 2025 (07:45 CEST), el script del píxel de Meta/Facebook ya no envía paquetes ni solicitudes a localhost. El código responsable de enviar la cookie _fbp ha sido casi completamente eliminado.
Fuente original: Local Mess – Covert Web-to-App Tracking via Localhost on Android :contentReference[oaicite:1]{index=1}
Investigadores han revelado un nuevo método de seguimiento por parte de Meta y Yandex, que podría afectar a miles de millones de usuarios de Android. Se ha descubierto que apps nativas de Android —incluyendo Facebook, Instagram, y varias apps de Yandex como Maps y Browser— escuchan silenciosamente en puertos fijos locales para propósitos de seguimiento. :contentReference[oaicite:2]{index=2} Estas apps nativas reciben metadatos del navegador, cookies y comandos de los scripts del Píxel de Meta y de Yandex Metrica incrustados en miles de sitios web. Estos JavaScript cargados en los navegadores móviles se comunican silenciosamente con apps nativas en el mismo dispositivo mediante sockets en localhost. :contentReference[oaicite:3]{index=3} Como las apps nativas acceden programáticamente a identificadores del dispositivo (como el ID publicitario de Android —AAID) o gestionan identidades de usuario en el caso de las apps de Meta, este método permite que dichas organizaciones vinculen sesiones de navegación móvil y cookies web con identidades de usuario, desanonimizando usuarios. :contentReference[oaicite:4]{index=4} Este método de compartición web-a-app de identificadores evade las protecciones de privacidad habituales como borrar cookies, modo incógnito y los controles de permisos de Android. Aún peor, abre la puerta a apps potencialmente maliciosas que podrían interceptar la actividad web de los usuarios. :contentReference[oaicite:5]{index=5}
¿Cómo funciona esto?
Aunque existen diferencias sutiles entre la forma en que Meta y Yandex vinculan contextos web y móviles, esencialmente ambos abusaron del acceso sin control a sockets de localhost. El sistema operativo Android permite que cualquier app instalada con permiso INTERNET abra un socket de escucha en la interfaz de loopback (127.0.0.1). Los navegadores que se ejecutan en el mismo dispositivo también pueden acceder a esta interfaz sin mediación del usuario o del sistema. :contentReference[oaicite:6]{index=6} Esto permite que JavaScript incrustado en páginas web se comunique con apps nativas de Android y comparta identificadores y hábitos de navegación, conectando identificadores web efímeros con IDs de app nativa de larga duración usando APIs web estándar. :contentReference[oaicite:7]{index=7}
Meta/Facebook Pixel compartiendo la cookie _fbp de la web a apps nativas de Meta
El script del Píxel de Meta, cuando se carga en un navegador web móvil Android, transmite la cookie _fbp de primera parte mediante WebRTC a puertos UDP entre 12580–12585 a cualquier app del dispositivo que esté escuchando en esos puertos. Se encontró que las apps de Meta en Android (Facebook e Instagram) escuchaban en ese rango. :contentReference[oaicite:8]{index=8}
El flujo completo desde la web al nativo y al servidor es el siguiente:
- El usuario abre la app nativa Facebook o Instagram, que luego pasa al fondo y crea un servicio en segundo plano para escuchar en un puerto TCP (12387 o 12388) y un puerto UDP (12580-12585). Usuario debe estar conectado a dichas apps. :contentReference[oaicite:9]{index=9}
- El usuario abre su navegador y visita un sitio web que integra el Píxel de Meta.
- El sitio web puede pedir consentimiento dependiendo de la ubicación del usuario. :contentReference[oaicite:10]{index=10}
- El script del Píxel de Meta envía la cookie _fbp mediante WebRTC (STUN) a la app Instagram o Facebook nativa. :contentReference[oaicite:11]{index=11}
- El script también envía el valor de _fbp en una solicitud HTTPS al dominio
facebook.com/trjunto con otros parámetros como URL de página, metadatos del navegador y tipo de evento (ev). :contentReference[oaicite:12]{index=12} - La app Facebook o Instagram recibe la cookie _fbp del JavaScript del navegador y transmite ese valor como una mutación GraphQL junto con otros identificadores persistentes de usuario al servidor de Meta, vinculando la ID web _fbp con la cuenta de Facebook o Instagram. :contentReference[oaicite:13]{index=13}
Imágenes relevantes



Yandex empleando comunicaciones vía localhost desde 2017
El script de Yandex Metrica inicia solicitudes HTTP con parámetros largos y opacos a localhost mediante puertos TCP 29009, 29010, 30102 y 30103. Nuestra investigación reveló que apps de Yandex —como Yandex Maps, Yandex Browser, Yandex Search— también escuchan activamente en esos puertos. :contentReference[oaicite:14]{index=14} Además, nuestro análisis indica que el dominio yandexmetrica[.]com está resolviendo a la dirección loopback 127.0.0.1, y el script de Yandex Metrica transmite datos mediante HTTPS a puertos locales 29010 y 30103. Esta elección de diseño complica los mecanismos de detección convencionales. :contentReference[oaicite:15]{index=15}
La app nativa actúa como un proxy para recoger identificadores específicos de Android (como la AAID) y transferirlos al contexto del navegador mediante sockets de localhost. A diferencia del caso de Meta, la agregación y subida de los identificadores se hace desde el navegador (script) hacia los servidores de Yandex. :contentReference[oaicite:16]{index=16}
El flujo completo web-a-nativo-y-servidor se describe así:
- El usuario abre una de las apps nativas de Yandex, que luego pasa al fondo y crea un servicio en segundo plano para escuchar en dos puertos HTTP (29009 y 30102) y dos puertos HTTPS (29010 y 30103). :contentReference[oaicite:17]{index=17}
- El usuario abre su navegador y visita un sitio que integra el script de Yandex Metrica.
- El script envía una solicitud a sus servidores para obtener parámetros ofuscados. :contentReference[oaicite:18]{index=18}
- Esos parámetros se envían al localhost mediante HTTP/HTTPS. Esto sucede en una URL que contiene 127.0.0.1 o el dominio
yandexmetrica[.]com. :contentReference[oaicite:19]{index=19} - El SDK de la app recibe esos parámetros y responde al script del navegador con una respuesta 200 OK que contiene identificadores del dispositivo codificados en Base64. :contentReference[oaicite:20]{index=20}
- El script de Yandex Metrica en el sitio web recibe esos IDs y los envía a sus servidores junto con los parámetros ofuscados. :contentReference[oaicite:21]{index=21}
Imágenes relevantes



Sitios afectados
Según BuiltWith, el Píxel de Meta está integrado en más de 5,8 millones de sitios web; Yandex Metrica está en cerca de 3 millones. :contentReference[oaicite:22]{index=22}
En una campaña de rastreo del top 100 000 sitios (basado en CrUX) desde servidores en Frankfurt y Nueva York, se encontraron:
- Para el Píxel de Meta: 17 223 sitios EE.UU., 15 677 Europa.
- Para Yandex Metrica: 1 312 EE.UU., 1 260 Europa. :contentReference[oaicite:23]{index=23}
Incluso en modalidad “sin consentimiento” (no aceptar cookies) los números también muestran un impacto significativo (Meta: 13 468 sitios EE.UU., 11 890 Europa; Yandex: 1 095 EE.UU., 1 064 Europa). :contentReference[oaicite:24]{index=24}
¿Cuándo empezó esto?
| Actor | Método | Inicio | Puertos |
|---|---|---|---|
| Yandex | HTTP | febrero 2017 | 29009, 30102 :contentReference[oaicite:25]{index=25} |
| Yandex | HTTPS | mayo 2018 | 29010, 30103 :contentReference[oaicite:26]{index=26} |
| Meta | HTTP | septiembre-octubre 2024 | 12387 :contentReference[oaicite:27]{index=27} |
| Meta | WebSocket | noviembre 2024-enero 2025 | 12387 :contentReference[oaicite:28]{index=28} |
| Meta | WebRTC STUN | noviembre 2024 | 12580-12585 :contentReference[oaicite:29]{index=29} |
| Meta | WebRTC TURN | mayo 2025 | 12586-12591 :contentReference[oaicite:30]{index=30} |
Vectores de abuso
Este novedoso método de seguimiento explota el acceso sin restricciones a sockets de localhost dentro de Android, incluyendo navegadores móviles. Funciona sin el conocimiento del usuario, ya que los controles de privacidad actuales (modo incógnito, borrado de cookies, reinicio del ID publicitario de Android, etc) son insuficientes para mitigarlo. :contentReference[oaicite:31]{index=31}
Aunque la comunicación vía localhost puede usarse para propósitos legítimos (desarrollo web), la comunidad de investigación ha señalado que los sockets localhost pueden convertirse en un vector de fuga de datos y seguimiento persistente. :contentReference[oaicite:32]{index=32}
Divulgación responsable
Nuestra divulgación responsable a los principales navegadores Android llevó a varios parches para mitigar este problema; algunos ya desplegados, otros en desarrollo. Agradecemos la colaboración de Chrome, Mozilla Firefox, Brave y DuckDuckGo Browser. :contentReference[oaicite:33]{index=33}
Pero, más allá de estos parches temporales, resolver completamente el problema requerirá un conjunto más amplio de medidas: controles visibles al usuario sobre acceso a localhost, políticas de plataforma más estrictas, y mejoras en los mecanismos de IPC de Android orientados a conexiones localhost. :contentReference[oaicite:34]{index=34}
¿Saben los propietarios de sitios web?
No encontramos documentación pública por parte de Meta o Yandex que describa este método específico de comunicación vía localhost. En los foros de desarrolladores de Facebook se observaron quejas de propietarios de sitios preguntando por qué el script del Píxel accede a localhost en Android, sin respuesta oficial de Meta. :contentReference[oaicite:35]{index=35}
¿Saben los usuarios finales?
Es plausible que los usuarios que navegan en Internet y visitan sitios que integran los scripts de Meta o Yandex no sean plenamente conscientes de este comportamiento.
De hecho el método funciona incluso si el usuario:
- No está conectado a Facebook, Instagram o Yandex en el navegador móvil. :contentReference[oaicite:36]{index=36}
- Usa modo incógnito. :contentReference[oaicite:37]{index=37}
- Borra sus cookies u otro estado de navegación. :contentReference[oaicite:38]{index=38}
Este método de seguimiento elude el aislamiento y particionamiento normal de Android y las protecciones habituales.
Preguntas y Respuestas
- Q: ¿Por qué Meta dejó de usar esta técnica el día de la publicación pública?
A: No lo sabemos con certeza, pero nos alegramos de ver que los usuarios de Android ya no están afectados por esta forma de abuso (por ahora). :contentReference[oaicite:39]{index=39} - Q: ¿Este estudio es revisado por pares?
A: Nuestros hallazgos fueron confirmados por algunas partes a las que divulgamos, pero el estudio no es aún peer-reviewed. Decidimos no demorar la publicación pública dado el carácter urgente del abuso. :contentReference[oaicite:40]{index=40} - Q: ¿Meta o Yandex documentaron este método en su documentación técnica?
A: No encontramos ninguna documentación pública que describa esta técnica de comunicación via localhost. En los foros de desarrolladores de Facebook hubo quejas sin respuesta oficial. :contentReference[oaicite:41]{index=41} - Q: ¿Esto afecta solo a usuarios de Android? ¿Y a iOS u otras plataformas?
A: Solo tenemos evidencia empírica de esta vinculación web-a-app de Meta y Yandex en usuarios móviles Android. No se observó abuso en iOS o en las pruebas que hicimos en otras plataformas. Es posible que técnicamente pudiera ocurrir también en iOS, pero no lo hemos investigado exhaustivamente. :contentReference[oaicite:42]{index=42}
Agradecimientos
Agradecemos la colaboración de los navegadores mencionados. Especial reconocimiento a:
- Álvaro Feal, por su ayuda en el análisis de apps móviles.
- Tom Van Goethem, por gestionar la divulgación.
- Bart Preneel, por su apoyo en medios.
- El proyecto HTTP Archive, por los datos públicos que permitieron este análisis. :contentReference[oaicite:43]{index=43}
Contacto y autores
Contacto: [email protected]
Autores (alfabéticamente):
- Aniketh Girish (IMDEA Networks)
- Gunes Acar (Radboud University, Digital Security Group & iHub)
- Narseo Vallina-Rodriguez (IMDEA Networks)
- Nipuna Weerasekara (IMDEA Networks)
- Tim Vlummens (COSIC, KU Leuven)
Recursos adicionales
- Vídeo que muestra a Yandex enviando solicitudes a localhost.
- Vídeo que muestra al Píxel de Meta enviando solicitudes STUN.
- Imagen que muestra los parámetros del Píxel de Meta para puertos y protocolos de localhost.
- Imagen que muestra la técnica SDP Munging usada por el Píxel de Meta.
