Wzmacnianie jądra

W Androidzie 8.0 dodano funkcje wzmacniania jądra systemu, które pomagają zniwelować problem związany z jądrem luk w zabezpieczeniach i znaleźć błędy w sterownikach jądra. Funkcje te znajdują się w jądrze/wspólnym Androida 3.18, Androida 4.4 i Androida 4.9.

Implementacja

Aby uzyskać te funkcje, producenci urządzeń i firmy SOC muszą połączyć wzmacniające plamy z kernel/common do drzewa jądra włącz te opcje konfiguracji jądra:

  • Wzmocniona kopia użytkownika: CONFIG_HARDENED_USERCOPY=y
  • Emulacja PAN – arm64: CONFIG_ARM64_SW_TTBR0_PAN=y
  • Emulacja numeru PAN – grupa: CONFIG_CPU_SW_DOMAIN_PAN=y
  • KASLR – jądra w wersji 4.4 i nowszych: CONFIG_RANDOMIZE_BASE=y

KASLR wymaga również obsługi programu rozruchowego do przekazywania entropii sprzętowej węzeł drzewa urządzeń /chosen/kaslr-seed lub przez zaimplementowanie EFI_RNG_PROTOCOL

Włącz też dotychczasowe funkcje wzmacniania zabezpieczeń:

  • Łagodzenie przepełnienia bufora stosu: CONFIG_CC_STACKPROTECTOR_STRONG=y
  • Wewnętrzna ochrona pamięci: CONFIG_DEBUG_RODATA=y lub CONFIG_STRICT_KERNEL_RWX=y
  • Ogranicz dostęp do przestrzeni użytkownika z jądra systemu x86 (domyślnie włączone): CONFIG_X86_SMAP=y

Testowanie

Aby przetestować implementację, dodaj do jądra CONFIG_LKDTM=y i upewnij się, że każde z poniższych poleceń prowadzi do jądra systemu panika:

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

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

Typowe problemy

Wprowadzone zmiany mogą ujawnić błędy w sterownikach jądra, które należy naprawione przez producenta urządzenia lub właściciela sterownika jądra systemu.

  • Wzmocniona kopia użytkownika powoduje narażenie na nieprawidłowe sprawdzanie granic podczas kopiowania danych do/z przestrzeni użytkownika. Należy to naprawić tak samo jak wszystkie inne błędy powodujące uszkodzenie pamięci.
  • Emulacja numeru PAN udostępnia bezpośredni dostęp do przestrzeni użytkownika z jądra systemu, jest dozwolona. Sterowniki próbujące uzyskać dostęp do pamięci w przestrzeni użytkownika muszą zostać zmienione na użyj standardowej metody copy_to_user()/copy_from_user() .