Kernel-Hardening

Android 8.0 hat Kernel-Härtungsfunktionen hinzugefügt, um Kernel-Schwachstellen zu entschärfen und Fehler in Kernel-Treibern zu finden. Die Funktionen befinden sich im Kernel/Common in den Zweigen Android-3.18, Android-4.4 und Android-4.9.

Implementierung

Um diese Funktionen zu erwerben, sollten Gerätehersteller und SOCs alle Hardening-Patches von kernel/common in ihren Kernel-Baum einbinden und die folgenden Kernel-Konfigurationsoptionen aktivieren:

  • Gehärtete Benutzerkopie: CONFIG_HARDENED_USERCOPY=y
  • PAN-Emulation – arm64: CONFIG_ARM64_SW_TTBR0_PAN=y
  • PAN-Emulation – Arm: CONFIG_CPU_SW_DOMAIN_PAN=y
  • KASLR – Kernel 4.4 und höher: CONFIG_RANDOMIZE_BASE=y

KASLR erfordert außerdem Bootloader-Unterstützung für die Weitergabe von Hardware-Entropie entweder über den Gerätebaumknoten /chosen/kaslr-seed oder durch die Implementierung EFI_RNG_PROTOCOL .

Stellen Sie außerdem sicher, dass vorhandene Härtungsfunktionen aktiviert sind:

  • Abschwächung des Stapelpufferüberlaufs: CONFIG_CC_STACKPROTECTOR_STRONG=y
  • Interner Speicherschutz: CONFIG_DEBUG_RODATA=y oder CONFIG_STRICT_KERNEL_RWX=y
  • Benutzerbereichszugriff vom Kernel aus einschränken – x86 (standardmäßig aktiviert): CONFIG_X86_SMAP=y

Testen

Um Ihre Implementierung zu testen, fügen Sie CONFIG_LKDTM=y zur Kernel-Konfiguration hinzu und bestätigen Sie, dass jeder der folgenden Befehle zu einer Kernel-Panic führt:

echo ACCESS_USERSPACE > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_USERSPACE > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_RO > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_RO_AFTER_INIT > /sys/kernel/debug/provoke-crash/DIRECT
echo WRITE_KERN > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_STACK > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_RODATA > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_KMALLOC > /sys/kernel/debug/provoke-crash/DIRECT
echo EXEC_VMALLOC > /sys/kernel/debug/provoke-crash/DIRECT
echo CORRUPT_STACK > /sys/kernel/debug/provoke-crash/DIRECT

Für Android-4.9:

echo USERCOPY_HEAP_SIZE_TO > /sys/kernel/debug/provoke-crash/DIRECT
echo USERCOPY_HEAP_SIZE_FROM > /sys/kernel/debug/provoke-crash/DIRECT

Häufige Probleme

Diese Änderungen führen wahrscheinlich zu Fehlern in den Kernel-Treibern, die entweder vom Gerätehersteller oder vom Eigentümer des Kernel-Treibers behoben werden müssen.

  • Durch die gehärtete Benutzerkopie werden beim Kopieren von Daten in den/aus dem Benutzerbereich fehlerhafte Grenzprüfungen angezeigt. Diese sollten wie alle anderen Speicherbeschädigungsfehler behoben werden.
  • Die PAN-Emulation macht den direkten Zugriff auf den Benutzerbereich vom Kernel aus möglich, was nicht zulässig ist. Treiber, die versuchen, auf den Benutzerspeicher zuzugreifen, müssen geändert werden, um stattdessen die Standardfunktionen copy_to_user() / copy_from_user() zu verwenden.