Подпись приложения

Подпись приложений позволяет разработчикам идентифицировать автора приложения и обновлять свое приложение без создания сложных интерфейсов и разрешений. Каждое приложение , которое запускается на Android платформы должно быть подписано разработчиком . Приложения, которые пытаются установить без подписи, будут отклонены Google Play или установщиком пакетов на устройстве Android.

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

В Android подписание приложения - это первый шаг к помещению приложения в его Application Sandbox. Подписанный сертификат приложения определяет, какой идентификатор пользователя связан с каким приложением; разные приложения запускаются под разными идентификаторами пользователей. Подпись приложений гарантирует, что одно приложение не сможет получить доступ к любому другому приложению, кроме как через четко определенный IPC.

Когда приложение (файл APK) устанавливается на устройство Android, диспетчер пакетов проверяет, правильно ли подписан APK с помощью сертификата, включенного в этот APK. Если сертификат (или, точнее, открытый ключ в сертификате) совпадает с ключом, используемым для подписи любого другого APK на устройстве, новый APK имеет возможность указать в манифесте, что он будет делиться UID с другим аналогичным образом. -подписанные APK.

Приложения могут быть подписаны третьей стороной (OEM, оператор, альтернативный рынок) или самоподписаны. Android обеспечивает подписывание кода с использованием самозаверяющих сертификатов, которые разработчики могут создавать без внешней помощи или разрешения. Заявления не должны быть подписаны центральным органом. Android в настоящее время не выполняет проверку CA для сертификатов приложений.

Приложения также могут объявлять разрешения безопасности на уровне защиты подписи, ограничивая доступ только к приложениям, подписанным одним и тем же ключом, при сохранении различных UID и песочниц приложения. Более тесные отношения с общей Application Sandbox разрешаются через общий UID функции , когда два или более приложения , подписанные с тем же ключом разработчика могут объявить общий UID в их манифесте.

Схемы подписи APK

Android поддерживает три схемы подписи приложений:

Для максимальной совместимости подписывайте приложения со всеми схемами, сначала с помощью v1, затем v2, а затем v3. Устройства Android 7.0+ и новее устанавливают приложения, подписанные схемами v2 +, быстрее, чем устройства, подписанные только схемой v1. Старые платформы Android игнорируют подписи v2 + и поэтому нуждаются в приложениях, которые содержат подписи v1.

Подпись JAR (схема v1)

Подписание APK было частью Android с самого начала. Он основан на подписанном JAR . Для получения дополнительной информации об использовании этой схемы можно найти в документации Android - студии на подписание приложения .

Подписи v1 не защищают некоторые части APK, например метаданные ZIP. Верификатору APK необходимо обработать множество ненадежных (еще не проверенных) структур данных, а затем удалить данные, не охваченные подписями. Это предлагает значительную поверхность для атаки. Более того, верификатор APK должен распаковать все сжатые записи, что отнимает больше времени и памяти. Для решения этих проблем в Android 7.0 представлена ​​схема подписи APK v2.

Схема подписи APK v2 и v3 (v2 + схема)

Устройства под управлением Android 7.0 и более поздних версий поддерживают схему подписи APK v2 (схема v2) и более поздних версий. (Схема v2 была обновлена ​​до версии v3 в Android 9, чтобы включить дополнительную информацию в блок подписи, но в остальном работает так же.) Содержимое APK хешируется и подписывается, а затем полученный блок подписи APK вставляется в APK. Для получения дополнительной информации о применении + схемы v2 к приложению см APK Signature Scheme v2 .

Во время проверки схема v2 + обрабатывает файл APK как большой двоичный объект и выполняет проверку подписи по всему файлу. Любая модификация APK, включая модификации метаданных ZIP, делает подпись APK недействительной. Эта форма проверки APK выполняется значительно быстрее и позволяет обнаруживать больше классов несанкционированных модификаций.

Новый формат имеет обратную совместимость, поэтому APK-файлы, подписанные с помощью нового формата подписи, могут быть установлены на более старых устройствах Android (которые просто игнорируют дополнительные данные, добавленные в APK), если эти APK-файлы также подписаны v1.

Процесс проверки подписи APK

Рисунок процесс верификации подписи 1. АПК

Хэш всего файла APK проверяется на соответствие подписи v2 +, хранящейся в блоке подписи APK. Хэш охватывает все, кроме блока подписи APK, который содержит подпись v2 +. Любая модификация APK вне блока подписи APK делает недействительной подпись APK v2 +. APK-файлы с удаленной подписью v2 + также отклоняются, потому что их подпись v1 указывает, что APK был подписан v2, что заставляет Android 7.0 и новее отказываться проверять APK с помощью своих подписей v1.

Более подробную информацию о процессе проверки подписи APK см раздел Проверка на APK Signature схемы v2.