Все ключи KeyMint должны быть привязаны к корню доверия для устройства. Корень доверия — это битовая строка, полученная из открытого ключа, используемого для проверки подписи образа загрузки, вместе с состоянием блокировки загрузчика.
Ключи KeyMint также должны быть привязаны к версии операционной системы и уровню исправления устройства. Для поддержки модульной структуры Treble эта привязка версии включает отдельные уровни исправления для каждого раздела ( boot
, system
и vendor
). Это позволяет обновлять каждый раздел независимо, при этом обеспечивая защиту от отката.
Для реализации этой привязки к версии доверенному приложению KeyMint (TA) необходим способ безопасного получения текущей версии ОС и уровней исправлений, а также обеспечения соответствия получаемой информации всей информации о работающей системе.
- Устройства с проверенной загрузкой Android (AVB):
- Уровни исправлений и версию ОС можно включить в
vbmeta.img
, чтобы загрузчик мог предоставить их KeyMint. - Для связанных разделов информация о версии раздела находится в связанном файле VBMeta.
- Как правило, информация о версии должна находиться в
VBMeta struct
, содержащей проверочные данные (хэш или хэш-дерево) для данного раздела.
- Уровни исправлений и версию ОС можно включить в
- Устройства без AVB:
- Проверенные реализации загрузки должны предоставить хэш метаданных версии загрузчику, чтобы загрузчик мог предоставить хэш KeyMint.
-
boot.img
может продолжать хранить уровни исправлений в заголовке. -
system.img
может продолжать хранить уровни исправлений и версию ОС в свойствах, доступных только для чтения. -
vendor.img
сохраняет уровень исправления в свойстве только для чтенияro.vendor.build.version.security_patch
. - Загрузчик может предоставить хэш всех данных, проверенных Verified Boot, в KeyMint.
Следующие теги описывают информацию о версии соответствующих разделов:
-
Tag::VENDOR_PATCHLEVEL
: разделvendor
-
Tag::BOOT_PATCHLEVEL
:boot
раздел -
Tag::OS_PATCHLEVEL
иOS_VERSION
:system
раздел. (OS_VERSION
удаляется из заголовкаboot.img
.)
Реализации KeyMint должны обрабатывать все уровни исправлений независимо. Ключи можно использовать, если вся информация о версии соответствует значениям, связанным с ключом. Если текущая версия устройства более поздняя, чем любое значение, связанное с ключом, KeyMint возвращает ошибку KEY_REQUIRES_UPGRADE
при любой попытке использования ключа. Затем Keystore выполняет IKeyMintDevice::upgradeKey()
для генерации нового keyblob, привязанного к текущим уровням исправлений (и Keystore впоследствии удаляет предыдущий keyblob с помощью вызова IKeyMintDevice::deleteKey()
).