Verschlüsselung von Metadaten

Android 7.0 und höher unterstützt dateibasierte Verschlüsselung (FBE). FBE ermöglicht die Verschlüsselung verschiedener Dateien mit unterschiedlichen Schlüsseln, die unabhängig voneinander entsperrt werden können. Diese Schlüssel werden verwendet, um sowohl Dateiinhalte als auch Dateinamen zu verschlüsseln. Bei Verwendung von FBE werden andere Informationen wie Verzeichnislayouts, Dateigrößen, Berechtigungen und Erstellungs-/Änderungszeiten nicht verschlüsselt. Zusammen werden diese anderen Informationen als Dateisystem-Metadaten bezeichnet.

Android 9 hat die Unterstützung für die Metadatenverschlüsselung eingeführt. Bei der Metadatenverschlüsselung verschlüsselt ein einzelner Schlüssel, der beim Booten vorhanden ist, alle Inhalte, die nicht von FBE verschlüsselt wurden. Dieser Schlüssel wird durch Keymaster geschützt, der wiederum durch verifiziertes Booten geschützt ist.

Metadaten - Verschlüsselung wird immer aktiviert adoptable Lagerung , wenn FBE aktiviert ist. Die Metadatenverschlüsselung kann auch im internen Speicher aktiviert werden. Bei Geräten, die mit Android 11 oder höher gestartet wurden, muss die Metadatenverschlüsselung im internen Speicher aktiviert sein.

Implementierung auf internem Speicher

Sie können Metadaten - Verschlüsselung auf dem internen Speicher von neuen Geräten durch die Einrichtung des Einrichtung metadata - Dateisystem, die Änderung der init - Sequenz und ermöglicht Metadaten - Verschlüsselung in den Geräten fstab.

Voraussetzungen

Die Metadatenverschlüsselung kann nur eingerichtet werden, wenn die Datenpartition zum ersten Mal formatiert wird. Daher ist diese Funktion nur für neue Geräte verfügbar; Das sollte ein OTA nicht ändern.

Metadaten - Verschlüsselung erfordert , dass der dm-default-key - Modul im Kernel aktiviert werden. In Android 11 und höher, dm-default-key wird durch die Android gemeinsamen Kernel, Version 4.14 und höher unterstützt. Diese Version von dm-default-key verwendet eine Hardware und herstellerunabhängige Verschlüsselung Rahmen blk-Krypto genannt.

So aktivieren Sie dm-default-key verwenden:

CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
CONFIG_DM_DEFAULT_KEY=y

dm-default-key Anwendungen Inline - Verschlüsselung Hardware (Hardware , die verschlüsselt / entschlüsselt Daten , während sie auf dem Weg zum / vom Speichergerät ist) , wenn vorhanden. Wenn Sie nicht Inline - Verschlüsselung Hardware verwenden, ist es auch notwendig , einen Rückfall auf den Kernel-Kryptografie - API zu aktivieren:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

Wenn keine Inline - Verschlüsselung Hardware verwenden , sollten Sie auch alle verfügbaren CPU-basierte Beschleunigung ermöglichen , wie in der empfohlenen FBE Dokumentation .

In Android 10 und niedriger, dm-default-key wurde nicht vom Android gemeinsamen Kernel unterstützt werden . Es war daher an Lieferanten bis zu implementieren dm-default-key .

Metadaten-Dateisystem einrichten

Da nichts in der Benutzerdatenpartition gelesen werden kann, bis der Metadatenverschlüsselungsschlüssel vorhanden ist, muss die Partitionstabelle eine separate Partition namens "Metadatenpartition" zum Speichern der Keymaster-Blobs bereitstellen, die diesen Schlüssel schützen. Die Metadatenpartition sollte 16 MB groß sein.

fstab.hardware muss einen Eintrag für das Metadaten - Dateisystem enthält , dass Leben auf dieser Partition es bei der Montage /metadata , einschließlich dem formattable Flag , um sicherzustellen , es beim Booten formatiert ist. Das Dateisystem f2fs funktioniert nicht auf kleineren Partitionen; wir empfehlen stattdessen ext4 zu verwenden. Zum Beispiel:

/dev/block/bootdevice/by-name/metadata              /metadata          ext4        noatime,nosuid,nodev,discard                          wait,check,formattable

Um sicherzustellen , dass die /metadata - Mount - Punkt existiert, fügen Sie die folgende Zeile in BoardConfig-common.mk :

BOARD_USES_METADATA_PARTITION := true

Änderungen an der Init-Sequenz

Wenn Metadaten - Verschlüsselung verwendet wird, vold muss ausgeführt werden , bevor /data angebracht ist. Um sicherzustellen , dass es früh genug, fügen Sie die folgende Strophe gestartet init.hardware.rc :

# We need vold early for metadata encryption
on early-fs
    start vold

