Vincolo della versione

Tutte le chiavi KeyMint devono essere associate a una radice di attendibilità per il dispositivo. La radice di attendibilità è una stringa di bit ricavata dalla chiave pubblica utilizzata per verificare la firma dell'immagine di avvio, insieme allo stato di blocco del bootloader.

Le chiavi KeyMint devono essere associate anche alla versione del sistema operativo e al livello di patch del dispositivo. Per supportare la struttura modulare di Treble, questo vincolo di versione include livelli di patch distinti per ogni partizione (boot, system e vendor). In questo modo, ogni partizione può essere aggiornata in modo indipendente, pur garantendo la protezione del rollback.

Per implementare questo vincolo di versione, l'app attendibile KeyMint (TA) ha bisogno di un modo per ricevere in modo sicuro la versione e i livelli di patch del sistema operativo correnti e per garantire che le informazioni ricevute corrispondano a tutte le informazioni sul sistema in esecuzione.

  • Dispositivi con Avvio verificato Android (AVB):
    • I livelli di patch e la versione del sistema operativo possono essere inclusi in vbmeta.img, in modo che il bootloader possa fornirli a KeyMint.
    • Per le partizioni in catena, le informazioni sulla versione della partizione si trovano in VBMeta in catena.
    • In generale, le informazioni sulla versione devono trovarsi in VBMeta struct che contiene i dati di verifica (hash o hashtree) per una determinata partizione.
  • Dispositivi senza AVB:
    • Le implementazioni di Avvio verificato devono fornire un hash dei metadati della versione al bootloader, in modo che il bootloader possa fornire l'hash a KeyMint.
    • boot.img può continuare a memorizzare i livelli di patch nell'intestazione.
    • system.img può continuare a memorizzare i livelli di patch e la versione del sistema operativo in proprietà di sola lettura.
    • vendor.img memorizza il livello del patch nella proprietà di sola lettura ro.vendor.build.version.security_patch.
    • Il bootloader può fornire un hash di tutti i dati convalidati da Avvio verificato a KeyMint.

I seguenti tag descrivono le informazioni sulla versione per le partizioni pertinenti:

Le implementazioni di KeyMint devono trattare tutti i livelli di patch in modo indipendente. Le chiavi sono utilizzabili se tutte le informazioni sulla versione corrispondono ai valori associati a una chiave. Se la versione corrente del dispositivo è più recente di qualsiasi valore associato a una chiave, KeyMint restituisce l'errore KEY_REQUIRES_UPGRADE a ogni tentativo di utilizzo della chiave. Keystore esegue quindi IKeyMintDevice::upgradeKey() per generare un nuovo keyblob associato ai livelli di patch correnti (e successivamente elimina il keyblob precedente con una chiamata a IKeyMintDevice::deleteKey()).