Durcissement du noyau

Android 8.0 a ajouté des fonctionnalités de renforcement du noyau pour aider à atténuer les vulnérabilités du noyau et à détecter les bogues dans les pilotes du noyau. Les fonctionnalités sont dans le noyau/common dans les branches Android-3.18, Android-4.4 et Android-4.9.

Mise en œuvre

Pour acquérir ces fonctionnalités, les fabricants de périphériques et les SOC doivent fusionner tous les correctifs de renforcement du kernel/common vers leur arborescence de noyau et 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 - arm : CONFIG_CPU_SW_DOMAIN_PAN=y
  • KASLR - Noyaux 4.4 et versions ultérieures : CONFIG_RANDOMIZE_BASE=y

KASLR nécessite également la prise en charge du chargeur de démarrage pour transmettre l'entropie matérielle via le nœud de l'arborescence des périphériques /chosen/kaslr-seed ou 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 tampon de 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 depuis le noyau - x86 (activé par défaut) : CONFIG_X86_SMAP=y

Essai

Pour tester votre implémentation, ajoutez CONFIG_LKDTM=y à la configuration du noyau et confirmez que chacune des commandes suivantes entraîne une panique du noyau :

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 sont susceptibles d'exposer des bogues dans les pilotes du noyau, qui doivent être corrigés soit par le fabricant du périphérique, soit par le propriétaire du pilote du noyau.

  • La copie utilisateur renforcée expose une vérification de limites incorrectes lors de la copie de données vers/depuis l'espace utilisateur. Ceux-ci devraient être corrigés comme tous les autres bogues 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 tentant d'accéder à la mémoire de l'espace utilisateur doivent être modifiés pour utiliser à la place les fonctions standard copy_to_user() / copy_from_user() .