Keymaster muss ausgeführt werden , und bereit , bevor init versucht zu montieren /data .

init.hardware.rc sollte bereits eine mount_all Anweisung , die Halterungen /data selbst in der on late-fs Strophe. Vor dieser Zeile fügen Sie die Richtlinie den exec wait_for_keymaster Service:

on late-fs
   … 
    # Wait for keymaster
    exec_start wait_for_keymaster

    # Mount RW partitions which need run fsck
    mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late

Metadatenverschlüsselung einschalten

Schließlich fügen keydirectory=/metadata/vold/metadata_encryption zum fs_mgr_flags Spalte der fstab - Eintrag für userdata . Eine vollständige fstab-Zeile könnte beispielsweise so aussehen:

/dev/block/bootdevice/by-name/userdata              /data              f2fs        noatime,nosuid,nodev,discard,inlinecrypt latemount,wait,check,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota,formattable

Der Verschlüsselungsalgorithmus für Metadaten im internen Speicher ist standardmäßig AES-256-XTS. Dies kann durch die Einstellung der außer Kraft gesetzt metadata_encryption Option, auch in der fs_mgr_flags Spalte:

  • Bei Geräten , die AES - Beschleunigung fehlt Adiantum Verschlüsselung kann durch Einstellung aktiviert sein metadata_encryption=adiantum .
  • Auf Geräten , dass die Unterstützung Hardware-wrapped Tasten können der Metadaten - Verschlüsselungsschlüssel Hardware-wrapped , indem gemacht werden metadata_encryption=aes-256-xts:wrappedkey_v0 (oder äquivalent metadata_encryption=:wrappedkey_v0 , wie aes-256-xts ist der Standard - Algorithmus).

Da die Kernel - Schnittstelle zu dm-default-key in Android geändert 11, müssen Sie auch sicherstellen , dass Sie den korrekten Wert eingestellt haben PRODUCT_SHIPPING_API_LEVEL in device.mk . Zum Beispiel, wenn das Gerät startet mit Android 11 (API - Ebene 30), device.mk sollte enthalten:

PRODUCT_SHIPPING_API_LEVEL := 30

Sie können auch die folgende Systemeigenschaft setzen die Verwendung des neuen zu zwingen , dm-default-key API unabhängig API - Ebene für den Versand:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.crypto.dm_default_key.options_format.version=2

Validierung

Führen Sie die unten beschriebenen Tests aus, um zu überprüfen, ob die Metadatenverschlüsselung aktiviert ist und ordnungsgemäß funktioniert. Seien Sie auch darauf achten, die häufig gestellten Fragen im Folgenden beschrieben.

Tests

Führen Sie zunächst den folgenden Befehl aus, um zu überprüfen, ob die Metadatenverschlüsselung im internen Speicher aktiviert ist:

adb root
adb shell dmctl table userdata

Die Ausgabe sollte ähnlich sein wie:

Targets in the device-mapper table for userdata:
0-4194304: default-key, aes-xts-plain64 - 0 252:2 0 3 allow_discards sector_size:4096 iv_large_sectors

Wenn Sie die Standardverschlüsselungseinstellungen overrode durch die Einstellung metadata_encryption Option in den Geräten fstab , dann wird der Ausgang leicht von der oben abweichen. Zum Beispiel, wenn Sie aktiviert Adiantum Verschlüsselung , dann wird das dritte Feld seiner xchacha12,aes-adiantum-plain64 statt aes-xts-plain64 .

Als nächstes führen vts_kernel_encryption_test die Richtigkeit der Metadaten - Verschlüsselung und FBE zu überprüfen:

atest vts_kernel_encryption_test

oder:

vts-tradefed run vts -m vts_kernel_encryption_test

Häufige Probleme

Während des Gesprächs mount_all , die die Metadaten verschlüsselt besteigt /data init führt die vdc - Tool. Die Verbindungen vdc Werkzeug vold über binder , die Metadaten verschlüsselt Gerät einzurichten und die Trennwand zu montieren. Für die Dauer dieser Aufforderung, init blockiert ist , und versucht, Lese- oder Satz init Eigenschaften wird blockiert , bis mount_all beendet. Wenn zu diesem Zeitpunkt ein Teil vold ‚Werk direkt oder indirekt blockiert beim Lesen oder Festlegen einer Eigenschaft wird Deadlock führen. Es ist wichtig , dass , um sicherzustellen , vold kann die Arbeit des Lesens der Schlüssel komplett, mit Keymaster Interaktion und das Datenverzeichnis Montage ohne weitere mit zusammenwirkenden init .

Wenn Keymaster nicht vollständig gestartet , wenn mount_all läuft, wird es nicht reagieren auf vold bis hat es bestimmte Eigenschaften aus lesen init , was genau in der Sackgasse beschrieben. Platzieren exec_start wait_for_keymaster über dem jeweiligen mount_all Aufruf , wie sie sicherstellt , dass Keymaster vollständig im Voraus ausgeführt wird , und vermeidet so aus dieser Sackgasse.

