Durcissement du noyau

Android 8.0 a ajouté des fonctionnalités de renforcement du noyau pour réduire les vulnérabilités et à trouver des bogues dans les pilotes du noyau. Les fonctionnalités sont dans noyau/commun dans branches android-3.18, android-4.4 et android-4.9.

Implémentation

Pour acquérir ces fonctionnalités, les fabricants d'appareils et les SOC doivent fusionner renforcement des correctifs de kernel/common dans l'arborescence du noyau activer les options de configuration de noyau suivantes:

  • Copie utilisateur renforcée: CONFIG_HARDENED_USERCOPY=y
  • Émulation PAN - arm64: CONFIG_ARM64_SW_TTBR0_PAN=y
  • Émulation PAN - groupe: CONFIG_CPU_SW_DOMAIN_PAN=y
  • Noyaux KASLR 4.4 et versions ultérieures: CONFIG_RANDOMIZE_BASE=y

KASLR nécessite également la prise en charge du bootloader pour transmettre l'entropie matérielle via soit le nœud d'arborescence des appareils /chosen/kaslr-seed, soit en implémentant EFI_RNG_PROTOCOL

Assurez-vous également que les fonctionnalités de renforcement existantes sont activées:

  • Atténuation du dépassement de capacité de la mémoire tampon de la pile: CONFIG_CC_STACKPROTECTOR_STRONG=y
  • Protection de la mémoire interne: CONFIG_DEBUG_RODATA=y ou CONFIG_STRICT_KERNEL_RWX=y
  • Restreindre l'accès à l'espace utilisateur à partir du noyau - x86 (activé par défaut): CONFIG_X86_SMAP=y

Tests

Pour tester votre implémentation, ajoutez CONFIG_LKDTM=y au noyau et confirmez que chacune des commandes suivantes conduit à un noyau panique:

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

Pour 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

Problèmes courants

Ces modifications risquent d'exposer des bugs dans les pilotes du noyau, corrigé soit par le fabricant de l’appareil, soit par le propriétaire du pilote du noyau.

  • La copie utilisateur renforcée révèle des limites incorrectes lors de la vérification lors de la copie de données depuis/vers l'espace utilisateur. Ils doivent être corrigés comme tout autre bug de corruption de mémoire.
  • L'émulation PAN expose un accès direct à l'espace utilisateur depuis le noyau, ce qui n'est pas autorisé. Les pilotes qui tentent d'accéder à la mémoire de l'espace utilisateur doivent être remplacés par utilisez la valeur standard copy_to_user()/copy_from_user() fonctions.