Versionsbindung

Alle KeyMint-Schlüssel müssen an eine 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 zur Überprüfung der Signatur des Boot-Images verwendet wird, zusammen mit dem Sperrstatus des Bootloaders.

KeyMint-Schlüssel müssen auch an die Betriebssystemversion und den Patch-Level des Geräts gebunden sein. Zur Unterstützung der modularen Struktur von Treble umfasst diese Versionsbindung separate Patch-Level für jede Partition (boot, system und vendor). Dadurch kann jede Partition unabhängig aktualisiert werden, während gleichzeitig ein Rollback-Schutz geboten wird.

Um diese Versionsbindung zu implementieren, benötigt die vertrauenswürdige KeyMint-App (TA) eine Möglichkeit, die aktuelle Betriebssystemversion und die Patch-Level sicher zu empfangen und sicherzustellen, dass die empfangenen Informationen mit allen Informationen über das ausgeführte System übereinstimmen.

  • Geräte mit Android-Bootmodus mit Verifikation (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 Versionsinformationen in der VBMeta struct enthalten sein, 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 Patch-Level im Header speichern.
    • system.img kann Patch-Level und die Betriebssystemversion weiterhin in schreibgeschützten Attributen speichern.
    • vendor.img speichert die Patch-Ebene im Attribut mit Lesezugriff ro.vendor.build.version.security_patch.
    • Der Bootloader kann einen Hash aller Daten, die durch den Bootmodus mit Verifikation validiert wurden, an KeyMint senden.

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

KeyMint-Implementierungen sollten alle Patch-Level unabhängig voneinander behandeln. Schlüssel können verwendet werden, wenn alle Versionsinformationen mit den Werten übereinstimmen, die einem Schlüssel zugeordnet sind. Wenn die aktuelle Geräteversion neuer ist als ein mit einem Schlüssel verknüpfter Wert, 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 ein neues Schlüssel-Blob zu generieren, das an die aktuellen Patchebenen gebunden ist. Anschließend löscht der Keystore das vorherige Schlüssel-Blob mit einem Aufruf von IKeyMintDevice::deleteKey.