6 votes

Comment visualiser le trafic réseau demandé par une application spécifique ?

Il y a beaucoup de discussions sur la façon de voir quelle application demande une connexion réseau. J'ai essayé les applications suivantes :

tcapturepacket
wifi monitor
connection tracker

Cependant, aucune d'entre elles n'était utile. Par exemple, pendant une courte période de temps, j'ai téléchargé un fichier pcap de 30KB qui peut être visualisé aquí . Je n'ai toujours pas trouvé quelle application demande la connexion et à quoi elle essaie de se connecter.

J'ai aussi essayé de regarder adb logcat mais n'a pas trouvé d'informations utiles. Peut-être que quelque chose a été oublié ici. Une idée ?

11voto

Irfan Latif Points 16863

Si vous avez un téléphone rooté, optez pour nethogs (pour le contrôle en direct) ou iptables (pour obtenir des statistiques) outils en ligne de commande. L'utilisation d'un VPN ou d'applications Android basées sur les statistiques est la seule solution possible sans root. Ou consultez cette réponse pour un logcat / dumpsys solution basée sur la technologie.


Tout d'abord, le suivi de l'UID ou du PID d'un flux réseau n'est pas simple car ces paramètres ne sont pas liés au réseau mais au système d'exploitation. Propositions y projets abandonnés existent.

Android attribue un UID unique à chaque application installée, tout comme chaque utilisateur humain sous Linux possède un UID. Nous pouvons donc capturer les paquets envoyés par un UID spécifique sur les interfaces réseau pour suivre son utilisation.

TCPDUMP :

Maintenant, comment pouvons-nous capturer le trafic réseau ? La plupart des renifleurs de réseau utilisent libpcap famille de bibliothèques indépendantes du système à cette fin. Elle prend en charge Filtre à paquets BSD (BPF) pour le filtrage des paquets dans le noyau. Certains utilitaires populaires qui utilisent libpcap inclure tcpdump , nmap , tshark/wireshark , dumpcap , nethogs etc. Application Android Utilitaires de réseau et d'autres font également appel à tcpdump .

