Цифровая слежка в кармане: аудит 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 обращений к крипто-функциям, реальных уязвимостей может быть меньше — часть это дубли из-за инлайнинга. Абсолютные цифры — ориентир, не приговор.

Как считается риск слежки 0–100. Взвешенная сумма шести компонентов, веса в сумме дают 100:

Компонент

Максимум

Как считается

Трекеры

25

число SDK × 3 + log10(refs+1) × 3

VPN-детекция

25

по уровню: HIGH 25 / MEDIUM 15 / LOW 7 / NONE 0

Скрытый сбор

20

доля активных категорий из 8, плюс по +2 за каждую чувствительную (звонки, SMS, микрофон, буфер, контакты)

Fingerprinting

15

доля активных категорий из 6

Геолокация

10

log10(refs+1) × 4

Удалённое управление

5

log10(refs+1) × 2

Логарифм стоит там, где число обращений может уходить в сотни тысяч и иначе перекашивает итог. Формула детерминированная и считается из JSON-отчёта анализатора — субъективной оценки в балле нет.

Что считается «уязвимостью». Каждая пронумерованная находка в отчёте (SBER-01, VTB-16 и так далее), от информационных до критичных. Уровень присваивается по CVSS 3.1: КРИТ 8.1–9.0, ВЫС 6.5–7.9, СРЕД 4.3–5.9, НИЗ 3.1–3.9, ИНФО ниже 3. Итоговые 237 распределены так: 14 критичных, 66 высоких, 94 средних, 37 низких, 26 информационных. Так что «237 уязвимостей» не равно «237 дыр, через которые вас завтра обчистят» — больше половины это средний уровень и ниже.

Госуслуги: 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 — это рекомендация, не требование, и с 2013 года там значится нижняя граница в 2048 бит. Публично задокументированной факторизации ключа такой длины вне лабораторных условий на сегодня нет — это гипотетический риск на горизонте роста вычислительных мощностей, а не подтверждённая уязвимость. Отдельный вопрос — компрометация ключа: она не зависит от его длины и происходит не через подбор, а через утечку хранилища или процесса подписи. Тут риск для RSA-1024 и RSA-4096 одинаковый. Единственное, для чего конкретно важна длина, — устойчивость именно к подбору: 1024 бита оставляют меньше запаса на будущее, чем 2048+.

Для банковского приложения с 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-детекция — стандартная антифрод-мера. Разница в способе: проверить факт включённого VPN через TYPE_VPN — это одно, а вытащить реальный IP через WebRTC мимо туннеля — другое. Второй способ возвращает ровно тот адрес, который пользователь намеренно прятал. И вот тут я не берусь однозначно сказать, где кончается антифрод и начинается слежка.

2ГИС, RuStore и Яндекс Пэй — MEDIUM. Госключ и Ozon Bank — LOW/NONE.

Как считается уровень. Анализатор ищет в smali восемь литералов: IceCandidate, getNetworkInterfaces, tun0, ppp0, TYPE_VPN, DnsResolver, isProxy, /proc/net/tcp — и суммирует число строк-совпадений. Дальше жёсткие пороги: 15 и больше — HIGH, 6–14 — MEDIUM, 1–5 — LOW, ноль — NONE. Порог в 15 отсекает единичное упоминание внутри чужого SDK от систематического использования в нескольких местах кода. Руками уровень не правится.

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 или приложение не запустилось в тестовой среде).

Сразу оговорюсь, что сам по себе список доменов почти ни о чём не говорит — важно, кому они принадлежат и зачем вызываются:

  • firebase — Google: push-уведомления (FCM), Remote Config, аналитика. Инфраструктура, без которой push на Android просто не работает.

  • crashlytics — Google: сбор крашей и стектрейсов. Нормальная практика, к слежке отношения не имеет.

  • sentry — сторонний error tracking, функционально то же самое, что Crashlytics.

  • rustore — регистрация push-токена в магазине VK. Тоже инфраструктура.

  • metrica / appmetrica.yandex.net — AppMetrica, продуктовая аналитика Яндекса: события, сессии, идентификаторы устройства.

  • startup.mobile.yandex — конфигурационный запрос, с которого поднимается стек яндексовых SDK.

