W systemie Android 8.0 dodano funkcje wzmacniania jądra, aby pomóc złagodzić luki w jądrze i znaleźć błędy w sterownikach jądra. Funkcje są dostępne w jądrze/wspólne w gałęziach Android-3.18, Android-4.4 i Android-4.9.
Realizacja
Aby uzyskać te funkcje, producenci urządzeń i SOC powinni połączyć wszystkie poprawki wzmacniające z kernel/common
do swojego drzewa jądra i włączyć następujące opcje konfiguracji jądra:
- Zaostrzona kopia użytkownika:
CONFIG_HARDENED_USERCOPY=y
- Emulacja PAN - arm64:
CONFIG_ARM64_SW_TTBR0_PAN=y
- Emulacja PAN - uzbrojenie:
CONFIG_CPU_SW_DOMAIN_PAN=y
- KASLR - jądra 4.4 i nowsze:
CONFIG_RANDOMIZE_BASE=y
KASLR wymaga także obsługi bootloadera do przekazywania entropii sprzętu albo przez węzeł drzewa urządzeń /chosen/kaslr-seed
, albo poprzez implementację EFI_RNG_PROTOCOL
.
Upewnij się również, że istniejące funkcje hartowania są włączone:
- Ograniczenie przepełnienia bufora stosu:
CONFIG_CC_STACKPROTECTOR_STRONG=y
- Ochrona pamięci wewnętrznej:
CONFIG_DEBUG_RODATA=y
lubCONFIG_STRICT_KERNEL_RWX=y
- Ogranicz dostęp do przestrzeni użytkownika z jądra - x86 (domyślnie włączone):
CONFIG_X86_SMAP=y
Testowanie
Aby przetestować implementację, dodaj CONFIG_LKDTM=y
do konfiguracji jądra i potwierdź, że każde z poniższych poleceń prowadzi do paniki jądra:
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
Dla Androida-4.9:
echo USERCOPY_HEAP_SIZE_TO > /sys/kernel/debug/provoke-crash/DIRECT
echo USERCOPY_HEAP_SIZE_FROM > /sys/kernel/debug/provoke-crash/DIRECT
Powszechne problemy
Zmiany te prawdopodobnie ujawnią błędy w sterownikach jądra, które muszą zostać naprawione przez producenta urządzenia lub właściciela sterownika jądra.
- Ulepszona kopia użytkownika ujawnia nieprawidłowe sprawdzanie granic podczas kopiowania danych do/z przestrzeni użytkownika. Należy je naprawić, tak jak inne błędy powodujące uszkodzenie pamięci.
- Emulacja PAN udostępnia bezpośredni dostęp do przestrzeni użytkownika z jądra, co jest niedozwolone. Sterowniki próbujące uzyskać dostęp do pamięci przestrzeni użytkownika należy zmienić, aby zamiast tego korzystały ze standardowych funkcji
copy_to_user()
/copy_from_user()
.