Вы скачали APK не из Google Play — может, это старое приложение с форума, корпоративный клиент, который вам дали на работе, или модифицированная версия. Вопрос один: есть ли внутри известные уязвимости? Проверить это реально, и не обязательно для этого быть безопасником с десятилетним стажем. Разберём конкретный путь — от извлечения информации из APK до поиска по CVE-базам.
- Что на самом деле нужно сделать
- Шаг 1. Что можно вытащить из APK
- Шаг 2. Инструменты для извлечения информации
- APKTool — основной инструмент
- Извлечение информации о библиотеках
- MobSF — самый удобный путь
- Шаг 3. Поиск по CVE-базам
- Где искать
- Как искать правильно
- Шаг 4. Автоматизация проверки
- OWASP Dependency-Check
- OSV-Scanner
- Сравнение инструментов
- Шаг 5. Что делать с результатами
- Частые ошибки при проверке
- Как действовать в зависимости от вашей ситуации
- Ситуация 1: Вы разработчик и хотите проверить свой APK
- Ситуация 2: Вы получаете APK от третьей стороны (вендор, подрядчик)
- Ситуация 3: Вы проверяете APK перед установкой на устройство
- Ситуация 4: Вы аудитор и вам нужен отчёт
- Практические рекомендации
- Итог
Что на самом деле нужно сделать
Идея проста: внутри APK-файла — набор библиотек, зависимостей и компонентов, каждый из которых имеет версию. Если версия известна, можно проверить её по базам Common Vulnerabilities and Exposures (CVE) — и понять, не затронута ли она уже найденными уязвимостями.
Проблема в том, что APK — это бинарный файл. Нельзя просто открыть его в текстовом редакторе и посмотреть список зависимостей. Нужно извлечь информацию, а потом искать по ней в базах. Разберём это по шагам.
Шаг 1. Что можно вытащить из APK
APK — это ZIP-архив. Внутри лежит манифест, ресурсы, нативные библиотеки и — самое важное — файл classes.dex (или несколько), в котором находится скомпилированный код. Также внутри могут быть сторонние библиотеки: OkHttp, Retrofit, OpenSSL, FFmpeg, Firebase SDK и десятки других.
Для проверки на CVE нам нужны:
- Названия библиотек и их версии
- Версия используемых компонентов (например, версия OpenSSL, версия Chromium WebView)
- Информация из манифеста: разрешения, целевая SDK-версия
Версия библиотеки — это ключ. Без неё поиск по CVE бессмысленен.
Шаг 2. Инструменты для извлечения информации
APKTool — основной инструмент
APKTool декомпилирует APK обратно в читаемый формат. Установка и запуск:
- Скачайте APKTool с официального сайта (ibotpeaches.github.io/Apktool/)
- Выполните:
apktool d app.apk -o output_dir - В выходной папке появится декомпилированный манифест, ресурсы и smali-код
Из манифеста вы получите список разрешений, используемые activity, а иногда и версии компонентов. Но главное — вы увидите структуру приложения.
Извлечение информации о библиотеках
После декомпиляции ищите в папке output_dir/res и output_dir/lib файлы библиотек. Нативные библиотеки (.so файлы) лежат в lib/ по архитектурам. Их названия часто содержат версии: libssl.so.1.1 — это OpenSSL 1.1.x.
Для Java/Kotlin-библиотек ситуация сложнее. Они упакованы в classes.dex, и нужно искать по строкам. Можно использовать:
strings classes.dex | grep -i "okhttp\|retrofit\|firebase"— поиск по строкам в DEX-файле- MobSF (Mobile Security Framework) — автоматизированный инструмент, который сам извлекает библиотеки и их версии
- Dependency-Check от OWASP — если вы можете получить исходный код или JAR-файлы
MobSF — самый удобный путь
Если не хотите делать всё вручную, запустите MobSF. Это веб-приложение, которое принимает APK, декомпилирует его, находит библиотеки, проверяет разрешения и даже ищет известные уязвимости.
Установка через Docker:
docker pull opensecurity/mobile-security-framework-mobsfdocker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf- Откройте
http://localhost:8000и загрузите APK
MobSF покажет список библиотек с версиями, разрешения приложения, hardcoded-секреты и потенциальные уязвимости. Это не замена полноценному CVE-поиску, но отличная отправная точка.
Шаг 3. Поиск по CVE-базам
Когда у вас есть список библиотек и версий, начинается основная работа. Нужно проверить каждую библиотеку по базам известных уязвимостей.
Где искать
- NVD (National Vulnerability Database) — nvd.nist.gov — основная правительственная база США. Самая полная, но интерфейс неудобный для ручного поиска
- CVE Mitre — cve.mitre.org — справочник CVE-идентификаторов
- OSV (Open Source Vulnerabilities) — osv.dev — удобный API и веб-интерфейс, хорошо работает с зависимостями
- GitHub Advisory Database — github.com/advisories — уязвимости в открытом исходном коде, часто с патчами
- Snyk Vulnerability Database — security.snyk.io — коммерческая база с бесплатным доступом, хорошо структурирована
Как искать правильно
Просто вбить название библиотеки в поиск — недостаточно. Нужно искать с указанием версии или диапазона версий. Например:
- В NVD:
OkHttp 3.12.0— ищем конкретную версию - В OSV:
pkg:maven/com.squareup.okhttp3/okhttp@3.12.0— формат Package URL - В Snyk: вводите название библиотеки и фильтруйте по версии
Если вы не знаете точную версию, а знаете диапазон (например, OpenSSL 1.1.x), ищите все CVE, затрагивающие этот диапазон. В OSV можно указать диапазон версий прямо в запросе.
Шаг 4. Автоматизация проверки
Ручной поиск работает, но если библиотек двадцать — это утомительно. Есть инструменты, которые автоматизируют процесс.
OWASP Dependency-Check
Если у вас есть доступ к исходному коду или вы извлекли JAR-файлы из APK, Dependency-Check просканирует их и сверит с NVD.
- Скачайте с GitHub (jeremy-lin/dependency-check)
- Запустите:
dependency-check.sh --scan ./lib_folder --format HTML - Получите отчёт с найденными CVE и оценкой критичности (CVSS)
OSV-Scanner
Более современная альтернатива от Google. Работает с lock-файлами, но может сканировать и просто папки с зависимостями.
- Установите:
go install github.com/google/osv-scanner/cmd/osv-scanner@latest - Запустите:
osv-scanner --docker ./output_dir
Сравнение инструментов
| Инструмент | Что сканирует | Источник CVE-данных | Сложность настройки | Подходит для APK |
|---|---|---|---|---|
| MobSF | APK напрямую | NVD + собственные правила | Средняя (Docker) | Да |
| OSV-Scanner | Исходный код, lock-файлы | OSV.dev | Низкая | Частично |
| Dependency-Check | JAR, исходный код | NVD | Средняя | Частично |
| Snyk Code | Исходный код, контейнеры | Snyk DB | Низкая | Нет (только код) |
Шаг 5. Что делать с результатами
Вы нашли CVE. Теперь важно понять, насколько это критично в вашем случае.
Смотрите на:
- CVSS-оценку — от 0 до 10. Выше 7 — критично, но не паникуйте раньше времени
- Вектор атаки — требуется ли локальный доступ или атака удалённая
- Эксплоит в дикой природе — проверьте на Exploit-DB (exploit-db.com), есть ли рабочий эксплоит
- Контекст использования — используется ли уязвимый код в вашем сценарии
Пример: вы нашли CVE-2023-36033 в OkHttp 3.14.9 — отказ в обслуживании при обработке повреждённого TLS-сертификата. Если ваше приложение не использует TLS-клиентские сертификаты и не обрабатывает ответы от непроверенных серверов — реальный риск низкий.
Частые ошибки при проверке
Ошибка 1. Проверять только название библиотеки без версии. CVE привязаны к конкретным версиям. «Уязвимость в OpenSSL» — бесполезная фраза без номера версии.
Ошибка 2. Игнорировать CVE с низким CVSS. Низкая оценка не значит отсутствие риска — иногда это неправильная оценка, иногда цепочка из нескольких низких даёт критическую уязвимость.
Ошибка 3. Не обновлять CVE-базы. Новые уязвимости появляются каждый день. Проверка по базе месячной давности — пропуск свежих CVE.
Ошибка 4. Считать, что если CVE нет — код безопасен. CVE-база содержит только известные уязвимости. Неизвестных там не будет по определению.
Ошибка 5. Не учитывать транзитивные зависимости. Библиотека A может быть безопасна, но она зависит от библиотеки B, в которой есть CVE. Проверяйте всю цепочку.
Как действовать в зависимости от вашей ситуации
Ситуация 1: Вы разработчик и хотите проверить свой APK
Используйте MobSF для быстрого сканирования. Затем запустите OSV-Scanner по исходному коду. Если нашли CVE — обновите зависимость до версии с патчем. Если патча нет — оцените риск и рассмотрите замену библиотеки.
Ситуация 2: Вы получаете APK от третьей стороны (вендор, подрядчик)
Попросите у поставщика SBOM (Software Bill of Materials) — список всех компонентов с версиями. Если не дают — извлеките сами через APKTool + MobSF. Проверьте по OSV и NVD. Включите требование об отсутствии критических CVE в договор.
Ситуация 3: Вы проверяете APK перед установкой на устройство
Запустите MobSF или загрузите APK в онлайн-сервис (например, Koodous или VirusTotal — они тоже показывают известные уязвимости). Если найдены критические CVE с рабочими эксплоитами — не устанавливайте.
Ситуация 4: Вы аудитор и вам нужен отчёт
Соберите все найденные CVE, отсортируйте по CVSS, добавьте контекст использования. Используйте Dependency-Check для генерации отчёта. Укажите, какие CVE эксплуатируемы в данном приложении, а какие — теоретически.
Практические рекомендации
- Всегда извлекайте версии библиотек — без них CVE-поиск бессмыслен
- Используйте минимум два источника CVE-данных (например, NVD + OSV) — они иногда расходятся в оценках
- Проверяйте транзитивные зависимости — уязвимость может быть в библиотеке третьего уровня
- Не останавливайтесь на найденных CVE — оцените реальный риск в контексте вашего приложения
- Если нашли критическую уязвимость — проверьте, есть ли эксплоит в открытом доступе (Exploit-DB, GitHub PoC)
- Документируйте результаты — список библиотек, версии, найденные CVE, оценка риска
Итог
Проверка APK на известные уязвимости — это не магия, а методичная работа: извлеките библиотеки и версии из APK (APKTool, MobSF), проверьте по CVE-базам (NVD, OSV, Snyk), оцените реальный риск. Автоматизируйте рутину через OSV-Scanner или Dependency-Check. Главное — не останавливаться на факте «CVE найден», а понимать, эксплуатируема ли уязвимость в вашем конкретном случае.
Начните с MobSF — он даст вам 80% информации за 15 минут. Дальше — ручная проверка по базам для тех библиотек, которые показались подозрительными.
