Indurimento del nocciolo

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