Toutefois, l'information sur l'UID n'est pas propagée par le biais de l'interface utilisateur. AF_PACKET / PF_PACKET canal qui pcap utilise à Couche 2 de l'OSI . Ce que nous pouvons faire ici, c'est utiliser les sockets réseau (combinaison d'IP et de port) créés et utilisés par une application. netstat -tup ou ss -tup affichera tous les sockets réseau avec des connexions actives/établies. Les deux outils sont disponibles sur Android (ou vous pouvez obtenir un binaire statique), ss est le plus récent. Socket vs. UID Les informations peuvent également être lues directement à partir de /proc/net/{tcp,udp} . Application Android Netstat Plus fonctionne sur le même principe. Cela fournira l'adresse locale (socket) utilisée par un processus.

Une fois que nous savons quels sockets sont utilisés par une application (UID), tcpdump -i wlan0 src <IP> and port <PORT> va vider tout le trafic issu de ce processus.
De même, une prise à distance (si elle n'est pas connectée par plusieurs applications) peut également être utilisée pour filtrer les résultats.

LIMITES :

Toutefois, cette approche pose quelques problèmes :

  • Les applications Android lancent généralement plusieurs processus à la fois, en parallèle, c'est-à-dire plusieurs PIDs travaillant sous le même UID . Nous devons donc capturer le trafic de tous les processus.
  • Les applications continuent à créer et à supprimer des sockets. Garder la trace de des prises de courant qui changent continuellement est presque impossible, surtout lorsqu'un grand nombre d'applications accèdent simultanément au réseau.
  • Il existe - bien que rarement - une possibilité que les les sockets sont partagés par plusieurs processus sur les systèmes d'exploitation de type UNIX. Les sockets partagés distants tels que UDP/53, utilisés pour la résolution DNS, ne peuvent pas être suivis par un seul processus. Cela affaiblit encore plus l'approche.

NetHogs traverse procfs et s'adapte aux limitations susmentionnées (bien que cela ne soit pas toujours très réussi) :

IPTABLES :

Les inconvénients d'un outil de couche 2 décrits ci-dessus peuvent être atténués par les moyens suivants iptables LOG ou NFLOG . Couche 2 se situe juste au-dessus de la couche physique, c'est-à-dire que c'est la dernière chose que les paquets rencontrent avant de quitter le dispositif. C'est pourquoi, se situant au niveau de la couche liaison de données et travaillant à un niveau inférieur de la pile réseau, le BPF est une sorte de mécanisme de filtrage de paquets sans état, par rapport aux mécanismes suivants netfilter / iptables qui travaille à l'OSI Couche 3 (plus proche des programmes en espace utilisateur). Ainsi, iptables peut également obtenir des informations de la pile TCP/IP ( Couche 4 ). Il filtre les paquets sur la base des UID de leurs créateurs en utilisant le module owner que interagit avec les sockets pour trouver la propriété des paquets.

iptables écrit dans le journal du noyau qui peut être lu en utilisant dmesg ou logcat . L'UID d'une application peut être obtenu à l'aide d'une application ou lu à partir de l'application. /data/system/packages.list ou 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 sortie peut être enregistrée dans un fichier et formatée à l'aide d'outils tels que grep , awk , printf etc. Journal du réseau - bien que très obsolète - fonctionne de manière similaire. AFWall+ est un pare-feu basé sur iptables qui peut enregistrer / notifier l'activité réseau d'une application lorsque celle-ci est bloquée.

Le seul inconvénient de cette approche est qu'elle ne peut pas être utilisée pour renifler le trafic d'un seul processus lorsqu'il y a plusieurs processus fonctionnant avec le même UID . iptables ne peut pas capturer les paquets basés sur les PIDs. Ils ont décidé à ne pas utiliser iptables avec des processus car le processus est démarré avant d'être bloqué/reniflé, et le programme pourrait facilement créer un processus enfant avec un nouveau PID qui ne serait pas bloqué/reniflé. De plus, les PIDs sont créés et détruits aussi rapidement que les sockets. Il y a donc toujours une possibilité de fuite de trafic.

QTAGUID :

owner ne fonctionnera pas pour trafic entrant ou transféré car les paquets IP ne portent aucune information de propriété. Pour mesurer l'utilisation du réseau entrant/sortant par application, Android a patché le noyau pour y inclure qtaguid module. Nous pouvons lire les statistiques de /proc/net/xt_qtaguid/stats . Avec quelques scripts shell, obtenez l'utilisation des données en direct depuis le redémarrage :

Cependant sur Android 9+, qtaguid est en train de a remplacé をもって étendu BPF (qui est également prévu pour remplacer netfilter dans le noyau Linux). Relié : Quel processus est responsable de la capture de l'utilisation des données ?

IPTABLES + TCPDUMP :

Une autre solution consiste à placer le trafic sortant d'une application dans un fichier de type NFLOG et plus tard captures tcpdump les paquets de ce groupe :

# iptables -I OUTPUT -m owner --uid-owner 1000 -j NFLOG --nflog-group 30
# tcpdump -i nflog:30

Cela permet de s'assurer que nous nous rapprochons de la couche physique lorsque nous reniflons le trafic sortant. Mais cela peut toujours donner faux positifs Par exemple, si des paquets sont abandonnés ou perdus dans les tables de routage. C'est pourquoi renifleurs travaillent au niveau de la couche 2 de l'OSI. Ou encore mieux, vous pouvez observer depuis l'extérieur, par exemple en utilisant un serveur proxy / VPN, un PC connecté ou un routeur. Mais cela ne permettra pas de capturer le trafic sur la base de chaque UID/PID.

AUTRES OPTIONS :

  • Utilisez des outils de diagnostic comme strace pour suivre syscalls lié à l'activité réseau d'un processus. force_bind y tracedump fonctionnent également sur le même principe. Le noyau de Linux sous-système d'audit peut être utilisé pour la même chose.
  • Utilice Classification du réseau cgroup をもって iptables NETFILTER_XT_MATCH_CGROUP pour renifler le trafic de certains processus.
  • Utilice Network Namespaces pour isoler les processus et lire l'utilisation des données sur la base de chaque interface. nstrace fonctionne sur le même principe.
  • Si l'intention est entièrement de bloquer le trafic provenant de certains processus, SELinux y seccomp peut être utilisé pour restreindre la capacité des processus à créer des sockets en définissant des règles d'accès restreintes. policies et en supprimant syscalls respectivement.

La plupart de ces options ne sont pas directement viables pour Android et nécessitent des configurations avancées.


Les API d'Android (OPTIONS NON-Root) :

Certaines applications comme NetGuard utiliser VpnService API d'Android pour bloquer le trafic à la couche 3 (interface TUN). L'application peut "notifier quand une application accède à l'internet" . Capture et suivi par application ( 1 , 2 ) est possible en utilisant l'API VPN comme Android utilise UIDs y SOcket_MARKs ( 1 , 2 ) pour contrôler le trafic dans le réseau Politique de routage ( RPDB ), juste avant de quitter le dispositif.

Certaines applications comme NetLive utiliser NetworkStatsManager mais il est en retard sur l'utilisation en temps réel et "ne se met pas à jour assez rapidement" c'est "destiné à fournir des données historiques" .

NOTE : Je n'ai aucune affiliation avec les applications référencées.


RELATION :

1voto

pr0nin Points 353

Si vous voulez seulement savoir quelle application effectue des connexions à quel serveur, je vous recommande l'applicationNet Monitor pour vous. Il agit comme un VPN local et est donc capable de détecter tout le trafic réseau. En outre, il indique quelle application a effectué la requête réseau (y compris l'hôte distant, les ports, et même si la connexion est simple ou SSL/TLS).

Par conséquent, si vous utilisez cette application en combinaison avec les outils de capture que vous avez déjà mentionnés dans votre question, vous devriez être en mesure de retracer chaque connexion réseau.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X