Анализатор APK
Перетащите пакет Android — файл .apk — и прочитайте, что он заявляет о себе, прежде чем приблизится к телефону: имя пакета и версию, уровни SDK, на которые он нацелен, каждое запрашиваемое разрешение, разрешает ли он отладку и резервное копирование, какие из его компонентов доступны другим приложениям и какими сертификатами он подписан. Файл никогда не покидает ваше устройство: он открывается и разбирается на этой странице, а не загружается на сервер, потому что подозрительный APK — это именно тот файл, который не стоит отдавать на чужой сервер.
Или перетащите файл в любое место этого поля. Всё ниже читается из самого пакета, на этом устройстве: манифест, скомпилированные ресурсы и блоки подписи.
Сводка пакета
Разрешения
Уровни защиты следуют собственной классификации фреймворка Android. Разрешение, которое эта страница не распознаёт, честно отмечается как отсутствующее в справочной таблице — пользовательские, вендорские и более новые разрешения называются как есть, а не угадываются.
Флаги приложения
Компоненты
Сертификаты подписи
Примечания
Что APK заявляет до выполнения первой строки кода
APK — это ZIP-архив с мнениями. Прежде чем Android выполнит хоть какой-то его код, система читает содержащийся внутри бинарный AndroidManifest.xml, и этот единственный файл — удивительно полное заявление о намерениях. Он называет пакет — идентичность, с которой сверяются обновления, — и его версию. Он указывает самую старую версию Android, которую приложение заявляет поддерживать, и ту, по правилам поведения которой оно собрано, и потому целевой SDK важен: низкая цель тихо сохраняет старое, более мягкое поведение разрешений. Он перечисляет каждое разрешение, которое приложение когда-либо сможет использовать, потому что необъявленное разрешение позже выдать нельзя. Он говорит, является ли сборка отлаживаемой — флаг, который никогда не должен доживать до релиза, — и могут ли её данные попасть в резервные копии устройства. И он составляет опись компонентов приложения: активностей, сервисов, приёмников и провайдеров, у каждого — состояние экспорта, решающее, могут ли другие приложения на устройстве его вызывать. Экспортированный компонент без проверки разрешений — классическая поверхность атаки Android, и её можно увидеть здесь, в манифесте, ничего не устанавливая.
Другая половина истории — подпись. Android установит обновление поверх существующего приложения, только если оба подписаны одним ключом, так что отпечаток сертификата подписанта — это непрерывность идентичности приложения: то же имя пакета, подписанное другим ключом, — это другое приложение со знакомой меткой. Эта страница читает оба поколения подписи — сертификаты в стиле Jar в META-INF и блок APK Signature Scheme v2/v3 — и показывает для каждого подписанта субъект, издателя, окно действия и отпечаток SHA-256, который инструмент сопоставления сертификатов и ключей может сравнить с ключом или CSR, который у вас есть. Сопутствующее руководство что внутри APK, прежде чем вы его установите проходит всю проверку как контрольный список. Два честных ограничения: эта страница читает декларации, а не поведение — она не декомпилирует код, не запускает приложение и не судит, является ли оно вредоносным, — а там, где сам манифест неоднозначен (пропущенный флаг exported у компонента с intent-filter, метка, которую скомпилированные ресурсы не разрешают), она так и говорит, вместо того чтобы заполнять пробел догадкой. А то, что приложение делает в сети после запуска, читает из захвата анализатор PCAP.
Частые вопросы
Куда девается мой файл APK?
Никуда. Файл открывается и разбирается на этой странице, на вашем устройстве, и ничего не загружается, не передаётся и не сохраняется — разбор файла не делает сетевых запросов. Здесь это важнее, чем для большинства инструментов: APK, которые больше всего хочется проверить, — это те, которым уже не доверяют, — файл с форума, прямая загрузка, запись в магазине, выглядящая неправильно, — и отправка подозрительного бинарника в удалённую службу сканирования сама по себе является раскрытием. После загрузки страницы инструмент работает и офлайн.
Что проверить перед установкой APK?
Четыре вещи, все видны выше. Имя пакета: это настоящее пространство имён издателя или двойник с одним изменённым символом? Разрешения: фонарику действительно нужны ваши контакты, журнал звонков и точное местоположение — и не прячется ли запрос уровня подписи или специального уровня среди рутинных? Экспортированные компоненты: каждая активность, сервис, приёмник или провайдер, доступные другим приложениям, — это поверхность, которую вы принимаете. И подписант: обновление должно нести тот же сертификат подписи, что и установленное приложение, поэтому сравните отпечаток SHA-256 с доверенной копией, прежде чем устанавливать «новую версию» откуда бы то ни было.
Может ли это сказать, вредоносно ли приложение?
Нет, и любой инструмент, обещающий это по одному манифесту, преувеличивает. Эта страница читает то, что пакет заявляет, — идентичность, разрешения, компоненты, флаги и подписи, — а этого достаточно, чтобы поймать небрежных и самозванцев: клона с неправильным подписантом, фонарик, требующий доступа к SMS, релизную сборку, оставшуюся отлаживаемой. Судить о том, что код делает на самом деле, требуют декомпиляция, динамический анализ или вердикт авторитетного сканера по самому бинарнику. Чистый результат здесь трактуйте как «ничего из заявленного не выглядит неправильным», а не как сертификат безопасности.
Почему у некоторых разрешений написано «нет в справочной таблице»?
Потому что честность лучше правдоподобной догадки. Показанные уровни защиты — обычный, опасный, подписи, специальный — взяты из выверенной таблицы известных разрешений android.* и уровня, который фреймворк назначает каждому. Поставщики добавляют свои разрешения, производители — ещё, а новые версии Android вводят новые имена; ни одного из них в таблице нет, поэтому страница говорит об этом прямо. Неизвестный уровень не значит, что разрешение безобидно или опасно, — он значит, что этот справочник его не покрывает, а имя и пространство имён самого разрешения — то место, откуда начинать проверку.
Что значит «экспортировано: не указано»?
Это значит, что манифест действительно этого не говорит. Когда компонент объявляет intent-filter, но опускает android:exported, действующий ответ исторически зависел от целевого SDK приложения и версии Android: старые правила экспортировали такие компоненты по умолчанию, новые отказываются устанавливать приложение, пока разработчик не решит. Читатель, который уверенно напечатал бы «да» или «нет», выдумал бы факт, которого файл не содержит, поэтому эта страница сообщает о самом пропуске. В ваших собственных сборках это та строка, которую стоит исправить явно.