Metadatenverschlüsselung

Android 7.0 und höher unterstützt Dateibasierte Verschlüsselung (File-based Encryption, FBE). FBE lässt zu, dass verschiedene Dateien mit verschiedenen Schlüsseln verschlüsselt werden, die entsperrt werden können unabhängig voneinander unterscheiden. Mit diesen Schlüsseln werden sowohl Dateiinhalte als auch Dateinamen verschlüsselt. Wenn FBE verwendet wird, können auch andere Informationen wie Verzeichnislayouts, Dateigrößen, Berechtigungen und Erstellungs-/Änderungszeiten werden nicht verschlüsselt. Gemeinsam werden diese Informationen als Dateisystemmetadaten bezeichnet.

Mit Android 9 wurde die Metadatenverschlüsselung unterstützt. Bei der Metadatenverschlüsselung wird mit einem einzigen Schlüssel beim Booten alles verschlüsselt, Der Inhalt wird nicht von FBE verschlüsselt. Dieser Schlüssel wird durch Keymaster geschützt, der wird durch den verifizierten Bootmodus geschützt.

Die Metadatenverschlüsselung ist im adoptierbaren Speicher immer aktiviert, wenn FBE aktiviert ist. Die Metadatenverschlüsselung kann auch im internen Speicher aktiviert werden. Auf den Markt gebrachte Geräte mit Android 11 oder höher muss Metadatenverschlüsselung haben im internen Speicher aktiviert.

Implementierung auf internem Speicher

Sie können die Metadatenverschlüsselung im internen Speicher neuer Geräte einrichten, indem Sie Einrichten des Dateisystems metadata, Ändern der Initialisierungssequenz und Metadatenverschlüsselung in der fstab-Datei des Geräts aktivieren

Voraussetzungen

Die Metadatenverschlüsselung kann nur eingerichtet werden, wenn die Datenpartition zuerst ist formatiert sind. Daher ist diese Funktion nur für neue Geräte verfügbar. das ist nicht das ein Onlinereisebüro ändern sollte.

Für die Metadatenverschlüsselung muss das Modul dm-default-key die in Ihrem Kernel aktiviert sind. Unter Android 11 und höher dm-default-key wird von den gängigen Android-Kerneln Version unterstützt 4.14 und höher. Diese Version von dm-default-key verwendet Hardware und herstellerunabhängiges Verschlüsselungs-Framework namens blk-crypto.

Verwenden Sie Folgendes, um dm-default-key zu aktivieren:

CONFIG_BLK_INLINE_ENCRYPTION=y
CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y
CONFIG_DM_DEFAULT_KEY=y

dm-default-key verwendet Inline-Verschlüsselungshardware (Hardware, die verschlüsselt/entschlüsselt Daten auf dem Weg zum/vom Speichergerät), wenn verfügbar. Wenn Sie keine Inline-Verschlüsselungshardware verwenden, ist es Außerdem ist es erforderlich, ein Fallback auf die Cryptography API des Kernels zu aktivieren:

CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y

Wenn Sie keine Inline-Verschlüsselungshardware verwenden, sollten Sie auch alle verfügbaren CPU-basierte Beschleunigung, wie in der FBE-Dokumentation empfohlen.

Unter Android 10 und niedriger: dm-default-key wurde vom allgemeinen Android-Kernel nicht unterstützt. Daher ließen sich die Zulieferunternehmen um dm-default-key zu implementieren.

Metadatendateisystem einrichten

Weil nichts in der Nutzerdatenpartition gelesen werden kann, bis die Metadaten Verschlüsselungsschlüssel vorhanden ist, muss die Partitionstabelle einen separaten Partition namens „Metadatenpartition“ zum Speichern der Keymaster-BLOBs, um diesen Schlüssel zu schützen. Die Metadatenpartition sollte 16 MB groß sein.

fstab.hardware muss einen Eintrag für das Metadatendateisystem enthalten die auf dieser Partition gespeichert ist und sie unter /metadata bereitstellt, einschließlich Das Flag formattable, damit es beim Booten formatiert wird. Die Das f2fs-Dateisystem funktioniert nicht auf kleineren Partitionen. empfehlen wir ext4 . Beispiel:

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

Fügen Sie die folgende Zeile hinzu, damit der Bereitstellungspunkt /metadata vorhanden ist an BoardConfig-common.mk:

BOARD_USES_METADATA_PARTITION := true

Änderungen an der Init-Sequenz