Konfiguration auf anpassungsfähigem Speicher

Da Android 9 ist eine Form von Metadaten - Verschlüsselung immer aktiviert adoptable Speicher , wenn FBE aktiviert ist, auch wenn Metadaten - Verschlüsselung nicht auf interne Speicher aktiviert ist.

In AOSP gibt es zwei Implementierungen von Metadaten - Verschlüsselung auf adoptable Speichern: ein veralteter einen auf Basis von dm-crypt und eine neuere Version basierend auf dm-default-key . Um sicherzustellen , dass die korrekte Umsetzung ist für das Gerät ausgewählt, stellen Sie sicher , dass Sie den korrekten Wert eingestellt haben PRODUCT_SHIPPING_API_LEVEL in device.mk . Zum Beispiel, wenn das Gerät startet mit Android 11 (API - Ebene 30), device.mk sollte enthalten:

PRODUCT_SHIPPING_API_LEVEL := 30

Sie können auch die folgenden Systemeigenschaften festlegen, um die Verwendung der neuen Volume-Metadaten-Verschlüsselungsmethode (und der neuen Standardversion der FBE-Richtlinie) unabhängig von der Versand-API-Ebene zu erzwingen:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.crypto.volume.metadata.method=dm-default-key \
    ro.crypto.dm_default_key.options_format.version=2 \
    ro.crypto.volume.options=::v2

Aktuelle Methode

Auf Geräten mit Android 11 oder höher, Metadaten - Verschlüsselung auf adoptable Speicher verwendet den Start dm-default-key - Kernel - Modul, genau wie auf internen Speicher. Siehe die Voraussetzungen oben für die Kernel - Konfigurationsoptionen zu aktivieren. Beachten Sie, dass Inline - Verschlüsselung Hardware , dass die Arbeiten auf dem internen Speicher des Geräts auf adoptable Lagerung nicht verfügbar sein können und somit CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y erforderlich.

Standardmäßig ist die dm-default-key verwendet Volume - Metadaten Verschlüsselungsmethode , den AES-256-XTS - Verschlüsselungsalgorithmus mit 4096-Byte - Krypto - Sektoren. Der Algorithmus kann durch Einstellung der außer Kraft gesetzt ro.crypto.volume.metadata.encryption Systemeigenschaft. In diesem Hause nicht Wert hat die gleiche Syntax wie die metadata_encryption fstab Option oben beschrieben. Zum Beispiel auf Geräten , die AES - Beschleunigung fehlt, Adiantum Verschlüsselung kann durch Einstellung aktiviert sein ro.crypto.volume.metadata.encryption=adiantum .

Legacy-Methode

Auf Geräten mit Android 10 oder niedriger Metadaten - Verschlüsselung auf adoptable Speichern verwendet den Start dm-crypt Kernel - Modul statt dm-default-key :

CONFIG_DM_CRYPT=y

Im Gegensatz zu dem dm-default-key Methode, die dm-crypt - Methode bewirkt , dass Dateiinhalt zweimal verschlüsselt werden: einmal mit einem FBE Schlüssel und einmal mit dem Metadaten - Verschlüsselungsschlüssel. Diese doppelte Verschlüsselung reduziert die Leistung und ist nicht erforderlich, um die Sicherheitsziele der Metadatenverschlüsselung zu erreichen, da Android dafür sorgt, dass FBE-Schlüssel mindestens so schwer zu kompromittieren sind wie der Metadatenverschlüsselungsschlüssel. Anbieter können Kernel - Anpassungen machen die doppelte Verschlüsselung zu vermeiden, insbesondere durch die Umsetzung allow_encrypt_override Option , die Android passieren wird dm-crypt , wenn die Systemeigenschaft ro.crypto.allow_encrypt_override gesetzt ist true . Diese Anpassungen werden vom allgemeinen Android-Kernel nicht unterstützt.

Standardmäßig ist die dm-crypt verwendet Volume - Metadaten Verschlüsselungsmethode , den AES-128-CBC - Verschlüsselungsalgorithmus mit essiv und 512-Byte - Sektoren Krypto. Dies kann durch Setzen der folgenden Systemeigenschaften (die auch für FDE verwendet werden) überschrieben werden:

  • ro.crypto.fde_algorithm wählt den Metadaten - Verschlüsselungsalgorithmus. Die Auswahlmöglichkeiten sind aes-128-cbc und adiantum . Adiantum kann nur dann , wenn das Gerät fehlt AES - Beschleunigung verwendet werden.
  • ro.crypto.fde_sector_size wählt die Krypto - Sektorgröße. Zur Auswahl stehen 512, 1024, 2048 und 4096. Verwenden Sie für die Adiantum-Verschlüsselung 4096.