То есть в девяти случаях из тринадцати это Firebase, Crashlytics и push, и предъявлять тут нечего. Интересен один кейс: Яндекс Пэй тянет пять доменов, из них appmetrica и startup.mobile.yandex — до того, как пользователь увидел экран с политикой конфиденциальности. Не «слежка», но аналитика, стартующая раньше согласия.

Интересно, что Госключ тоже обращается к 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-цепочка и разбор полёта по VK

После первичного прогона я углубился в три специфических вектора: критичные разрешения манифеста, конфигурацию NSC и SSL-bypass в smali, а также провёл дополнительную SAST-проверку хранилища, буфера обмена, фоновой геолокации и нативных библиотек. +34 новых находки, итог — 237 уязвимостей. Разберу самое интересное.

Эпидемия SYSTEM_ALERT_WINDOW в финансовых приложениях

SYSTEM_ALERT_WINDOW — разрешение на отрисовку поверх других приложений — присутствует у шести из одиннадцати: Сбербанк, ВТБ, Т-Банк, Яндекс Пэй, Авито, VK.

Приложение с этим разрешением может рисовать слой поверх чужого UI — то есть держит в руках половину механики Tapjacking/Overlay Attack. Сразу уточню маппинг, потому что в первой редакции я поставил его неправильно: CWE-1021 описывает приложение-жертву, которое не защищает свои экраны от перекрытия (filterTouchesWhenObscured). Приложению, которое само владеет оверлейным правом, корректнее ставить CWE-250 — исполнение с избыточными привилегиями.

И это не уязвимость сама по себе. Это постоянно доступная возможность, которая становится оружием, если в процесс попадает чужой код — скомпрометированный SDK, supply-chain, взломанный релиз. Ради мини-баннера держать её всё время включённой — сомнительный размен, но отдельно взятое SYSTEM_ALERT_WINDOW я бы находкой не назвал. Настораживает связка: у Сбербанка и ВТБ оно идёт вместе с правами на установку пакетов и тихое обновление (см. ниже).

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, устанавливаем без уведомления пользователя.

Законное применение тут есть — обновление собственных мини-апп модулей внутри супераппа. Но для этого достаточно PackageInstaller с явным scope на собственный пакет, а не широкий REQUEST_INSTALL_PACKAGES. Комбинация трёх прав в банковском приложении без публичной документации — то, что стоило бы прямо объяснить командам безопасности этих банков.

NSC: пять приложений без явной политики TLS

NetworkSecurityConfig отсутствует у Сбербанка, Яндекс Пэй, Авито, 2ГИС и RuStore.

Что это значит и чего не значит. Не значит, что приложение доверяет пользовательским сертификатам: начиная с Android 7 (targetSdk 24) платформа user CA по умолчанию не доверяет, а у всех пяти targetSdk 36–37. Перехватить трафик, просто подсунув свой корневой сертификат, там не выйдет.

Значит другое: нет декларативного certificate pinning, нет запрета cleartext для конкретных доменов, нет per-domain политики — всё это остаётся на совести кода, и статически проверить уже нечего. Для банка я бы такую конфигурацию не назвал критичной, скорее непрозрачной: защита может быть реализована в рантайме через OkHttp CertificatePinner, а может не быть реализована вовсе, и снаружи эти два случая неразличимы.

VK: ложная тревога, которую стоит разобрать

В первой редакции статьи здесь был раздел про «единственный реальный MitM-вектор без root». Анализатор нашёл у VK в network_security_config.xml директиву <certificates src="user"/> и один TrustAllManager в smali — и я сделал вывод, что трафик снимается обычным прокси с установленным пользовательским CA.

Вывод неверный, и я благодарен читателям, которые на это указали. Разбираю, потому что случай поучительный.

Декодированный NSC из релизного APK выглядит так:

E: network-security-config
    E: debug-overrides
        E: trust-anchors
            E: certificates  src="system"
            E: certificates  src="user"      <-- вот он
    E: base-config
        E: trust-anchors
            E: certificates  src="system"
            E: certificates  @res/raw/russian_trusted_root_ca
            E: certificates  @res/raw/russian_trusted_sub_ca
            E: certificates  @res/raw/russian_trusted_sub_ca_2024
            E: certificates  @res/raw/vk_self_signed
    E: domain-config  cleartextTrafficPermitted=true
        E: domain  127.0.0.1, localhost
        E: domain  mobileid.megafon.ru, idgw.mobileid.mts.ru
        E: domain  he-mc.tele2.ru, he-mc.t2.ru, beeline.ru