Wenn Metadatenverschlüsselung verwendet wird, muss vold ausgeführt werden, bevor /data wurde bereitgestellt. Fügen Sie folgende Stanza in init.hardware.rc:

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

Keymaster muss aktiv und bereit sein, bevor init versucht wird, die Datei bereitzustellen /data

init.hardware.rc sollte bereits mount_all enthalten. Anweisung, die /data selbst in der on late-fs-Stanza bereitstellt. Fügen Sie vor dieser Zeile die Anweisung ein, um die Dienst wait_for_keymaster:

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 aktivieren

Fügen Sie schließlich keydirectory=/metadata/vold/metadata_encryption zum Spalte fs_mgr_flags des Eintrags fstab 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

Standardmäßig ist der Metadaten-Verschlüsselungsalgorithmus im internen Speicher AES-256-XTS. Dies kann überschrieben werden, indem das Attribut metadata_encryption, auch in der fs_mgr_flags angeben:

  • Auf Geräten ohne AES-Beschleunigung ist die Adiantum-Verschlüsselung möglicherweise durch Festlegen von metadata_encryption=adiantum aktiviert.
  • Auf Geräten, die hardwareverpackte Schlüssel unterstützen: kann der Metadatenverschlüsselungsschlüssel hardwareverpackt sein, indem er Folgendes festlegt: metadata_encryption=aes-256-xts:wrappedkey_v0 (oder entsprechend metadata_encryption=:wrappedkey_v0, wie aes-256-xts ist der Standardalgorithmus.

Weil sich die Kernel-Schnittstelle zu dm-default-key in Android geändert hat 11 festgelegt ist, müssen Sie auch sicherstellen, dass die richtiger Wert für PRODUCT_SHIPPING_API_LEVEL in device.mk Beispiel: Wenn Ihr Gerät mit Android gestartet wird, 11 (API-Level 30), device.mk sollte enthalten:

PRODUCT_SHIPPING_API_LEVEL := 30

Sie können auch die folgende Systemeigenschaft festlegen, um die Verwendung des neuen dm-default-key API unabhängig vom Versand-API-Level:

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

Zertifizierungsstufe

Um zu überprüfen, ob die Metadatenverschlüsselung aktiviert ist und korrekt funktioniert, führen Sie den die nachfolgend beschriebenen Tests durchführen. Beachten Sie außerdem die häufigen beschrieben.

Tests

Führen Sie zuerst den folgenden Befehl aus, um zu prüfen, ob die Metadatenverschlüsselung im internen Speicher aktiviert:

adb root
adb shell dmctl table userdata

Die Ausgabe sollte in etwa so aussehen:

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 durch Festlegen des Option metadata_encryption in der fstab auf dem Gerät und dann weicht die Ausgabe geringfügig von der obigen Beschreibung ab. Wenn Sie beispielsweise die Adiantum-Verschlüsselung aktiviert haben, wird die dritte wird xchacha12,aes-adiantum-plain64 anstelle von aes-xts-plain64.

Führen Sie als Nächstes vts_kernel_encryption_test aus. um die Richtigkeit der Metadatenverschlüsselung und des FBE zu prüfen:

atest vts_kernel_encryption_test

oder:

vts-tradefed run vts -m vts_kernel_encryption_test

Häufige Probleme

Während des Aufrufs von mount_all, wodurch die mit Metadaten verschlüsselten Daten bereitgestellt werden /data-Partition führt init das vdc-Tool aus. VDC wird über binder mit vold verbunden, um den mit Metadaten verschlüsselt und die Partition wird bereitgestellt. Für die Dauer dieses Anruf blockiert, init wird blockiert und versucht, die Einstellungen init Unterkünfte werden blockiert, bis mount_all abgeschlossen ist. Wenn zu diesem Zeitpunkt ein Teil der Arbeit von vold direkt oder das Lesen oder Festlegen einer Eigenschaft indirekt blockiert ist, kommt es zu einem Deadlock. Es ist ist wichtig, damit vold die Lesematerialien Schlüssel, Interaktion mit Keymaster und Bereitstellen des Datenverzeichnisses ohne weitere Interaktionen mit init.

Wenn Keymaster beim Ausführen von mount_all nicht vollständig gestartet wird, wird er nicht auf vold antworten, bis bestimmte Eigenschaften aus init, was genau zum beschriebenen Deadlock führt. Wird platziert exec_start wait_for_keymaster über dem relevanten Mit dem festgelegten mount_all-Aufruf wird sichergestellt, dass Keymaster vollständig damit dieses Deadlock vermieden wird.

Konfiguration für verwendbaren Speicher

Seit Android 9 ist eine Form der Metadatenverschlüsselung immer aktiviert, adaptiver Speicher aktiviert wenn FBE aktiviert ist, auch wenn die Metadatenverschlüsselung nicht aktiviert ist internen Speicher.

Bei AOSP gibt es zwei Implementierungen der Metadatenverschlüsselung Speicher: ein veralteter Speicher basierend auf dm-crypt und ein neuerer Speicher am dm-default-key. Um sicherzustellen, dass die richtige Implementierung für Ihr Gerät ausgewählt haben, vergewissern Sie sich, dass Sie den richtigen Wert für PRODUCT_SHIPPING_API_LEVEL in device.mk. Beispiel: wenn auf deinem Gerät Android 11 (API-Level 30) installiert ist, device.mk sollte Folgendes enthalten:

PRODUCT_SHIPPING_API_LEVEL := 30

Sie können auch die folgenden Systemeigenschaften festlegen, um die Verwendung des neuen Verschlüsselungsmethode für Volume-Metadaten (und die neue FBE-Standardrichtlinienversion) unabhängig vom Versand-API-Level:

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 Die Metadatenverschlüsselung im akzeptablen Speicher verwendet die dm-default-key genau wie beim internen Speicher. Welche Kernel-Konfiguration festgelegt ist, erfahren Sie in den Voraussetzungen oben. zu aktivieren. Beachten Sie, dass die Inline-Verschlüsselungshardware auf dem ist der interne Speicher des Geräts möglicherweise nicht verfügbar. Eventuell ist die Angabe von CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y erforderlich.

Standardmäßig wird mit der Verschlüsselungsmethode für Volume-Metadaten dm-default-key verwendet den Verschlüsselungsalgorithmus AES-256-XTS mit 4.096-Byte-Kryptosektoren. Die kann überschrieben werden, indem das Attribut Systemeigenschaft ro.crypto.volume.metadata.encryption. Dieses Der Wert des Attributs hat dieselbe Syntax wie der metadata_encryption-Wert die oben beschriebene fstab-Option. Zum Beispiel auf Geräten ohne AES-Verschlüsselung. Beschleunigung, Adiantum-Verschlüsselung kann aktiviert werden, indem ro.crypto.volume.metadata.encryption=adiantum

Legacy-Methode

Auf Geräten, die mit Android 10 oder niedriger auf den Markt kommen, Die Verschlüsselung des akzeptablen Speichers verwendet das Kernelmodul dm-crypt statt dm-default-key:

CONFIG_DM_CRYPT=y

Im Gegensatz zur Methode dm-default-key wird mit der Methode dm-crypt bewirkt, dass der Dateiinhalt zweimal verschlüsselt wird: einmal mit einem FBE-Schlüssel und einmal mit Metadatenverschlüsselungsschlüssel. Diese doppelte Verschlüsselung verringert die Leistung und ist nicht erforderlich, um die Sicherheitsziele der Metadatenverschlüsselung zu erreichen, da Android stellt sicher, dass FBE-Schlüssel mindestens so schwer zu manipulieren sind wie die Metadaten Verschlüsselungsschlüssel. Anbieter können Kernel-Anpassungen vornehmen, um doppelte Verschlüsselung, insbesondere durch die Implementierung der allow_encrypt_override-Option, an die Android übergeben wird dm-crypt, wenn die Systemeigenschaft ro.crypto.allow_encrypt_override ist auf true eingestellt. Diese Anpassungen werden vom allgemeinen Android-Kernel nicht unterstützt.

Standardmäßig verwendet die Verschlüsselungsmethode für Volume-Metadaten dm-crypt die Methode AES-128-CBC-Verschlüsselungsalgorithmus mit ESSIV und 512-Byte-Kryptosektoren. Dieses kann überschrieben werden, indem die folgenden Systemeigenschaften festgelegt werden (die ebenfalls verwendet für FDE):

  • ro.crypto.fde_algorithm zum Auswählen der Metadatenverschlüsselung Algorithmus. Zur Auswahl stehen aes-128-cbc und adiantum. Adiantum darf nur verwendet werden, wenn der Parameter keine AES-Beschleunigung.
  • ro.crypto.fde_sector_size wählt die Größe des Kryptosektors aus. Zur Auswahl stehen 512, 1024, 2048 und 4096. Verwenden Sie für die Adiantum-Verschlüsselung 4096.