Что внутри APK, прежде чем вы его установите
APK — это zip-файл с приложенной декларацией. Прежде чем Android выполнит хоть одну строку его кода, пакет уже заявляет, кем он себя называет, какие версии Android поддерживает, что хочет иметь право делать, какие его части могут вызывать другие приложения и кто его подписал. Ничего из этого не требует установки. Прочитать это заранее — значит превратить прыжок веры в десятиминутную проверку, а её часто достаточно, чтобы принять решение.
Почему APK, установленный вручную, заслуживает первого взгляда
Приложения из официального магазина приходят со страницей, историей отзывов и страницей издателя. APK, скачанный в обход — с сайта поставщика, зеркала, форума, из чата или старой резервной копии, — не приносит ничего из этого контекста, и запрос на установку его не заменяет. Установщик Android показывает имя и значок, а разрешения появляются поздно, сгруппированными и упрощёнными, ровно в тот момент, когда вы меньше всего склонны остановиться и подумать. Когда приложение уже установлено и один раз запущено, оно, возможно, уже держит выданные разрешения и успело воспользоваться сетью. Дешёвый момент для вопросов — до этого, пока файл ещё просто файл.
Это не довод против ручной установки как таковой. Поставщики распространяют законные приложения напрямую, компании развёртывают так внутренние инструменты, а старые версии иногда решают настоящие проблемы. Это довод в пользу того, чтобы читать, что вам вручили. Анализатор APK на этом сайте разбирает пакет в вашем браузере — файл никогда не загружается и не выполняется — и показывает манифест, разрешения, компоненты и сертификат подписи в одном виде. Каким бы инструментом вы ни пользовались, сохраняйте этот порядок: сначала проверка, потом установка, а любое приложение, не пережившее проверку, считайте ответом само по себе.
Манифест — собственная декларация приложения
Каждый APK содержит AndroidManifest.xml, хранящийся в бинарном XML, и это декларация приложения о самом себе. Он называет пакет — уникальную идентичность, которую использует Android, например com.example.app, — вместе с числовым versionCode и читаемым versionName. Он декларирует компоненты приложения, запрашиваемые разрешения и ожидаемые аппаратные и программные возможности. Поскольку Android обеспечивает исполнение большой части этого файла, его труднее подделать мимоходом, чем страницу магазина или страницу загрузки: приложение не может тихо пользоваться разрешением, которое никогда не декларировало, и не может притвориться обновлением пакета, чьё имя оно не разделяет.
Два числа в манифесте удивительно много говорят о сопровождении. minSdkVersion — самая старая версия Android, на которой приложение будет работать; очень низкий порог означает поддержку устройств и моделей безопасности многолетней давности, иногда необходимую, а иногда просто унаследованную и забытую. targetSdkVersion — уровень поведения Android, которому приложение, по его словам, следует. Google каждый год повышает цель, требуемую для обновлений в магазине, потому что более высокая цель подводит приложение под новые правила приватности и безопасности. APK с целью многолетней давности не является автоматически вредоносным — но он говорит вам, что избегал этих новых правил или никогда им не соответствовал, и стоит спросить, почему.
Разрешения, прочитанные как следует
Android делит разрешения на классы, и класс важнее названия. Обычные разрешения выдаются автоматически при установке — доступ к сети является знакомым примером, — потому что система считает их малорискованными. Опасные разрешения затрагивают чувствительные данные и действия, такие как контакты, сообщения, точное местоположение, микрофон и камера; им нужен запрос во время работы, который пользователь может отклонить. Разрешения по подписи выдаются только приложениям, подписанным тем же сертификатом, или самой системе, поэтому стороннее приложение, декларирующее такое разрешение, ничего от него не получает. Читая список разрешений, мысленно разложите его по этим группам, прежде чем судить о любой отдельной строке.
Вердикт — это контекст, а не количество. Фонарик, просящий читать SMS, не имеет для этого честной причины; мессенджер, просящий то же разрешение, по крайней мере может объясниться — прочитать код подтверждения или предложить себя в качестве приложения сообщений по умолчанию. Банковское приложение может законно запрашивать много разрешений, а простая игра, запрашивающая лишь несколько, может включить именно то одно, которое не подходит. Поэтому не оценивайте приложения только по числу разрешений. Для каждого опасного разрешения спрашивайте, какая функция этого приложения сломается без него. Запросы, которые вы не можете связать с функцией, и есть находка — и именно их скрывает сводка при установке.
Экспортированные компоненты и поверхность атаки, которую они создают
Приложение состоит из компонентов — активностей (экранов), служб, приёмников широковещательных сообщений и поставщиков контента, — и манифест указывает, какие из них экспортированы, то есть достижимы для других приложений на устройстве. Экспортированные компоненты сами по себе не ошибка: цель для «поделиться», открыватель файлов и глубокая ссылка работают потому, что компонент экспортирован намеренно, защищён и в современном Android объявлен явно. Риск — в экспортированных компонентах, которые никогда не должны были быть публичной дверью: служба, которую любое приложение может запустить, приёмник, который любое может вызвать, или поставщик, отдающий данные приложения любому, кто попросит, без проверки разрешений на входе.
Два флага манифеста заслуживают прямого взгляда в любом рабочем приложении. Приложение, помеченное как отлаживаемое, может быть подключено и изучено инструментами на подсоединённой машине; это настройка для разработки, и поставка её включённой — тревожный сигнал о том, как был собран релиз. Разрешение резервного копирования означает, что приватные данные приложения могут попасть в резервные копии устройства, что может быть удобно, а может и переместить данные, которые вы считали остающимися внутри приложения, в куда менее контролируемое место. Ни один из флагов не доказывает, что приложение вредно. Оба дёшево проверить, трудно оправдать в готовом продукте, и это ровно тот тип деталей, который никогда не появляется на странице загрузки.
Сертификаты подписи: система идентичности Android
Каждый APK подписан, и сертификат подписи — самое близкое к удостоверению личности, что есть у Android. Android установит обновление поверх существующего приложения только тогда, когда обе копии разделяют одно имя пакета и одного подписавшего. Это единственное правило делает много тихой работы: чужой не может прислать троянизированное обновление приложения, которому вы уже доверяете, потому что у него нет исходного ключа, а отпечаток сертификата — обычно показываемый как дайджест SHA-256 — является практическим способом проверить непрерывность. Если поставщик публикует ожидаемый отпечаток, сравните его. Сопоставитель сертификатов и ключей на этом сайте покрывает ту же логику отпечатков для сертификатов и ключей в целом.
Чётко понимайте, что отпечаток доказывает, а что нет. Он доказывает, что этот файл подписан обладателем одного конкретного закрытого ключа и что он совпадает — или не совпадает — с другим файлом, подписанным тем же ключом. Он не доказывает, что обладатель ключа честен, компетентен или даже является компанией, названной в полях субъекта сертификата, которые подписывающий заполняет сам. Перепакованное приложение обычно подписано другим сертификатом, чем оригинал, поэтому несовпадение отпечатка — сильный сигнал остановиться; совпадение — лишь сигнал непрерывности. Идентичность в Android — это непрерывность ключа, и ничего больше; относитесь к ней соответственно.
Контрольный список перед установкой
Соберите части в фиксированном порядке, и проверка займёт минуты. Первое, идентичность: совпадает ли имя пакета с ожидаемым приложением, и правдоподобны ли код и название версии для того релиза, который вы хотели скачать? Второе, сопровождение: насколько стары минимальный и целевой уровни SDK, и подходит ли это приложению, за которым ещё следят? Третье, разрешения: перечислите опасные и свяжите каждое с функцией, останавливаясь на любом, которое не можете объяснить. Четвёртое, поверхность: какие компоненты экспортированы, и включены ли отладка и резервное копирование? Пятое, подпись: совпадает ли отпечаток сертификата со значением, заявленным издателем, или хотя бы с копией, которой вы уже доверяете? Прогоните файл через анализатор APK и пройдите этот список на одном экране.
Затем решайте в три корзины, а не в две. Устанавливайте, когда всё связывается с функцией и отпечаток сходится. Устанавливайте осторожно — на тестовом устройстве, в рабочем профиле или без выдачи сомнительных разрешений, — когда почти всё подходит, но один пункт требует наблюдения. Или уходите, когда имя пакета неверно, отпечаток не совпадает или за опасным разрешением не стоит никакой вообразимой функции. Уход стоит одной загрузки; обратное направление может стоить аккаунта. И держите привычку в пропорции: это сортировка, как первые десять минут с анализатором захвата пакетов, — быстрое, честное чтение того, что файл заявляет о себе, сделанное прежде, чем вы дадите ему место на устройстве, которое носите повсюду.
Часто задаваемые вопросы
Чистый манифест означает, что APK безопасен?
Нет. Манифест — это декларация, а не отчёт о поведении. Приложение может декларировать скромный, вполне правдоподобный набор разрешений и компонентов и при этом плохо вести себя в коде — связываться с серверами, злоупотреблять законно выданными разрешениями или подгружать новое поведение после установки. Чтение манифеста — это сортировка: оно быстро и дёшево ловит несоответствующие идентичности, необъяснённые разрешения, открытые компоненты и неверные сертификаты подписи. Это не вердикт о вредоносности, и любой инструмент, превращающий чтение манифеста в зелёную печать «безопасно», заявляет больше, чем поддерживают доказательства.
Почему одно и то же приложение показывает разные разрешения в разных инструментах?
Обычно по трём законным причинам. Во-первых, ограничение по версии: разрешение может нести maxSdkVersion, так что оно действует только до определённого уровня Android, и инструменты различаются в том, показывают ли они такие записи. Во-вторых, группировка: Android при запросе представляет разрешения группами, а манифест перечисляет отдельные разрешения, поэтому сгруппированный вид кажется короче полного списка. В-третьих, слияние: библиотеки, упакованные в приложение, приносят собственные записи манифеста, которые сборка сливает в итоговый файл, — поэтому установленный манифест может содержать разрешения, которые ни одна часть собственного кода приложения никогда не декларировала. Различия — повод посмотреть, какая причина применима, а не автоматическое доказательство подделки.
Можно ли проверить APK, ничего не устанавливая?
Да — в этом и смысл локального анализатора в браузере. APK разбирается как файл: его бинарный манифест декодируется, его ресурсы читаются ради меток и строк, а его сертификаты подписи извлекаются и получают отпечатки. Код приложения никогда не выполняется, ничего ни на какое устройство не устанавливается, а с анализатором на этом сайте файл и не загружается — разбор происходит во вкладке вашего браузера. Если служба проверки просит вас загрузить APK на сервер, спросите себя, место ли этому файлу — возможно, внутренней сборке — вообще на чужой машине.