Существует много дискуссий о том, как узнать, какое приложение запрашивает сетевое подключение. Я пробовал следующие приложения:
tcapturepacket
wifi monitor
connection tracker
Однако ни один из них не оказался полезным. Например, за короткий промежуток времени я загрузил pcap-файл размером 30 КБ, который можно посмотреть здесь . Тем не менее я не знаю, какое приложение запрашивает соединение и куда оно пытается подключиться.
Я также пытался посмотреть на adb logcat
, но не нашел полезной информации. Возможно, здесь что-то упущено. Есть предположения?
Если у вас есть рутированный телефон, используйте nethogs
(для мониторинга в реальном времени) или iptables
(для получения статистики) инструменты командной строки. Использование приложений, основанных на статистике VPN или Android, является единственным возможным решением без полномочий root. Или обратитесь к этому ответу для решения на основе logcat
/ dumpsys
.
Прежде всего, отслеживание UID или PID сетевого потока не является прямым, потому что они не связаны с сетью, а связаны с параметрами ОС. Предложения и заброшенные проекты действительно существуют.
Android присваивает уникальный UID каждому установленному приложению, точно так же, как каждый человек в Linux имеет UID. Таким образом, мы можем перехватывать пакеты, отправленные определенным UID через сетевые интерфейсы, чтобы отслеживать их использование.
Теперь, как мы можем захватить сетевой трафик? Большинство сетевых снифферов используют для этой цели семейство системно-независимых библиотек libpcap . Он поддерживает пакетный фильтр BSD (BPF) для фильтрации пакетов в ядре. Некоторые популярные утилиты, которые используют, включают libpcap
, tcpdump
, , и т. Д. Сетевые утилиты приложения Android и другие также используют .nmap
tshark/wireshark
dumpcap
nethogs
tcpdump
Однако информация об UID не распространяется через канал AF_PACKET
/PF_PACKET
, который pcap
используется на уровне 2 OSI . Итак, что мы можем здесь сделать, так это использовать сетевые сокеты (комбинацию IP и порта), которые создаются и используются приложением. netstat -tup
или ss -tup
покажет все сетевые сокеты с активными/установленными соединениями. Оба инструмента доступны на Android (или вы можете получить статический двоичный файл), ss
это более новый. Информация о сокетах и UID также может быть напрямую прочитана из файлов /proc/net/{tcp,udp}
. Android-приложение Netstat Plus работает по тому же принципу. Это предоставит локальный адрес (сокет), используемый процессом.
Как только мы узнаем, какие сокеты используются приложением (UID), tcpdump -i wlan0 src <IP> and port <PORT>
мы сбросим весь трафик, исходящий от этого процесса.
Точно так же удаленный сокет (если к нему не подключено несколько приложений) также можно использовать для фильтрации результатов.
ОГРАНИЧЕНИЯ:
Однако есть некоторые проблемы с этим подходом:
NetHogs преодолеваетprocfs
и справляется с вышеуказанными ограничениями (хотя и не всегда очень успешно):
Описанные выше недостатки инструмента уровня 2 можно смягчить с помощью iptables LOG
илиNFLOG
. Уровень 2 находится чуть выше физического уровня, т. е. это последнее, с чем сталкиваются пакеты перед тем, как покинуть устройство. Вот почему, находясь на уровне канала передачи данных и работая на более низком уровне сетевого стека, BPF является своего рода механизмом фильтрации пакетов без сохранения состояния по сравнению с netfilter
/ iptables
, который работает на уровне 3 OSI (ближе к программам пользовательского пространства). Таким образом iptables
, также можно получить информацию из стека TCP/IP ( уровень 4 ). Он фильтрует пакеты на основе их UID создателя, используя модуль owner
, который взаимодействует с сокетами , чтобы найти владельца пакета.
iptables
пишет в журнал ядра, который можно прочитать с помощью dmesg
или logcat
. UID приложения можно получить с помощью какого-либо приложения или прочитать из /data/system/packages.list
или 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
Вывод можно сохранить в файл и отформатировать с помощью таких инструментов, как grep
, awk
, printf
и т. д . Сетевой журнал , хотя и очень устаревший, работает аналогичным образом. AFWall+ — это брандмауэр, основанный на iptables
том, что он может регистрировать/уведомлять сетевую активность приложения, когда приложение заблокировано.
Единственным недостатком этого подхода является то, что его нельзя использовать для прослушивания трафика от одного процесса, когда несколько процессов выполняются с одним и тем же UID . iptables
не может захватывать пакеты на основе PID. Они решили не использовать iptables
с процессами, потому что процесс запускается до того, как он будет заблокирован/сниффен, и программа может легко создать дочерний процесс с новым PID, который не будет заблокирован/сниффен. Также PID создаются и уничтожаются так же быстро, как и сокеты. Таким образом, всегда есть место для утечки трафика.
owner
модуль не будет работать для входящего или переадресованного трафика, поскольку IP-пакеты не содержат информации о владельце. Чтобы измерить использование входящей/исходящей сети для каждого приложения, Android исправил ядро, включив в него qtaguid
модуль. Мы можем прочитать статистику из /proc/net/xt_qtaguid/stats
. С помощью некоторых сценариев оболочки получите использование данных в реальном времени после перезагрузки:
Однако на Android 9+ он заменяетсяqtaguid
расширенным BPF (который также планируется заменить фреймворком в ядре Linux) . Связанный: Какой процесс отвечает за сбор данных об использовании? netfilter
В качестве альтернативы можно поместить исходящий трафик из приложения в NFLOG
группу, а затем tcpdump захватит пакеты из этой группы:
# iptables -I OUTPUT -m owner --uid-owner 1000 -j NFLOG --nflog-group 30
# tcpdump -i nflog:30
Это сделано для того, чтобы мы приблизились к физическому уровню при анализе исходящего трафика. Но он по-прежнему может давать ложные срабатывания, например, если пакеты отброшены/потеряны в таблицах маршрутизации. Вот почему снифферы работают на уровне OSI 2. Или, что еще лучше, наблюдать извне, например, используя прокси / VPN-сервер, или на привязанном ПК, или на маршрутизаторе. Но это не будет захватывать трафик на основе UID/PID.
strace
отслеживание syscalls
сетевой активности процесса. force_bind и tracedump также работают по тому же принципу. Для этого можно использовать подсистему аудита ядра Linux .iptables
NETFILTER_XT_MATCH_CGROUP
прослушивания трафика от определенных процессов.Network Namespaces
для изоляции процессов и использования чтения данных для каждого интерфейса. nstrace работает по тому же принципу.SELinux
и seccomp
может использоваться для ограничения способности процессов создавать сокеты путем определения ограниченного policies
и подавления syscalls
соответственно.Большинство из них не совсем подходят для Android и требуют расширенных настроек.
Некоторые приложения, такие как NetGuard, используют VpnService API Android для блокировки трафика на уровне 3 (интерфейс TUN). Приложение может «уведомлять, когда приложение получает доступ к Интернету» . Захват и отслеживание для каждого приложения ( 1 , 2 ) возможны с использованием VPN API, поскольку Android использует UIDs
и SOcket_MARKs
( 1 , 2 ) для управления трафиком в политике сетевой маршрутизации ( RPDB ) непосредственно перед выходом из устройства.
Некоторые приложения, такие как NetLive, используют NetworkStatsManager , но он отстает от использования в реальном времени и «не обновляется достаточно быстро» , он «предназначен для предоставления исторических данных» .
ПРИМЕЧАНИЕ. Я не имею отношения ни к одному из упомянутых приложений.
СВЯЗАННЫЙ:
С PCAPdroid вы можете видеть отдельные соединения, установленные приложениями. Это инструмент с открытым исходным кодом, разработанный мной, который работает без рута (рут не является обязательным). Он имеет множество интересных функций для безопасности и конфиденциальности пользователей, проверьте это
Если вы хотите отслеживать только то, какое приложение выполняет подключения к какому серверу, я рекомендую вам приложение
Net Monitor . Он действует как локальная VPN и поэтому может обнаруживать весь сетевой трафик. Кроме того, он показывает, какое приложение выполнило сетевой запрос (включая удаленный хост, порты и даже является ли соединение обычным или SSL/TLS).
Поэтому, если вы используете это приложение в сочетании с инструментами захвата, которые вы уже упомянули в своем вопросе, вы сможете отслеживать каждое сетевое соединение.
Гунтрам Блом