<certificates src="user"/> лежит внутри <debug-overrides>, а не в <base-config>. Секция debug-overrides применяется только при android:debuggable="true"; в релизной сборке VK этот атрибут отсутствует, то есть false. Android такую секцию просто игнорирует. Перехват через пользовательский CA не работает — ровно так, как и должно быть у нормально собранного приложения.

Ошибка была в анализаторе: он искал факт наличия директивы, не разбирая, в какой секции она лежит. Это классический ложноположительный результат статики, и правило «src="user" найден → доверяет user CA» теперь проверяет родительский элемент.

Что из этого раздела остаётся правдой:

  • cleartextTrafficPermitted=true присутствует, но ограничен семью адресами: localhost и хосты Mobile ID у МегаФона, МТС, Tele2 и Билайна. Это авторизация по SIM, где оператор технически требует HTTP. Не дыра, но точка, где трафик идёт открытым.

  • <pin-set> в конфиге нет — декларативного pinning у VK тоже не заведено.

  • В base-config добавлены российские корневые CA (Минцифры) и собственный self-signed сертификат VK. Это осознанное расширение доверия за пределы системного хранилища. Практический смысл — работа при перевыпуске сертификатов внутри РФ; риск в том, что доверенных корней становится больше, чем заложено в системе.

  • TrustAllManager действительно есть: обфусцированный класс xsna/zyk0, исходно ProxyTrustManager.kt, с пустым checkServerTrusted и аннотацией @SuppressLint("TrustAllX509TrustManager"). Это собственный код VK, не чужая библиотека. Но он не глобальный TrustManager, а одно из звеньев CompositeTrustManager — доказать статикой, что оно включается в продакшене, я не могу. Так что честная формулировка: настораживающий класс в коде, а не подтверждённый вектор атаки.

Незащищённые 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-скорингом и разбором механизмов слежки:


Дисклеймер

Данный аудит — статический анализ 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.

