In Keymaster 1 wurden alle Keymaster-Schlüssel kryptografisch an das Gerät gebunden. Root of Trust oder der Schlüssel für den bestätigten Bootmodus. In Keymaster 2 und 3 werden alle Schlüssel sind außerdem an das Betriebssystem und die Patchebene des System-Images gebunden. So kann ein Angreifer, der eine Schwachstelle in einem alten Die Systemversion oder die TEE-Software kann kein Rollback auf das anfällige Gerät durchführen. Version und verwenden Schlüssel, die mit der neueren Version erstellt wurden. Wenn außerdem ein Schlüssel mit einer bestimmten Version und einem bestimmten Patch-Level auf einem Gerät verwendet wird, das aktualisiert wurde auf eine neuere Version oder Patch-Level haben, wird der Schlüssel aktualisiert, und die vorherige Version des Schlüssels ungültig geworden ist. Da das Gerät dann nach einem Upgrade rasten die Tasten mit dem Gerät vorwärts, aber alle Wenn Sie das Gerät auf eine frühere Version zurücksetzen, werden die Tasten unbrauchbar.
Um die modulare Struktur von Treble zu unterstützen und die Bindung von system.img an aufzuheben boot.img hat Keymaster 4 das Schlüsselversions-Bindungsmodell geändert, sodass Patchebenen für jede Partition. So kann jede Partition aktualisiert werden und gleichzeitig Rollbackschutz bieten.
In Android 9: boot
, system
und vendor
alle Partitionen haben
ihre eigene Patchebene.
- Geräte mit Android Verified Boot (AVB) können alle Patchebenen
und die Systemversion in vbmeta, sodass der Bootloader sie
Keymaster. Bei verketteten Partitionen lauten die Versionsinformationen für die Partition
in der verketteten vbmeta enthalten sein. Generell sollten Versionsinformationen im
vbmeta struct
mit den Bestätigungsdaten (Hash oder Hashtree) für eine bestimmte Partition an. - Auf Geräten ohne AVB:
<ph type="x-smartling-placeholder">
- </ph>
- Implementierungen des verifizierten Bootmodus müssen einen Hash der Version bereitstellen. Metadaten an Bootloader, damit der Bootloader den Hash an Keymaster bereitstellen kann.
boot.img
kann Patchebene weiterhin im Header speichernsystem.img
kann Patchlevel und Betriebssystemversion weiterhin schreibgeschützt speichern Eigenschaftenvendor.img
speichert die Patchebene im schreibgeschützten Attribut.ro.vendor.build.version.security_patch
.- Der Bootloader kann einen Hash aller Daten bereitstellen, die durch den verifizierten Bootmodus validiert wurden. zum Keymaster.
- Verwenden Sie in Android 9 die folgenden Tags, um Versionsinformationen für
folgende Partitionen:
<ph type="x-smartling-placeholder">
- </ph>
VENDOR_PATCH_LEVEL
: Partitionvendor
BOOT_PATCH_LEVEL
: Partitionboot
OS_PATCH_LEVEL
undOS_VERSION
:system
-Partition. (OS_VERSION
wird entfernt aus denboot.img
-Header.
-
Bei Keymaster-Implementierungen sollten alle Patchebenen unabhängig behandelt werden. Schlüssel sind
verwendbar, wenn alle Versionsinformationen mit den Werten übereinstimmen, die mit einem Schlüssel verknüpft sind, und
IKeymaster::upgradeDevice()
rollt auf ein höheres Patchlevel, wenn erforderlich.
HAL-Änderungen
Um Versionsbindung und Versionsattestierung zu unterstützen, wurde in Android 7.1 die
Tags Tag::OS_VERSION
und Tag::OS_PATCHLEVEL
sowie die
configure
und upgradeKey
. Die Versions-Tags
werden von Keymaster 2+ Implementierungen automatisch allen neu generierten
(oder aktualisierte) Schlüssel. Jeder Versuch, einen Schlüssel ohne Betriebssystem zu verwenden,
Version oder Patch-Level, die der aktuellen Betriebssystemversion oder dem Patch-Level entsprechen,
wird mit ErrorCode::KEY_REQUIRES_UPGRADE
abgelehnt.
Tag::OS_VERSION
ist ein UINT
-Wert, der für
Haupt-, Neben- und Sub-Minor-Teile einer Android-Systemversion als MMmmss,
wobei MM die Hauptversion, mm die Nebenversion und ss die Sub-Minor-Version ist
Version. Beispiel: 6.1.2 wird als 060102 dargestellt.
Tag::OS_PATCHLEVEL
ist ein UINT
-Wert, der für
Jahr und Monat der letzten Systemaktualisierung im Format JJJJMM, wobei JJJJ für den Wert
das vierstellige Jahr und MM der zweistellige Monat. Beispiel: März 2016 wäre
dargestellt als 201603.
UpgradeKey
Damit Schlüssel auf die neue Betriebssystemversion und das neue Patch-Level des Systems aktualisiert werden können
Image hat Android 7.1 dem HAL die Methode upgradeKey
hinzugefügt:
Keymaster 3
upgradeKey(vec keyBlobToUpgrade, vec upgradeParams) generates(ErrorCode error, vec upgradedKeyBlob);
Keymaster 2
keymaster_error_t (*upgrade_key)(const struct keymaster2_device* dev, const keymaster_key_blob_t* key_to_upgrade, const keymaster_key_param_set_t* upgrade_params, keymaster_key_blob_t* upgraded_key);
dev
ist die GerätestrukturkeyBlobToUpgrade
ist der Schlüssel, der aktualisiert werden mussupgradeParams
sind Parameter, die zum Upgrade des Schlüssels erforderlich sind. Diese enthältTag::APPLICATION_ID
undTag::APPLICATION_DATA
, die zum Entschlüsseln des Schlüssels erforderlich sind blob, wenn sie während der Generierung bereitgestellt wurden.upgradedKeyBlob
ist der Ausgabeparameter, mit dem die Variable neuen Schlüssel-Blob.
Wenn upgradeKey
mit einem Schlüssel-BLOB aufgerufen wird, der nicht geparst werden kann, oder
ansonsten ungültig ist, wird ErrorCode::INVALID_KEY_BLOB
zurückgegeben. Wenn es
mit einem Schlüssel aufgerufen wird, dessen Patch-Level größer als der aktuelle Systemwert ist,
wird ErrorCode::INVALID_ARGUMENT
zurückgegeben. Wenn sie mit einem Schlüssel aufgerufen wird,
deren Betriebssystemversion größer als der aktuelle Systemwert ist, und der Systemwert
nicht Null ist, wird ErrorCode::INVALID_ARGUMENT
zurückgegeben. Betriebssystemversion
Upgrades von einem Wert ungleich null auf null sind zulässig. Im Fall von Fehlern
Kommunikation mit der sicheren Welt führt, gibt sie einen entsprechenden Fehlerwert (z.B.
ErrorCode::SECURE_HW_ACCESS_DENIED
,
ErrorCode::SECURE_HW_BUSY
). Andernfalls wird zurückgegeben,
ErrorCode::OK
und gibt ein neues Schlüssel-BLOB in
upgradedKeyBlob
.
keyBlobToUpgrade
bleibt auch nach dem upgradeKey
gültig
und könnte theoretisch bei einem Downgrade des Geräts wieder verwendet werden. In
ruft der Schlüsselspeicher in der Regel deleteKey
im
keyBlobToUpgrade
-Blob kurz nach dem Aufruf von
upgradeKey
Wenn keyBlobToUpgrade
ein Tag hätte
Tag::ROLLBACK_RESISTANT
, dann sollte upgradedKeyBlob
haben (und sollte auch Rollback-resistent sein).
Sichere Konfiguration
Zur Implementierung der Versionsbindung benötigt der Keymaster TA eine Möglichkeit, den Empfang der aktuellen Betriebssystemversion und dem aktuellen Patch-Level (Versionsinformationen) und sicherzustellen, Die erhaltenen Informationen stimmen mit den Informationen zur laufenden System.
Um die sichere Übermittlung von Versionsinformationen an den TA zu ermöglichen, wird eine OS_VERSION
Feld wurde dem Boot-Image-Header hinzugefügt. Boot-Image-Build
wird dieses Feld automatisch ausgefüllt. OEMs und Keymaster-TA-Implementierer
müssen gemeinsam die Geräte-Bootloader ändern, um die Version zu extrahieren
aus dem Boot-Image und übergeben sie vor dem nicht sicheren
das System gestartet ist. Dadurch wird sichergestellt, dass Angreifer die Bereitstellung nicht beeinträchtigen können.
Versionsinformationen an den TA.
Außerdem muss sichergestellt werden, dass das System-Image dieselbe Version Informationen als Boot-Image. Zu diesem Zweck wurde die Methode „configure“ an den Keymaster HAL:
keymaster_error_t (*configure)(const struct keymaster2_device* dev, const keymaster_key_param_set_t* params);
Das Argument params
enthält Tag::OS_VERSION
und
Tag::OS_PATCHLEVEL
Diese Methode wird von keymaster2-Clients aufgerufen.
nach dem Öffnen des HAL, aber vor dem Aufrufen anderer Methoden. Wenn eine andere Methode
vor dem Konfigurieren aufgerufen wird, gibt der TA
ErrorCode::KEYMASTER_NOT_CONFIGURED
Wenn configure
nach dem Starten des Geräts zum ersten Mal aufgerufen wird,
sollte überprüft werden, ob die angegebenen Versionsinformationen mit den
dem Bootloader. Wenn die Versionsinformationen nicht übereinstimmen,
configure
gibt ErrorCode::INVALID_ARGUMENT
zurück, und alle
Andere Keymaster-Methoden werden weiterhin
ErrorCode::KEYMASTER_NOT_CONFIGURED
Wenn die Informationen übereinstimmen,
configure
gibt ErrorCode::OK
zurück und anderer Keymaster
wieder ganz normal funktionieren.
Nachfolgende Aufrufe von configure
geben den gleichen Wert zurück, der vom
und den Status von Keymaster nicht ändern. Dieser Prozess
erfordert, dass alle OTAs sowohl System- als auch Boot-Images aktualisieren; Sie können nicht aktualisiert werden
um die Versionsinformationen
synchron zu halten.
Weil configure
von dem System aufgerufen wird, dessen Inhalt es ist
die Daten validieren sollen, haben Angreifer nur ein enges Zeitfenster, in dem sie
das System-Image kompromittieren und Versionsinformationen
mit dem Boot-Image übereinstimmt, aber nicht der tatsächlichen Systemversion entspricht. Die
Kombination aus Boot-Image-Überprüfung und dm-verity-Validierung des System-Images
und die Tatsache, dass configure
sehr früh im
Systemstart erschwert die Nutzung dieses Zeitfensters.