Versionsbindung

Alle KeyMint-Schlüssel müssen an einen Root of Trust für das Gerät gebunden sein. Die Root of Trust ist ein Bitstring, der aus dem öffentlichen Schlüssel abgeleitet wird, der zum Verifizieren der Signatur des Boot-Images verwendet wird, zusammen mit dem Sperrstatus des Bootloaders.

KeyMint-Schlüssel müssen außerdem an die Betriebssystemversion und die Patchebene des Geräts gebunden sein. Zur Unterstützung der modularen Struktur von Treble enthält diese Versionsbindung separate Patchebenen für jede Partition (boot, system und vendor). So kann jede Partition unabhängig aktualisiert werden und es wird gleichzeitig ein Rollback-Schutz bereitgestellt.

Um diese Versionsbindung zu implementieren, benötigt die KeyMint-Vertrauenswürdige Anwendung (TA) eine Möglichkeit, die aktuelle Betriebssystemversion und die Patchebenen sicher zu empfangen und dafür zu sorgen, dass die empfangenen Informationen mit allen Informationen zum laufenden System übereinstimmen.

  • Geräte mit Android Verified Boot (AVB):
    • Die Patch-Level und die Betriebssystemversion können in vbmeta.img enthalten sein, damit der Bootloader sie an KeyMint weitergeben kann.
    • Bei verketteten Partitionen befinden sich die Versionsinformationen für die Partition in der verketteten VBMeta.
    • Im Allgemeinen sollten sich Versionsinformationen in der VBMeta struct befinden, die die Bestätigungsdaten (Hash oder Hashbaum) für eine bestimmte Partition enthält.
  • Geräte ohne AVB:
    • Implementierungen des Bootmodus mit Verifikation müssen dem Bootloader einen Hash der Versionsmetadaten zur Verfügung stellen, damit der Bootloader den Hash an KeyMint weitergeben kann.
    • boot.img kann weiterhin Patchebenen im Header speichern.
    • system.img kann Patchebenen und die Betriebssystemversion weiterhin in Lesezugriffseigenschaften speichern.
    • vendor.img speichert die Patchebene in der nur lesbaren Eigenschaft ro.vendor.build.version.security_patch.
    • Der Bootloader kann KeyMint einen Hash aller Daten zur Verfügung stellen, die durch Verified Boot validiert wurden.

Die folgenden Tags beschreiben Versionsinformationen für die entsprechenden Partitionen:

Bei KeyMint-Implementierungen sollten alle Patchebenen unabhängig voneinander behandelt werden. Schlüssel können verwendet werden, wenn alle Versionsinformationen mit den mit einem Schlüssel verknüpften Werten übereinstimmen. Wenn die aktuelle Geräteversion neuer ist als alle mit einem Schlüssel verknüpften Werte, gibt KeyMint bei jedem Versuch, den Schlüssel zu verwenden, den Fehler KEY_REQUIRES_UPGRADE zurück. Der Keystore führt dann IKeyMintDevice::upgradeKey() aus, um einen neuen Keyblob zu generieren, der an die aktuellen Patchebenen gebunden ist. Anschließend löscht der Keystore den vorherigen Keyblob mit einem Aufruf von IKeyMintDevice::deleteKey().