Цифровая слежка в кармане: аудит 11 популярных российских Android-приложений
Привет, Хабр!
Продолжаю серию аудитов. В прошлый раз я разобрал семь яндексовских приложений — и там было на что посмотреть: буфер обмена, WebRTC-утечки, распознавание ключевых слов в аудиопотоке. На этот раз расширяю выборку и меняю фокус.
Одиннадцать приложений. Банки, госсервисы, маркетплейсы, навигация, магазин приложений. Все — из топа российского Android-рынк. Методология — статический анализ (SAST) плюс пассивный перехват logcat. Трафик не вскрывался, SSL Pinning не обходился, в Secure Folder не залезал.
237 уязвимостей суммарно (включая расширенную проверку). Шесть приложений с ключами подписи образца прошлого века. ВК с 11 трекерами и рейтингом риска 98/100. И Госключ, который неожиданно оказался единственным, кто делает всё правильно.
Методология: что делал и чего не делал
Инструменты: MobSF (статика, SAST), apktool, jadx, androguard, самописные парсеры для трекеров и криптографических паттернов.
Что анализировалось: DEX-байткод, манифест, нативные библиотеки, сертификаты подписи, Network Security Config. Параллельно — пассивный logcat при первом холодном запуске: какие домены контактирует приложение до того, как вы успели что-то разрешить.
Что НЕ делалось: SSL Pinning не обходился, трафик не расшифровывался, root-привилегии не использовались. Это принципиально: статика + logcat — то, что доступно без вмешательства в работу приложения.
Важная оговорка: обфускация занижает числа. Там, где jadx видит 3097 обращений к крипто-функциям, реальных уязвимостей может быть меньше — часть это дубли из-за инлайнинга. Риск слежки считается как взвешенная сумма: трекеры, VPN-детекция, опасные разрешения, слабая криптография. Абсолютные цифры — ориентир, не приговор.
Госуслуги: APK взят с зеркала RuStore, не из Google Play. Это официальный пакет ru.rostel версии 27.0.1.9810-rustore.
Рейтинг риска слежки
|
# |
Приложение |
Версия |
Трекеров |
Слабый ключ |
VPN-детекция |
Крипто-слабости |
Риск |
|---|---|---|---|---|---|---|---|
|
1 |
VK |
8.195 |
11 |
RSA-1024 ✗ |
HIGH |
3097 |
98.0 |
|
2 |
Т-Банк |
8.2.3 |
6 |
RSA-2048 |
HIGH |
4931 |
96.6 |
|
3 |
Сбербанк |
17.11.0 |
7 |
RSA-1024 ✗ |
HIGH |
705 |
96.0 |
|
4 |
Госуслуги |
27.0.1 |
8 |
RSA-1024 ✗ |
HIGH |
1634 |
95.2 |
|
5 |
Авито |
232.0 |
11 |
RSA-1024 ✗ |
HIGH |
875 |
94.3 |
|
6 |
ВТБ |
20.16.0 |
5 |
RSA-2048 |
MEDIUM |
3988 |
89.5 |
|
7 |
2ГИС |
7.28.0 |
9 |
RSA-4096 |
MEDIUM |
1737 |
83.3 |
|
8 |
RuStore |
1.109.1 |
8 |
RSA-2048 |
MEDIUM |
798 |
81.0 |
|
9 |
Яндекс Пэй |
0.241.0 |
5 |
DSA-1024 ✗ |
LOW |
5139 |
77.3 |
|
10 |
Ozon Bank |
19.33.1 |
6 |
RSA-1024 ✗ |
LOW |
157 |
71.6 |
|
11 |
Госключ |
2.20.0 |
2 |
RSA-2048 |
NONE |
210 |
42.4 |
✗ — ключ подписи ниже 2048 бит, считается слабым по NIST SP 800-57 и Android CDD
Топ-находки
1. Слабые ключи подписи: шесть приложений живут в 2010 году
Шесть из одиннадцати приложений подписаны ключами, которые не соответствуют современным стандартам:
-
RSA-1024: VK, Сбербанк, Госуслуги, Авито, Ozon Bank
-
DSA-1024: Яндекс Пэй
По NIST SP 800-57, RSA-1024 и DSA-1024 официально устарели ещё в 2013 году. Android продолжает принимать такие подписи для обратной совместимости, но это означает: теоретически скомпрометированный ключ может быть использован для подписи поддельного обновления, которое пройдёт верификацию как легитимное.
Для банковского приложения с 50+ млн пользователей — Сбербанк, я о тебе — это не «академическая угроза». RSA-2048 — минимум, RSA-4096 (как у 2ГИС) — хорошая практика.
Яндекс Пэй отдельно заслуживает внимания: DSA-1024 в платёжном приложении. DSA вообще редко используется в мобильных приложениях, и DSA-1024 особенно.
2. Трекерная экосистема: HMS Huawei везде, VK-экосистема расширяется
HMS Huawei присутствует в 10 из 11 приложений. Единственное исключение — VK (там HMS тоже есть, 30 458 ссылок, просто доля меньше). В Госключе — 22 293 ссылки на HMS. Это государственное приложение для хранения ЭЦП.
Разберём по лидерам:
VK (11 трекеров, максимум в выборке):
-
VK_SDK: 2 350 342 ссылки — да, это число правильное
-
AppMetrica_io: 49 909
-
HMS_Huawei: 30 458
-
MailRu: 25 863
-
MyTracker: 7390
-
Firebase + Crashlytics + Facebook + RuStore
Авито (11 трекеров, равный максимум):
-
AppMetrica_io: 46 904
-
Firebase_Core: 30 382
-
VK_SDK: 20 668
-
Facebook: 17 463
-
HMS_Huawei: 12 988
-
Adjust + MyTracker + Crashlytics + RuStore
Госуслуги (8 трекеров):
-
HMS_Huawei: 78 571 — рекорд по этому трекеру в выборке
-
AppMetrica_io: 50 539
-
Firebase_Core: 33 937
-
VK_SDK: 9 088
То есть государственный портал Госуслуги передаёт аналитику в экосистему VK (9088 ссылок на VK_SDK), Яндекс (AppMetrica), Google (Firebase) и Huawei (HMS). Это не обязательно передача персональных данных — SDK может использоваться только для части функций, — но ссылки в коде означают, что SDK присутствует и инициализирован.
VK-экосистема: VK_SDK есть в Авито, Т-Банке, 2ГИС, Сбербанке, Госуслугах, Ozon Bank, RuStore. VK, таким образом, через собственный SDK получает аналитические сигналы из семи приложений на вашем устройстве — плюс очевидно из своего основного приложения.
3. VPN-детекция через WebRTC: классика жанра
Пять приложений имеют статус HIGH по VPN-детекции: VK, Т-Банк, Сбербанк, Госуслуги, Авито.
Механизм — тот же WebRTC ICE Candidate leak, который я описывал в прошлой статье. WebRTC при установке peer-to-peer соединения опрашивает все сетевые интерфейсы устройства, включая те, что находятся за VPN-туннелем. Результат: ваш реальный IP попадает в ICE Candidate list, который приложение может прочитать и отправить на сервер.
Для банковских приложений VPN-детекция — стандартная антифрод-мера. Но способ через WebRTC-утечку работает даже на устройствах, где пользователь осознанно скрывает свой IP. И вот тут я не берусь однозначно сказать, где кончается антифрод и начинается слежка.
2ГИС, RuStore и Яндекс Пэй — MEDIUM. Госключ и Ozon Bank — LOW/NONE.
4. Runtime: что происходит при первом запуске
До того как вы нажали хоть одну кнопку:
|
Приложение |
Домены при запуске |
|---|---|
|
VK |
firebase, crashlytics, rustore |
|
Т-Банк |
sentry |
|
Сбербанк |
crashlytics, firebase, metrica, rustore |
|
ВТБ |
metrica, firebase |
|
Яндекс Пэй |
firebase, metrica, startup.mobile.yandex, appmetrica.yandex, crashlytics |
|
2ГИС |
firebase, crashlytics, metrica, rustore |
|
RuStore |
metrica, rustore, firebase |
|
Ozon Bank |
sentry, firebase |
|
Госключ |
rustore, crashlytics, firebase |
Авито и Госуслуги — logcat был недоступен (Secure Folder или приложение не запустилось в тестовой среде).
Яндекс Пэй при первом запуске сразу обращается к пяти доменам, включая startup.mobile.yandex — это инициализация рекламного/аналитического SDK ещё до того, как пользователь согласился с политикой конфиденциальности.
Интересно, что Госключ тоже обращается к firebase и crashlytics при запуске — это Firebase Crashlytics для мониторинга сбоев, стандартная практика. При этом трекеров у него всего два (HMS + Firebase_Core), что объясняет общий низкий риск.
Банки: сравнение четырёх игроков
|
|
Т-Банк |
Сбербанк |
ВТБ |
Ozon Bank |
|---|---|---|---|---|
|
Ключ подписи |
RSA-2048 |
RSA-1024 ✗ |
RSA-2048 |
RSA-1024 ✗ |
|
Трекеров |
6 |
7 |
5 |
6 |
|
VPN-детекция |
HIGH |
HIGH |
MEDIUM |
LOW |
|
Крипто-слабости |
4 931 |
705 |
3 988 |
157 |
|
Опасн. разрешений |
23 |
17 |
20 |
9 |
|
Риск слежки |
96.6 |
96.0 |
89.5 |
71.6 |
Т-Банк — 255 МБ приложение с 4931 обращением к слабым крипто-функциям. Больше всего опасных разрешений в выборке (23). HMS Huawei доминирует — 25 685 ссылок против VK_SDK (6 653). Зачем банковское приложение так плотно интегрирует Huawei Mobile Services — интересный вопрос.
Сбербанк: RSA-1024 у крупнейшего банка страны — это хочется выделить отдельно. Это не исторический артефакт в каком-то стороннем SDK, это ключ, которым подписывается APK. Для обновления достаточно сгенерировать новый ключ при следующем релизе.
ВТБ выглядит чуть лучше конкурентов по риску (89.5), при этом Amplitude присутствует в 15 ссылках — единственный банк в выборке, использующий этот американский аналитический сервис.
Ozon Bank — неожиданно скромный результат: 71.6, RSA-1024 — единственный существенный минус, криптографических слабостей меньше всего в банковской четвёрке (157).
Госключ: эталон, который удивил
Давайте честно: я шёл в этот аудит с предположением, что Госключ окажется в середине рейтинга. Государственные приложения в России не особо ассоциируются с образцовой приватностью.
Результат: 42.4/100. Лучший показатель в выборке с огромным отрывом. Разрыв со вторым снизу (Ozon Bank, 71.6) — почти 30 пунктов.
Что Госключ делает правильно:
-
RSA-2048 — ключ подписи соответствует современным стандартам
-
2 трекера — только HMS_Huawei и Firebase_Core. Никакого VK_SDK, никакой рекламной атрибуции
-
VPN-детекция: NONE — не пытается определить, использует ли пользователь VPN
-
7 опасных разрешений — минимум в выборке среди нетривиальных приложений
-
210 крипто-слабостей — сопоставимо с Ozon Bank (157), в разы меньше, чем у банков
Контекст важен: Госключ хранит электронные цифровые подписи, работает с ЕСИА. Тут малая поверхность атаки не для галочки — чем меньше приложение умеет, тем меньше у него можно отнять.
При первом запуске — обращается к rustore, crashlytics, firebase. Никаких appmetrica, startup.mobile.yandex или VK-доменов.
Это не реклама Госключа и не сравнение с другими аспектами его безопасности (серверная сторона, PKI-инфраструктура — за пределами этого аудита). Но в рамках статики + logcat — чистый результат.
Отдельные интересные находки
RuStore (81.0): магазин приложений от VK с 360 000 ссылками на VK_SDK — в 150 раз больше, чем у следующего компонента (MailRu: 24 632). Это ожидаемо, учитывая происхождение, но масштаб впечатляет. VPN-детекция MEDIUM.
2ГИС: единственное приложение в выборке с RSA-4096 — это правильно. При этом 9 трекеров и HMS как лидер (70 823 ссылки). AppsFlyer присутствует с 16 070 ссылками — рекламная атрибуция для навигатора.
Яндекс Пэй: DSA-1024 — редкость в 2026 году. Плюс 5139 крипто-слабостей — максимум в выборке. При этом VPN-детекция LOW. Приложение явно делает ставку не на обнаружение VPN, а на другие механизмы антифрода.
Авито: 346 МБ, 11 трекеров, RSA-1024. Facebook SDK с 17 463 ссылками в российском маркетплейсе — это не блокируется на уровне DNS без потери функциональности, если Facebook SDK используется для авторизации.
Расширенная проверка: оверлеи, dropper-цепочка и единственный MitM-вектор
После первичного прогона я углубился в три специфических вектора: критичные разрешения манифеста, конфигурацию NSC и SSL-bypass в smali, а также провёл дополнительную SAST-проверку хранилища, буфера обмена, фоновой геолокации и нативных библиотек. +34 новых находки, итог — 237 уязвимостей. Разберу самое интересное.
Эпидемия SYSTEM_ALERT_WINDOW в финансовых приложениях
SYSTEM_ALERT_WINDOW — разрешение на отрисовку поверх других приложений — присутствует у шести из одиннадцати: Сбербанк, ВТБ, Т-Банк, Яндекс Пэй, Авито, VK.
Это не экзотика — это классический вектор Tapjacking/Overlay Attack (CWE-1021). Приложение с этим разрешением рисует прозрачный или непрозрачный слой поверх чужого UI, перехватывая нажатия или имитируя чужой интерфейс. Для финансовых приложений use case «показать мини-баннер» не оправдывает наличие этого права — тем более что у Сбербанка и ВТБ оно идёт в связке с правами на установку пакетов (см. ниже).
Dropper-цепочка в банках: REQUEST_INSTALL_PACKAGES + UPDATE_PACKAGES_WITHOUT_USER_ACTION
Это наиболее неожиданная находка. Три банка — Сбербанк, ВТБ, Т-Банк — содержат пару:
-
REQUEST_INSTALL_PACKAGES— право быть установщиком сессии -
UPDATE_PACKAGES_WITHOUT_USER_ACTION— право устанавливать обновления без диалога подтверждения (Android 12+, API 31)
У Сбербанка и ВТБ добавлен ещё MANAGE_EXTERNAL_STORAGE — доступ ко всему внешнему хранилищу. В совокупности это полный dropper-профиль: читаем APK из Downloads, устанавливаем без уведомления пользователя.
Законный use case — обновление собственных мини-апп модулей внутри супераппа. Но для этого достаточно PackageInstaller с явным scope на собственный пакет, а не широкий REQUEST_INSTALL_PACKAGES. Комбинация трёх прав в банковском приложении без публичной документации — это красный флаг, который должен требовать объяснения от команд безопасности этих банков.
NSC: пять приложений без явной политики TLS
NetworkSecurityConfig отсутствует у Сбербанка, Яндекс Пэй, Авито, 2ГИС и RuStore. Без NSC невозможно декларативно задать certificate pinning, запретить cleartext для конкретных доменов или ограничить доверие к пользовательским CA. Особенно критично для Сбербанка и Яндекс Пэй — финансовых приложений.
VK — единственный реальный MitM-вектор
Из всех одиннадцати приложений только VK имеет подтверждённый вектор перехвата трафика без root:
-
В
network_security_config.xmlпрописан<certificates src="user"/>— доверие к пользовательским CA. -
В smali обнаружен один паттерн
TrustAllManager(ssl_bypass=1).
Это означает: достаточно установить пользовательский CA-сертификат через Настройки → Безопасность (не требует root на Android) и настроить HTTP-прокси — весь трафик VK расшифрован. Для всех остальных приложений в выборке (с NSC) это невозможно без обхода SSL Pinning или root.
Незащищённые exported-компоненты и утечка device_id
RuStore лидирует по открытым exported-компонентам: 22 сервиса, 3 провайдера, 5 ресиверов — без android:permission. Это значит, что любое стороннее приложение на устройстве может запустить эти компоненты напрямую через Intent.
В нескольких ContentProvider с именами, характерными для AppMetrica PreloadInfo и VK push-интеграции, присутствует паттерн доступа к device_id — потенциально эксплуатируемый без привилегий. Это «информационная» утечка уровня fingerprinting, но она работает горизонтально — между приложениями на одном устройстве.
Итог по профилю разрешений
Единственное приложение с адекватным профилем разрешений — Госключ: запрашивает ровно то, что нужно для работы с ГОСТ КЭП. Остальные — в диапазоне от «избыточный» до «агрессивный». Лидеры агрессии: Сбербанк (4 критичных разрешения), ВТБ (4), RuStore (4).
Выводы
237 уязвимостей на 11 приложений (+34 по итогам расширенной проверки). 6 слабых ключей подписи. 10 из 11 приложений с HMS Huawei. VK_SDK в 7 приложениях.
Три вещи, которые можно сделать прямо сейчас:
1. DNS-фильтрация. AdGuard Home или NextDNS. Блокирует домены трекеров без SSL Pinning и root. Не панацея, но снижает шум.
2. Рабочий профиль. Shelter / Island. Финансовые приложения с высоким риском — в изолированный профиль без доступа к контактам и основному буферу обмена.
3. Разрешения. Банки не нуждаются в фоновой геолокации. ВТБ с 20 опасными разрешениями и Т-Банк с 23 — есть что отозвать.
Ключи подписи менять сложнее: смена ключа означает переустановку приложения пользователями. Но RSA-1024 у Сбербанка и Госуслуг в 2026 году — это технический долг, который когда-то придётся платить.
Отчёты
Полные PDF с таблицами уязвимостей, CWE-кодами, CVSS-скорингом и разбором механизмов слежки:
-
Пользовательский отчёт — сводка, основные выводы
-
Технический аудит — SAST-данные, детальные таблицы, скоринг
Дисклеймер
Данный аудит — статический анализ APK + пассивный logcat. Трафик не расшифровывался, SSL Pinning не обходился, серверная часть не анализировалась.
Обфускация занижает абсолютные числа: цифры крипто-слабостей и ссылок на трекеры — это то, что видно jadx и androguard. Реальная картина может отличаться в обе стороны.
Наличие кода трекера в APK не означает автоматической передачи данных — SDK может быть включён, но не инициализирован при определённых условиях. Logcat при первом запуске показывает то, что инициализируется в базовом сценарии.
Госуслуги — версия с зеркала RuStore (ru.rostel 27.0.1.9810-rustore), не Google Play.
Полные таблицы уязвимостей с CWE-кодами и CVSS-скорингом — в PDF-отчётах.
Методология: OWASP MASTG + MobSF + SAST.
ссылка на оригинал статьи https://habr.com/ru/articles/1081580/