Перейти к основному содержанию
Блог

Мобильные

OWASP Mobile Top 10 (2024): от M1 до M10 и что экспертиза проверяет в каждой категории

Разбор списка OWASP Mobile Top 10 2024 года: что означает каждая категория, как эксперт её проверяет и как подготовить приложение.

· 12 мин. чтения

Фото: Rawpixel Ltd, CC BY 2.0 · Wikimedia Commons

Если открыть отчёт экспертизы мобильного приложения, рядом с каждой находкой часто стоят две ссылки: идентификатор MASVS/MASWE и категория OWASP Mobile Top 10. Например, в отчёте по нашему собственному приложению находка «не реализовано обнаружение root» была помечена как MASWE-0097 и M7 (Insufficient Binary Protections). Mobile Top 10 — это список самых важных категорий рисков мобильных приложений; его составляет команда OWASP, последняя редакция вышла в 2024 году.

В этой статье пройдём по списку от M1 до M10: что означает каждая категория, что по ней проверяет экспертиза, как проверить самостоятельно и как исправить. Каждый раздел короткий, для подробностей даны ссылки на соответствующие статьи.

Как используется список

Mobile Top 10 — не стандарт и не методика тестирования, а карта рисков. Практическая проверка ведётся по OWASP MASVS (требования), MASTG (методы тестирования) и MASWE (каталог слабостей). А Top 10 раскладывает находки по понятным категориям и помогает расставить приоритеты. Поэтому при подготовке приложения к экспертизе Top 10 — хороший стартовый чек-лист.

M1: Improper Credential Usage

Что это: неправильное использование ключей, паролей и токенов — API-ключи в коде, общий статический токен для всех пользователей, хранение или передача учётных данных в открытом виде.

Что проверяет экспертиза: APK/IPA декомпилируется, в строках ищутся ключи, пароли, токены; отслеживается, какие учётные данные передаются между приложением и сервером.

Проверьте сами:

jadx -d out app-release.apk
grep -rniE "api[_-]?key|secret|password|bearer" out/
strings -n 8 lib/arm64-v8a/libapp.so | grep -iE "key|secret"

Исправление: секретные ключи только на сервере, приложение обращается к backend с короткоживущим токеном пользователя. Подробнее: ключи внутри APK и IPA.

M2: Inadequate Supply Chain Security

Что это: риск, приходящий через сторонние библиотеки, SDK и процесс сборки: уязвимые или заброшенные пакеты, недоверенные источники, незащищённый CI и ключи подписи.

Что проверяет экспертиза: библиотеки в приложении и их версии, компоненты с известными уязвимостями, лишние SDK (например, рекламные или аналитические, запрашивающие избыточные разрешения).

Проверьте сами: во Flutter — flutter pub outdated, на Android — ./gradlew app:dependencies, на iOS — просмотрите Podfile.lock. Для каждой зависимости: кто её поддерживает, когда было последнее обновление, действительно ли она нужна.

Исправление: lock-файлы в репозитории, зависимости регулярно обновляются, неиспользуемые SDK удалены, ключ release-подписи хранится в безопасном месте (Google Play App Signing или защищённые секреты CI).

M3: Insecure Authentication/Authorization

Что это: ошибки аутентификации и проверки прав — важные решения принимаются только в приложении, сервер не проверяет права, слабое управление сессией, PIN или биометрия применяются только на уровне UI.

Что проверяет экспертиза: API-запросы повторяются с идентификатором другого пользователя (IDOR), проверки внутри приложения отключаются через Frida, экспортированные экраны открываются без входа, проверяется срок жизни токена и его состояние после выхода.

Проверьте сами: отправьте через прокси свой запрос с ID другого пользователя; после выхода вызовите API старым токеном.

Исправление: права проверяются на сервере в каждом запросе, токены короткоживущие и аннулируются на сервере при выходе. Подробнее: IDOR и ошибки авторизации, deep link и экспортированные компоненты.

