Подписание приложений

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Рисунок 1. Процесс проверки подписи APK

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

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