Комментарии (42)


  1. MountainGoat
    12.09.2026 15:15

    Вот поэтому нужно всем иметь для российских приложений отдельный телефон. И пусть там вся эта шобла друг за другом следит, а так же файлы и контакты читает. И в домашний вайфай его не включать.

    Остаётся важным только вопрос, чтобы лишний доступ к микрофону никто не получил.


    1. Oeaoo
      12.09.2026 15:15

      вся эта шобла

      да


    1. DGN
      12.09.2026 15:15

      А зачем отдельному телефону вообще микрофон?


  1. alexzen
    12.09.2026 15:15

    Насколько безопасна альтернатива пользоваться вышеуказанными сервисами из браузера или установка их как PWA приложений с ограничением всех прав?


  1. select26
    12.09.2026 15:15

    По NIST SP 800-57, RSA-1024 и DSA-1024 официально устарели ещё в 2013 году. Android продолжает принимать такие подписи для обратной совместимости, но это означает: теоретически скомпрометированный ключ может быть использован для подписи поддельного обновления, которое пройдёт верификацию как легитимное.

    NIST - это, конечно, хорошо. Но это не требования, а рекомендации.
    И неизвестен пока ни один случай подбора (НЕ ВЗЛОМА, тем более) RSA-1024 ключа не в лабораторных условиях.
    Все эти байки основаны на старой картинке, где растущая прогнозируемая вычислительная мощь в будущем должна позволить подобрать ключ. Пока никто подобрать не смог и математически уязвимость не найдена.
    Я лично использую 1024 битные ключи - работа с ними на порядок (я знаю что означает это слово) снижает нагрузку на процессор при криптографических операция и на большом скейле это очень заметно.

    Но RSA-1024 у Сбербанка и Госуслуг в 2026 году — это технический долг, который когда-то придётся платить.

    Я думаю что профессионалы просто адекватно оценивают риск и рационально используют ресурсы. Ваш, кстати, телефон тоже не очень счастлив будет работать с длинным ключом. Особенно его батарея.

    А так, да:

    скомпрометированный ключ может быть использован для подписи поддельного обновления, которое пройдёт верификацию как легитимное

    Только какое отношение компроментация ключа имеет к его длине? И как увеличение длины ключа защищает от его компроментации?
    Мне кажется автор не очень понимает эту предметную область.


    1. amhbr
      12.09.2026 15:15

      Вы просто не понимаете смысл подобных статей :). Всё ж, обязательно должно быть плохо.


    1. johnick1234 Автор
      12.09.2026 15:15

      По существу — вы правы, и не в мелочи. Признаю прямо: в тексте была логическая ошибка, а не просто резкая формулировка.

      Про компрометацию vs длину ключа — вы абсолютно правы, это разные вещи. Длина ключа защищает от подбора (факторизации). Компрометация — это утечка приватного ключа из хранилища, кража у подписывающего процесса, инсайдер и так далее — способ получить ключ, который вообще не зависит от того, сколько в нём бит. RSA-4096, украденный из плохо защищённого CI/CD, компрометируется ровно так же легко, как RSA-1024. Я смешал в одном предложении два разных риска — это ошибка формулировки, а не разница мнений, и я её поправил в статье.

      Про NIST — тоже справедливо. Это рекомендация, не стандарт с обязательной силой, и я подал её как строгую границу.

      Про отсутствие практической факторизации RSA-1024 вне лабораторий — согласен, тут я говорил о теоретическом риске на растущих вычислительных мощностях, а не о задокументированном взломе, и это стоило явно разграничить.

      Где не соглашусь — с «а так это нормальная инженерная практика для банка». Разница в контексте: вы используете RSA-1024 сознательно, зная профиль риска, ради производительности на своём масштабе, и это осознанный trade-off. У подписи APK производительность приватного ключа при подписании не имеет значения вообще — ключ используется один раз при релизе, не миллион раз в секунду на проде. Аргумент «телефон не будет рад длинному ключу» тут не работает: смартфон верифицирует подпись публичным ключом при установке, это происходит один раз, нагрузка на батарею неотличима от нуля что для RSA-1024, что для RSA-2048. Разница в производительности релевантна для TLS-хендшейков на высоконагруженном сервере — не для APK Signature Scheme.

      Так что реальный аргумент за RSA-2048+ для подписи приложения — не «сегодня взломают», а «переход бесплатный по производительности и оставляет запас на будущее, зачем экономить там, где экономия ничего не даёт». Формулировка про «технический долг» в статье уже поправлена на менее драматичную версию — по существу спасибо за то, что заставили точнее развести компрометацию и длину ключа, это реальная правка, не защита лица.


  1. Maslukhin
    12.09.2026 15:15

    Вот такие фразы сразу выдают нецрогенерацию.

    это технический долг, который когда-то придётся платить.

    Нейрогенерация ставит под сомнение верность выводов из статьи.

    Лучше пишите сами.


    1. johnick1234 Автор
      12.09.2026 15:15

      Справедливо — фраза действительно штамп, из тех, что LLM вставляет не думая. Я писал текст с помощью модели и не выловил все такие места при вычитке, это на мне.

      По сути вопроса — тут готов не согласиться. Стиль и достоверность фактов — разные вещи. Если находка построена на конкретном счётчике обращений в smali, конкретном классе, конкретном XML-атрибуте — она не становится ложной от того, что абзац вокруг неё звучит как канцелярит. По ходу этой ветки комментариев несколько реальных ошибок уже нашли и поправили (ложноположительный MitM-вектор у VK, неверный CWE-маппинг для SYSTEM_ALERT_WINDOW, неточная формулировка про VPN-блокировку) — и нашли их не по фразам «технический долг», а по проверке конкретных технических утверждений. Это и есть правильный способ ловить ошибки в таком материале, а не поиск AI-tells в языке.

      Штампы почищу при следующей правке — они правда мешают читать. Но выводы там, где они держатся на конкретных данных из smali/манифеста/NSC, эта чистка не изменит; там, где выводы были неверны, они уже поправлены отдельно, по фактам, а не по стилю.


  1. Ox2A
    12.09.2026 15:15

    Понятно, что все эти организации исполняют всякие директивы, но тем не менее слишком стараясь их исполнять, они себе в ногу стреляют. Вот, захотелось мне посмотреть любопытный мне девайс на озоне. Но озон решил мне этого не показывать, я не прошел какую-то ему одному ведомую проверку. Первый эмоциональный импульс прошел, включилась кора головного мозга со своими вопросами типа: "А оно точно мне нужно?". Понял, что совершенно не обязательно. Вот и сэкономил деньги.


  1. BugM
    12.09.2026 15:15

    Обычная аналитика, которая у всех. Во всяких Тиктоках и Фейсбуках собирается побольше инфы. Важно не количество SDK, а что собирается.

    Разрешения тоже нормальные. Автообновление это мастхев фича для российского приложения в 2026.

    SYSTEM_ALERT_WINDOW для всяких быстрых оплат. СБП и прочие QR коды все пытаются сделать удобнее.

    VPN это в законе прописано. Но судя по тому что у меня все с VPN уже заработало, если и детектят то без огонька.

    237 уязвимостей

    Тут ваша ллмка просто придумала что-то.

    А вот переподписать чем-то посерьезнее действительно стоит. Это единственное что правда без вопросов.


    1. dom1n1k
      12.09.2026 15:15

      Для обычной аналитики достаточно иметь один-два, ну три трекера. Для чего объективно могут понадобиться 5-10 трекеров, кроме торговли данными налево?


      1. BugM
        12.09.2026 15:15

        А где вы нашли 10-11?

        У всех ВК+Аппметрика. Это логично. У ВК треш с названиями и пакетами. VK_SDK + MailRu + MyTracker это все один ВК и ничего больше.

        Firebase это гугловый SDK. HMS_Huawei это SDK хуавейных сервисов. Рустор аналогично. Без них всех нынче никуда. Пуши это такая штука что она нужна надежная, а сторы нынче все сомнительные.

        Фейсбук правда вызывает вопросы. Его стоило бы удалить.

        И все.


        1. johnick1234 Автор
          12.09.2026 15:15

          Разберу по пунктам, потому что вы во многом правы.

          Трекеры: вы правы про VK-экосистему, но не полностью. VK SDK, Mail.ru, MyTracker технически действительно один бенефициар — это семейство SDK от VK Group, я их в статье считал по отдельности как «разные трекеры», хотя правильнее было объединить в один пункт «данные уходят в VK». Firebase/HMS/RuStore как push-инфраструктура — тоже справедливое замечание, без надёжного пуша сейчас никуда. Если пересчитать честно: инфраструктура (Firebase/HMS/RuStore) отдельно, VK-группа отдельно как один получатель, и дальше смотреть, что осталось — у большинства банков остаётся 1-3 реальных стороннихе рекламных SDK (AppsFlyer, Facebook, отдельно Яндекс AppMetrica). Это заметно меньше, чем «6-9 трекеров» звучит в лоб. Facebook у Авито и правда торчит без объяснимой причины — тут мы согласны полностью.

          237 уязвимостей — тут не соглашусь. Это не придумано моделью — механическая сумма пронумерованных находок (SBER-01, VTB-16 и так далее) по 11 отчётам, я эту цифру специально перепроверял построчным подсчётом заголовков. Другой вопрос — качество этих находок неоднородное: где-то за формулировкой стоит конкретный счётчик обращений или конкретный класс в коде, а где-то вывод построен на отсутствии данных («нельзя исключить», «возможно, вызывается нативно»). Второе методологически слабее первого, и такие находки не стоило подавать с той же интонацией, что и подтверждённые. Это справедливая претензия к весу отдельных пунктов, а не к тому, что цифра высосана из пальца.

          SYSTEM_ALERT_WINDOW для СБП/QR — тут вы не совсем правы, но и я неправ был. Ни в одном отчёте нет подтверждения, что это разрешение реально используется под платёжный оверлей или QR — я эту гипотезу выдвигал, но статикой она не доказывается, доказывается только сам факт наличия permission. Так что версия «это для СБП» — ровно такая же непроверенная гипотеза, как и моя версия про оверлей-атаку, только с обратным знаком. Настораживает не оверлей сам по себе, а связка SYSTEM_ALERT_WINDOW + REQUEST_INSTALL_PACKAGES + UPDATE_PACKAGES_WITHOUT_USER_ACTION у Сбера/ВТБ/Т-Банка — это уже конкретная цепочка «скачать APK → поставить без диалога», а не абстрактный риск оверлея.

          Автообновление — согласен, само по себе не находка, я об этом и не писал как о находке. Проблема не в факте автообновления, а в конкретном разрешении UPDATE_PACKAGES_WITHOUT_USER_ACTION — оно добавлено в Android 12 именно для магазинов приложений (у RuStore я его отдельно оценил как низкий риск ровно по этой причине). У банка, который не магазин, это разрешение — тихое обновление без диалога согласия, и вместе с REQUEST_INSTALL_PACKAGES это и есть та самая цепочка дроппера. Если в статье это читалось как «автообновление — плохо» — плохо сформулировал, извиняюсь.

          VPN-детекция — тут вы правы почти полностью. Все формулировки в отчётах про «детектирует» и «может ограничивать функциональность» — именно так, с сослагательным наклонением. Статика фиксирует только наличие кода, который умеет распознавать VPN (WebRTC ICE leak, TYPE_VPN, isProxy, чтение /proc/net/tcp) — реально ли это включено и как используется в проде, статическим анализом не проверяется в принципе. Если у вас всё через VPN работает штатно — вполне возможно, что детекция есть, а решение на её основе ничего не блокирует, либо блокирует что-то узкое (антифрод-скоринг, а не полный отказ в доступе). Я формулировал это осторожно в отчётах, но в тексте статьи местами подача жёстче, чем позволяют факты — это на мне.

          Итог: переподписать ключами посерьёзнее — да, единственное, с чем вообще нет предмета для спора. Остальное — где-то вы правы и я меняю подачу, где-то моя формулировка была точнее исходной находки, чем звучит в вашем пересказе. Спасибо, что разбираете по существу, а не общими словами


          1. BugM
            12.09.2026 15:15

            @moderator

            Тут целая серия ллм комментариев. Вроде такое же запрещено?


  1. InsiderCrush
    12.09.2026 15:15

    Очень полезная статья. Хотя и тяжелая для нетехнических пользователей. Им бы в начало статьи большими буквами гайд, что отключать и у кого. Я первый в очереди на гайд стоял бы :D


    1. MountainGoat
      12.09.2026 15:15

      А мало что вообще можно сделать. Это не Линукс, где всю хрень можно запихать в докер, и пусть там сидит. От некоторых способов слежки помогает Shelter, но его сначала поставить надо, и помогает не всегда, а это тот случай когда одна ошибка - и ты ошибся.

      Помогает только отдельный телефон иметь. Благо продажу БУ телефонов пока не запретили, и за 3 к₽ можно купить рабочий аппарат.


      1. Dzzzen
        12.09.2026 15:15

        Как минимум, можно использовать dns-сервер с фильтрацией трекеров, и проверить, какие разрешения можно отозвать. Ну и мод-версии приложений никто не отменял.


  1. gliderman
    12.09.2026 15:15

    А где в этом списке Макс?


    1. johnick1234 Автор
      12.09.2026 15:15

      В первой части был уже https://habr.com/ru/articles/1029004/


  1. PM_Inna_Ka
    12.09.2026 15:15

    Как раз сейчас на другой стороне этого вопроса — строю продукт, который сам просит у пользователя чувствительные данные (фото юзера для генерации новой картинки), и вижу изнутри, как легко случайно натащить лишних SDK/трекеров просто через привычные библиотеки, не задумываясь. После таких аудитов начинаешь параноить по-хорошему — сверяешь каждую зависимость на предмет “а зачем она вообще шлёт что-то на сторону”.

    Вопрос по методологии: вы смотрели трекеры именно статическим анализом (по коду/манифесту) или ловили реальный трафик в рантайме тоже? Спрашиваю потому что часть SDK умеет молчать, пока не сработает конкретное условие — статика может часть такого не поймать.


    1. johnick1234 Автор
      12.09.2026 15:15

      В основном статика и логи приложений


  1. EuHex
    12.09.2026 15:15

    Samsung Knox может тут быть как то полезен?