Привязка версии

Все ключи 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 хеш всех данных, проверенных при запуске.

Следующие теги описывают информацию о версии для соответствующих разделов:

Реализации KeyMint должны обрабатывать все уровни исправлений независимо. Ключи можно использовать, если вся информация о версии соответствует значениям, связанным с ключом. Если текущая версия устройства новее любого значения, связанного с ключом, KeyMint возвращает ошибку KEY_REQUIRES_UPGRADE при любой попытке использовать ключ. Затем Keystore выполняет IKeyMintDevice::upgradeKey, чтобы сгенерировать новый keyblob, привязанный к текущим уровням исправлений. После этого Keystore удаляет предыдущий keyblob с помощью вызова IKeyMintDevice::deleteKey.