Обзор
Android 13 поддерживает схему подписи APK v3.1, усовершенствованную версию существующей схемы подписи APK v3 . Схема v3.1 устраняет некоторые известные проблемы схемы подписи APK v3, связанные с ротацией. В частности, схема подписи версии 3.1 поддерживает таргетинг на версию SDK, что позволяет использовать ротацию для более поздней версии платформы.
Схема подписи версии 3.1 использует идентификатор блока, который не распознается в Android 12 или более ранней версии. Таким образом, платформа применяет следующее поведение подписывающего лица:
- На устройствах под управлением Android 13 или более поздней версии в блоке версии 3.1 используется повернутая подписывающая сторона.
- Устройства под управлением более старых версий Android игнорируют поменянную подписывающую сторону и вместо этого используют исходную подписывающую сторону в блоке v3.
Приложения, которые еще не сменили ключ подписи, не требуют каких-либо дополнительных действий. Всякий раз, когда эти приложения выбирают ротацию, система по умолчанию применяет схему подписи v3.1.
блок подписи v3.1
Блок подписи версии 3.1 будет иметь то же содержимое, что и блок подписи версии 3, но с новым идентификатором блока эти подписи будут распознаваться только на устройствах под управлением Android 13 и более поздних версий. Это позволяет приложениям безопасно менять ключи подписи, не беспокоясь о многоцелевых APK, поскольку исходную подписывающую сторону можно использовать для подписи APK в блоке подписи версии 3, а поменянную подписывающую сторону — в блоке подписи версии 3.1. Это также позволяет платформе повторно использовать все существующие коды проверки для блока подписи v3 при проверке подписи v3.1.
По умолчанию библиотека apksig
будет использовать блок подписи v3.1 всякий раз, когда в конфигурации подписи указан повернутый ключ и происхождение. Если minSdkVersion
приложения меньше Android 13 и используется ротированный ключ, необходимо также указать исходный ключ подписи, чтобы его можно было использовать для подписи APK в блоке подписи v3. Это похоже на текущее поведение, когда требуется первоначальная подписывающая сторона, если APK предназначен для версии более ранней, чем Android 9.
Для поддержки ротации ключей таргетинга, начиная с определенной версии SDK, библиотека apksig
предоставит новые API, которые позволят установить минимальную версию SDK для ротации. Если в качестве минимальной версии для поддержки ротации указана версия SDK ниже Android 13, то в качестве минимальной версии для поддержки ротации указана исходная версия v3. блок будет использоваться. Блок подписи v3.1 используется только при наличии ротации, где минимальная версия SDK для ротации установлена на Android 13 и более поздних версиях. Блок подписи v3 будет иметь новый атрибут для защиты от удаления минимальной версии SDK при ротации.
APK включает в себя Lineage | Значение ротации-мин-sdk-версии | блок подписи v3 | блок подписи v3.1 |
---|---|---|---|
Нет | Значение по умолчанию или любое значение (обозначенное x ниже) | Подписано первоначальным подписывающим лицом, ориентировано на Android 9 и более поздние версии. | Нет |
Да | По умолчанию | Подписано первоначальным подписывающим лицом, ориентировано на Android 9–12L. | Подписано поочередным подписывающим лицом, ориентировано на Android 13 и более поздних версий. |
Да | х < 33 (Андроид 13) | Подписано поочередным подписывающим лицом, предназначено для Android 9 и более поздних версий. | Нет |
Да | х >= 33 (Андроид 13) | Подписано первоначальным подписывающим лицом, ориентировано на Android 9 – ( x -1) | Подписано поочередным подписывающим лицом, таргетинг на x+ |
Проблемы, связанные с ротацией
В платформе решены следующие проблемы, связанные с ротацией:
Исправления Android 12
- Платформа предоставит разрешение на подпись запрашивающему приложению только в том случае, если текущее подписывающее лицо приложения входит в родословную подписывающего устройства или является текущим подписывающим лицом другого приложения; это предотвращает предоставление разрешения на подпись запрашивающему приложению, если два приложения следуют рекомендациям по ключам подписи и чередуются с разными ключами подписи.
- Функция отката APK платформы не могла выполнить откат APK, ключ подписи которого только что был заменен, если только предыдущий ключ в линии подписи не имел возможности отката, но эта возможность противоречит цели ротации, поскольку позволяет подписывать новое обновление пакета предыдущий ключ подписи и откат повернутого ключа.
- APK, подписанный только с использованием повернутого ключа, а затем обновленный с помощью APK, подписанного с использованием исходного ключа и ротированного ключа в линии, будет отображать только ротированный ключ в линии на устройствах под управлением Android 11 и более ранних версий.
Исправления Android 11
-
PackageManager#checkSignatures
не был должным образом обновлен для проверки исходных ключей подписи двух пакетов. Это сломало инструментарий для приложений, использующих повернутый ключ подписи, с APK-файлом инструментария, использующим исходный ключ подписи. - Пакеты под общим
sharedUserId
имеют общую линию подписи. Всякий раз, когда приложение с обновленной линией подписи устанавливается или обновляется вsharedUiserId
, родословная этого приложения заменяет общую родословную дляsharedUserId
(то есть, если линия подписи приложения была A → B, и приложение обновляется вsharedUserId
). с линией B -> C, тоsharedUserId
будет заменена на B -> C). Аналогичным образом, возможности предыдущего подписывающего лица в линии передачи не могли быть обновлены, если не была изменена линия подписи.
интеграция v4
Схема подписи v4 использует конфигурацию подписи, предоставленную apksigner; в случае ротации нескольких конфигураций подписи используется последняя измененная конфигурация подписи. До появления версии 3.1 версия 3 включала только эту последнюю конфигурацию ротации подписи, поэтому версия 4 могла использовать эту конфигурацию как есть; при этом схема подписи версии 4 могла поддерживать ротацию, поскольку она использовала повернутый ключ подписи в своей SigningInfo. Хотя SigningInfo версии 4 не включает полную линию подписи, она может извлечь ее из блока подписи версии 3, чтобы предоставить платформе доступ к линии происхождения для любых запросов подписи. Когда используется версия 3.1 для целевой ротации для предоставленной ротационной мин-версии SDK, общая конфигурация v3 будет включать как исходную конфигурацию подписи, так и последнюю измененную конфигурацию подписи. Было создано расширение схемы подписи v4, которое включает дополнительные информационные блоки подписи для каждой конфигурации подписи из блока v3.1.
Проверка
Чтобы протестировать реализацию версии 3.1, запустите CTS-тесты PkgInstallSignatureVerificationTest.java
в cts/hostsidetests/appsecurity/src/android/appsecurity/cts/
.
Для получения дополнительной информации о тестировании посетите раздел проверки в v3.