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

Все ключи 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.

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

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