M4: Insufficient Input/Output Validation

Что это: данные извне (ввод пользователя, deep link, intent, ответ сервера, QR-код) используются без проверки. Результат — XSS в WebView, локальная SQL-инъекция, path traversal, открытие не той страницы внутри приложения.

Что проверяет экспертиза: параметры deep link и intent, URL, передаваемые в WebView, локальные запросы SQLite, работа с именами файлов.

Проверьте сами:

adb shell am start -a android.intent.action.VIEW \
  -d "myapp://open?url=https://evil.example.com"

Исправление: allowlist для каждого внешнего входа, в SQLite только параметризованные запросы, навигация WebView ограничена, на сервере та же валидация. Подробнее: безопасность WebView.

M5: Insecure Communication

Что это: недостаточная защита сетевого взаимодействия — использование http, неправильная проверка сертификата, игнорирование ошибок SSL, отсутствие pinning.

Что проверяет экспертиза: трафик перехватывается через прокси; принимает ли приложение сертификат прокси, есть ли ссылки http, есть ли proceed() в onReceivedSslError. В отчёте по нашему приложению здесь было две находки: небезопасная проверка сертификата (высокий риск) и ссылки http (низкий риск).

Проверьте сами: установите на устройство сертификат Burp или mitmproxy и поработайте с приложением. При правильном pinning запросы должны завершаться ошибкой.

Исправление: на Android — network_security_config с отключённым cleartext и pin-set, во Flutter — SecurityContext только с доверенными корневыми сертификатами, на iOS — без исключений ATS:

<base-config cleartextTrafficPermitted="false" />

Подробнее: SSL pinning, allowBackup и cleartext.

M6: Inadequate Privacy Controls

Что это: персональные данные (ФИО, телефон, ПИНФЛ, геолокация, документы) собираются сверх необходимого, пишутся в логи, отправляются в сторонние SDK или видны на снимках экрана и в уведомлениях.

Что проверяет экспертиза: запрашиваемые разрешения, персональные данные в логах (adb logcat), что уходит в аналитику, что остаётся на экране при уходе приложения в фон.

Проверьте сами:

adb logcat | grep -iE "token|phone|password|passport"

Исправление: только необходимые разрешения и данные, логи в release отключены, на чувствительных экранах ограничены снимки экрана (FLAG_SECURE на Android), персональные данные в аналитику не отправляются.

M7: Insufficient Binary Protections

Что это: бинарник приложения не защищён от обратной разработки и модификации: нет обфускации, не обнаруживаются root/jailbreak и эмулятор, нет противодействия инструментам динамического анализа вроде Frida, не проверяется целостность (tamper).

Что проверяет экспертиза: в нашем опыте это категория с наибольшим числом находок. На Android отсутствие обнаружения root, проверки целостности и защиты от динамического анализа было отмечено как высокий риск, отсутствие обнаружения эмулятора — как средний; на iOS высоким риском было отсутствие обнаружения jailbreak и защиты от динамического анализа.

Проверьте сами: запустите release-сборку на рутованном устройстве или эмуляторе, подключитесь через frida-server, переподпишите и установите APK. Приложение должно обнаружить каждую из ситуаций.

Исправление: RASP-библиотека (мы использовали freeRASP) с блокирующим экраном, R8 minify и обфускация Dart:

flutter build apk --release --obfuscate --split-debug-info=build/symbols

Подробнее: обнаружение root и jailbreak, Frida и RASP, целостность приложения и обфускация.

M8: Security Misconfiguration

Что это: ошибки в настройках платформы и приложения — debuggable=true, allowBackup=true, лишние экспортированные компоненты, избыточные разрешения, включённая отладка WebView в release, неправильные права на файлы.

Что проверяет экспертиза: merged-манифест, Info.plist, entitlements, типы сборок.

Проверьте сами:

