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
ouCONFIG_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.