Hartowanie jądra

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 lub CONFIG_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() .