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
lubCONFIG_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()
.