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