Rafforzamento del kernel

Android 8.0 ha aggiunto funzionalità di protezione del kernel per contribuire a mitigare l'impatto del kernel le vulnerabilità e trova bug nei driver del kernel. Le caratteristiche sono nel kernel/common in rami android-3.18, android-4.4 e android-4.9.

Implementazione

Per acquisire queste funzionalità, i produttori di dispositivi e i SOC devono unire tutti delle patch di protezione avanzata da kernel/common al rispettivo albero del kernel abilita le seguenti opzioni di configurazione del kernel:

  • Copia utente protetta: CONFIG_HARDENED_USERCOPY=y
  • Emulazione PAN - gruppo 64: CONFIG_ARM64_SW_TTBR0_PAN=y
  • Emulazione PAN - gruppo: CONFIG_CPU_SW_DOMAIN_PAN=y
  • Kernel KASLR - 4.4 e successivi: CONFIG_RANDOMIZE_BASE=y

KASLR richiede anche il supporto del bootloader per passare l'entropia hardware il nodo ad albero dei dispositivi /chosen/kaslr-seed oppure implementando EFI_RNG_PROTOCOL.

Assicurati inoltre che le funzionalità di protezione esistenti siano abilitate:

  • Mitigazione dell'overflow del buffer dello stack: CONFIG_CC_STACKPROTECTOR_STRONG=y
  • Protezione della memoria interna: CONFIG_DEBUG_RODATA=y o CONFIG_STRICT_KERNEL_RWX=y
  • Limita l'accesso allo spazio utente dal kernel - x86 (abilitato per impostazione predefinita): CONFIG_X86_SMAP=y

Test

Per testare l'implementazione, aggiungi CONFIG_LKDTM=y al kernel e verificare che ognuno dei seguenti comandi indirizzi 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 mostrino bug nei driver del kernel, che devono essere dal produttore del dispositivo o dal proprietario del driver del kernel.

  • La copia utente protetta espone il controllo dei limiti errati durante la copia dei dati da/verso lo spazio utente. 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 impostati su utilizza lo standard copy_to_user()/copy_from_user() funzioni.