Android 8.0 ha aggiunto funzionalità di rafforzamento del kernel per contribuire a mitigare le vulnerabilità del kernel e individuare bug nei driver del kernel. Le funzionalità sono nel kernel/comuni nei rami Android-3.18, Android-4.4 e Android-4.9.
Implementazione
Per acquisire queste funzionalità, i produttori di dispositivi e i SOC dovrebbero unire tutte le patch di rafforzamento dal kernel/common
al proprio albero del kernel e abilitare le seguenti opzioni di configurazione del kernel:
- Copia utente rafforzata:
CONFIG_HARDENED_USERCOPY=y
- Emulazione PAN - arm64:
CONFIG_ARM64_SW_TTBR0_PAN=y
- Emulazione PAN - braccio:
CONFIG_CPU_SW_DOMAIN_PAN=y
- KASLR - kernel 4.4 e successivi:
CONFIG_RANDOMIZE_BASE=y
KASLR richiede inoltre il supporto del bootloader per il passaggio dell'entropia hardware attraverso il nodo dell'albero del dispositivo /chosen/kaslr-seed
o implementando EFI_RNG_PROTOCOL
.
Assicurati inoltre che le funzionalità di rafforzamento esistenti siano abilitate:
- Mitigazione dell'overflow del buffer dello stack:
CONFIG_CC_STACKPROTECTOR_STRONG=y
- Protezione della memoria interna:
CONFIG_DEBUG_RODATA=y
oCONFIG_STRICT_KERNEL_RWX=y
- Limita l'accesso allo spazio utente dal kernel - x86 (abilitato per impostazione predefinita):
CONFIG_X86_SMAP=y
Test
Per testare la tua implementazione, aggiungi CONFIG_LKDTM=y
alla configurazione del kernel e conferma che ciascuno dei seguenti comandi porti a un kernel panico:
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
Per 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
Problemi comuni
È probabile che queste modifiche espongano bug nei driver del kernel, che devono essere risolti dal produttore del dispositivo o dal proprietario del driver del kernel.
- La copia utente rafforzata espone il controllo dei limiti errato durante la copia dei dati nello/dallo spazio utente. Questi dovrebbero essere risolti come qualsiasi altro bug di corruzione della memoria.
- L'emulazione PAN espone l'accesso diretto allo spazio utente dal kernel, che non è consentito. I driver che tentano di accedere alla memoria dello spazio utente devono essere modificati per utilizzare invece le funzioni standard
copy_to_user()
/copy_from_user()
.