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
oderCONFIG_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.