apktool d app-release.apk -o app_src
grep -nE 'debuggable|allowBackup|exported="true"|usesCleartextTraffic' app_src/AndroidManifest.xml

Исправление: в release нет debuggable, allowBackup="false" и dataExtractionRules, экспортированы только необходимые компоненты, запрашиваются только необходимые разрешения.

M9: Insecure Data Storage

Что это: чувствительные данные хранятся на устройстве без защиты — токен в SharedPreferences или NSUserDefaults, незашифрованный SQLite, персональные файлы в кеше, cookie WebView после выхода, данные, попадающие в резервную копию.

Что проверяет экспертиза: внутренняя папка приложения (/data/data/<пакет>/) просматривается на рутованном устройстве. В нашем приложении здесь была находка высокого риска «чувствительные данные хранятся во внутреннем хранилище в незашифрованном виде».

Проверьте сами:

adb shell run-as uz.example.app ls -R /data/data/uz.example.app/
adb shell run-as uz.example.app cat shared_prefs/FlutterSharedPreferences.xml

(run-as работает только с debug-сборкой; release проверяйте на рутованном тестовом устройстве.)

Исправление: токены и секреты — в Keystore/Keychain (во Flutter — flutter_secure_storage), при выходе очищаются все локальные данные и данные WebView. Подробнее: Keystore и Keychain.

M10: Insufficient Cryptography

Что это: неправильное использование криптографии — устаревшие алгоритмы (MD5 или SHA1 для паролей, DES, режим ECB), ключи в коде, постоянный IV, собственный «алгоритм шифрования», генерация ключа через Random.

Что проверяет экспертиза: в декомпилированном коде — Cipher.getInstance, MessageDigest, откуда берутся ключ и IV.

Проверьте сами:

grep -rnE 'AES/ECB|DES|MD5|SHA1|SecretKeySpec' out/sources

Исправление: AES-GCM, ключи создаются и хранятся в Keystore/Keychain, IV каждый раз случайный, пароли хешируются только на сервере через bcrypt/Argon2. Лучше всего — не писать криптографию самому, а опираться на платформу и проверенные библиотеки.

Одно замечание: экспертиза запрашивает контрольные суммы MD5, SHA1 и SHA256 для переданного APK/IPA — это не находка M10, а способ идентифицировать файл. Подробнее: контрольные суммы APK/IPA.

Короткий чек-лист перед экспертизой

  • M1: в приложении нет секретных ключей и общего статического токена.
  • M2: зависимости обновлены, неиспользуемые SDK удалены.
  • M3: права проверяются на сервере, токены аннулируются при выходе.
  • M4: входы deep link, intent и WebView проверяются по allowlist.
  • M5: cleartext отключён, pinning работает, ошибки SSL не игнорируются.
  • M6: в логах и аналитике нет персональных данных, разрешения минимальны.
  • M7: RASP (root/jailbreak, эмулятор, hook, debugger, tamper), обфускация включена.
  • M8: нет debuggable, allowBackup="false", экспорт компонентов обоснован.
  • M9: секреты в Keystore/Keychain, при выходе всё очищается.
  • M10: современные алгоритмы, нет ключей в коде, случайный IV.

Вывод

OWASP Mobile Top 10 (2024) раскладывает безопасность приложения на десять понятных вопросов. Почти каждая находка в отчёте экспертизы попадает в одну из этих категорий, поэтому пройти список по пунктам до экспертизы — самый правильный способ уменьшить число находок. По нашему опыту, чаще всего упускают M7 и M9: их не планируют в обычном процессе разработки, но эксперт проверяет их в первую очередь. Общий обзор процесса: что проверяют на экспертизе мобильного приложения.

Если хотите пройти своё приложение от M1 до M10 до экспертизы, оставьте заявку на сканирование. Claude AI агент быстро проанализирует код, манифест и бинарник, а наш специалист подтвердит каждую находку на устройстве и поможет её закрыть.