Hay mucha discusión sobre cómo ver qué aplicación solicita conexión de red. He probado las siguientes aplicaciones:
tcapturepacket
wifi monitor
connection tracker
Sin embargo, ninguno de ellos fue útil. Por ejemplo, durante un breve período de tiempo, cargué un archivo pcap de 30 KB que se puede ver aquí . Todavía no he descubierto qué aplicación solicita conexión y a dónde intenta conectarse.
También traté de mirar adb logcat
, pero no encontré información útil. Tal vez algo se ha perdido aquí. ¿Alguna conjetura?
Si tiene un teléfono rooteado, busque nethogs
(para monitoreo en vivo) o iptables
(para obtener estadísticas) herramientas de línea de comandos. El uso de aplicaciones basadas en estadísticas de VPN o Android es la única solución no root posible. O consulte esta respuesta para una solución basada en logcat
/ .dumpsys
En primer lugar, el seguimiento de un UID o PID de un flujo de red no es sencillo porque no están relacionados con la red sino con los parámetros relacionados con el sistema operativo. Propuestas y proyectos abandonados existen.
Android asigna un UID único a cada aplicación instalada al igual que cada usuario humano en Linux tiene un UID. Entonces podemos capturar paquetes enviados por un UID específico a través de las interfaces de red para rastrear el uso.
Ahora, ¿cómo podemos capturar el tráfico de red? La mayoría de los rastreadores de red utilizan la familia libpcap de bibliotecas independientes del sistema para este propósito. Es compatible con BSD Packet Filter (BPF) para el filtrado de paquetes en el núcleo. Algunas utilidades populares que se usan libpcap
incluyen tcpdump
, nmap
, tshark/wireshark
, dumpcap
, nethogs
etc. La aplicación de Android Network Utilities y otras también hacen uso de tcpdump
.
Sin embargo, la información de UID no se propaga a través del canal AF_PACKET
/PF_PACKET
pcap
que se usa en la capa 2 de OSI . Entonces, lo que podemos hacer aquí es utilizar los sockets de red (combinación de IP y puerto) creados y utilizados por una aplicación. netstat -tup
o ss -tup
mostrará todos los enchufes de red con conexiones activas/establecidas. Ambas herramientas están disponibles en Android (o puede obtener un binario estático), ss
es la más nueva. La información de socket vs. UID también se puede leer directamente desde /proc/net/{tcp,udp}
. La aplicación de Android Netstat Plus funciona con el mismo principio. Esto proporcionará la dirección local (socket) que utiliza un proceso.
Una vez que sabemos qué sockets está utilizando una aplicación (UID), tcpdump -i wlan0 src <IP> and port <PORT>
volcaremos todo el tráfico originado en ese proceso.
De manera similar, también se puede usar un enchufe remoto (si no está conectado a varias aplicaciones) para filtrar los resultados.
LIMITACIONES:
Sin embargo, hay algunos problemas con este enfoque:
NetHogs atraviesaprocfs
y hace frente a las limitaciones anteriores (aunque no siempre con mucho éxito):
Las deficiencias descritas anteriormente de una herramienta de Capa 2 se pueden mitigar utilizando iptables LOG
oNFLOG
. La capa 2 está justo encima de la capa física, es decir, es lo último que encuentran los paquetes antes de abandonar el dispositivo. Es por eso que, al estar en la capa de enlace de datos y trabajar en un nivel más bajo de la pila de red, BPF es una especie de mecanismo de filtrado de paquetes sin estado en comparación con netfilter
/ iptables
que funciona en la capa 3 de OSI (más cerca de los programas de espacio de usuario). Por lo tanto iptables
, también puede obtener información de la pila TCP/IP ( Capa 4 ). Filtra paquetes en función de los UID de su creador mediante un módulo owner
que interactúa con los sockets para encontrar la propiedad del paquete.
iptables
escribe en el registro del kernel que se puede leer usando dmesg
o logcat
. El UID de una aplicación se puede obtener usando alguna aplicación o leer desde /data/system/packages.list
o pm list packages -U
.
# iptables -I OUTPUT -m owner --uid-owner <UID> -j LOG --log-level 7 --log-prefix 'SNIFFER: ' --log-uid
# dmesg -w | grep SNIFFER
La salida se puede guardar en un archivo y formatear usando herramientas como grep
, awk
, printf
etc. Network Log , aunque está muy desactualizado, funciona de manera similar. AFWall+ es un cortafuegos iptables
que puede registrar/notificar la actividad de red de una aplicación cuando la aplicación está bloqueada.
El único inconveniente de este enfoque es que no se puede utilizar para rastrear el tráfico de un proceso cuando hay varios procesos ejecutándose con el mismo UID . iptables
no puede capturar paquetes basados en PID. Decidieron no utilizar iptables
con procesos porque el proceso se inicia antes de que se bloquee o detecte, y el programa podría generar fácilmente un proceso secundario con un nuevo PID que no se bloquearía ni detectaría. Además, los PID se crean y destruyen tan rápido como los sockets. Por lo tanto, siempre hay espacio para que se filtre el tráfico.
owner
El módulo no funcionará para el tráfico entrante o reenviado porque los paquetes IP no contienen información de propiedad. Para medir el uso de la red entrante/saliente por aplicación, Android parcheó el kernel para incluir qtaguid
el módulo. Podemos leer estadísticas de /proc/net/xt_qtaguid/stats
. Con algunas secuencias de comandos de shell, obtenga el uso de datos en vivo desde el reinicio:
Sin embargo, en Android 9+, qtaguid
se está reemplazando con BPF extendido (que también está planeado para reemplazar netfilter
el marco en el kernel de Linux). Relacionado: ¿Qué proceso es responsable de capturar el uso de datos?
Una alternativa es colocar el tráfico saliente de una aplicación en un NFLOG
grupo y luego tcpdump captura los paquetes de ese grupo:
# iptables -I OUTPUT -m owner --uid-owner 1000 -j NFLOG --nflog-group 30
# tcpdump -i nflog:30
Esto es para garantizar que nos acerquemos a la capa física cuando rastreamos el tráfico saliente. Pero aún puede dar falsos positivos, por ejemplo, si los paquetes se descartan o se pierden en las tablas de enrutamiento. Es por eso que los sniffers funcionan en la capa 2 de OSI. O incluso mejor es mirar desde el exterior, por ejemplo, usando un servidor proxy/VPN o en una PC conectada o en un enrutador. Pero esto no capturará el tráfico por UID/PID.
strace
el seguimiento syscalls
relacionado con la actividad de red de un proceso. force_bind y tracedump también funcionan con el mismo principio. El subsistema de auditoría del kernel de Linux se puede usar para lo mismo.iptables
NETFILTER_XT_MATCH_CGROUP
para rastrear el tráfico de ciertos procesos.Network Namespaces
para aislar procesos y leer el uso de datos por interfaz. nstrace funciona con el mismo principio.SELinux
puede seccomp
usarse para restringir la capacidad de los procesos para crear sockets definiendo restringido policies
y suprimiendo syscalls
respectivamente.La mayoría de estas no son opciones directamente viables para Android y requieren configuraciones avanzadas.
Algunas aplicaciones como NetGuard usan la API VpnService de Android para bloquear el tráfico en la capa 3 (interfaz TUN). La aplicación puede "notificar cuando una aplicación accede a Internet" . La captura y el seguimiento por aplicación ( 1 , 2 ) es posible mediante la API de VPN, ya que Android utiliza UIDs
y SOcket_MARKs
( 1 , 2 ) para controlar el tráfico en la política de enrutamiento de la red ( RPDB ), justo antes de abandonar el dispositivo.
Algunas aplicaciones como NetLive hacen uso de NetworkStatsManager , pero retrasa el uso en tiempo real y "no se actualiza lo suficientemente rápido" , está "destinado a proporcionar datos históricos" .
NOTA: No tengo ninguna afiliación con ninguna aplicación a la que se haga referencia.
RELACIONADO:
Con PCAPdroid puede ver las conexiones individuales realizadas por las aplicaciones. Es una herramienta de código abierto desarrollada por mí que funciona sin root (la raíz es opcional). Tiene muchas características interesantes para la seguridad y privacidad de los usuarios, échale un vistazo.
Si solo desea rastrear qué aplicación realiza conexiones a qué servidor, le recomiendo la aplicación
Net Monitor . Actúa como una VPN local y, por lo tanto, puede detectar todo el tráfico de la red. Además, muestra qué aplicación ha realizado la solicitud de red (incluido el host remoto, los puertos e incluso si la conexión es simple o SSL/TLS).
Por lo tanto, si usa esta aplicación en combinación con las herramientas de captura que ya mencionó en su pregunta, debería poder rastrear todas y cada una de las conexiones de red.
Guntram Blohm