KASLR, KPTI et défenses modernes du noyau
Randomisation d'adresses, isolation des tables de pages et options de configuration qui durcissent un noyau Linux : ce que chacune arrête et comment l'activer.
Ceci est le troisième tutoriel de l'espace Exploitation du noyau, écrit du point de vue du défenseur. Le premier et le deuxième guides ont montré un bug du noyau devenant root, et comment SMEP/SMAP ont forcé le ROP noyau. Nous couvrons ici les couches de masquage d'adresses et d'isolation qui se superposent — KASLR, KPTI — et les options de configuration qui durcissent un noyau en profondeur.
KASLR : cacher le noyau, mais c'est une seule image
KASLR charge le noyau à une base aléatoire à chaque démarrage, si bien que commit_creds et chaque gadget sont à des adresses inconnues. Sa faiblesse déterminante est que le noyau est une seule image contiguë : un pointeur noyau fuité révèle la base, et chaque symbole est à un décalage fixe de celle-ci.
leaked kernel pointervia un bug, /proc ou un canal auxiliairekernel basel'adresse de chargement randomiséeevery symbol & gadgetcommit_creds, prepare_kernel_cred, gadgetsLes attaquants traquent donc une seule divulgation : un /proc/kallsyms non restreint, des pointeurs dmesg, une lecture de mémoire non initialisée ou un canal auxiliaire temporel. Les défenses répondent en restreignant les fuites (kptr_restrict=2, dmesg_restrict=1) et, dans les builds durcis, avec FG-KASLR, qui randomise l'ordre des fonctions dans l'image de sorte qu'une fuite n'implique plus tous les décalages.
KPTI : des tables de pages séparées pour l'utilisateur et le noyau
KPTI (Kernel Page-Table Isolation) a été introduit pour atténuer Meltdown, un canal auxiliaire d'exécution spéculative qui permettait à l'espace utilisateur de lire la mémoire du noyau. Avec KPTI, un processus s'exécutant en mode utilisateur utilise une table de pages dans laquelle le noyau est presque entièrement démappé ; un petit trampoline bascule vers la table de pages complète du noyau à l'entrée.
Pour l'exploitation, KPTI supprime une partie du partage d'espace d'adressage sur lequel s'appuyaient d'anciennes techniques et exige des exploits qu'ils routent correctement les retours à travers le trampoline du noyau. Ce n'est pas une mesure anti-ROP, mais c'est un pilier du modèle d'isolation du noyau moderne.
La liste de contrôle défensive
Le durcissement du noyau est surtout de la configuration. Chaque option retire une capacité dont un exploit a besoin :
| Config / réglage | Ce qu'elle fait |
|---|---|
| KASLR (par défaut) | Randomise la base du noyau ; à associer aux restrictions de fuites |
kptr_restrict=2, dmesg_restrict=1 | Cacher les pointeurs noyau de /proc et des logs |
CONFIG_STACKPROTECTOR_STRONG | Canaris de pile noyau — détectent les débordements de pile |
| SMEP / SMAP (par défaut) | Bloquent l'exécution/l'accès en ring 0 de l'espace utilisateur — voir le guide 2 |
| KPTI | Isolation des tables de pages utilisateur/noyau (Meltdown + isolation) |
CONFIG_SLAB_FREELIST_HARDENED / _RANDOM | Durcir et randomiser la freelist du tas contre l'empoisonnement |
CONFIG_RANDSTRUCT | Randomiser l'agencement des structures sensibles (p. ex. cred, file_operations) |
CONFIG_CFI_CLANG | Intégrité du flux de contrôle noyau sur les appels indirects |
lockdown, seccomp, signature de modules | Réduire la surface d'attaque atteignable |
Ce que cela apprend à un défenseur
- Restreignez les fuites aussi agressivement que vous randomisez. KASLR ne vaut que par l'absence d'une primitive de divulgation.
kptr_restrictetdmesg_restrictsont peu coûteux et à forte valeur ; FG-KASLR augmente encore le coût. - Superposez, ne comptez pas sur un seul contrôle. SMEP/SMAP forcent le ROP noyau ; KASLR force une fuite ; les canaris et le durcissement de la freelist bloquent la corruption ; le CFI contraint les appels indirects. Un exploit doit tous les vaincre en séquence.
- La surface d'attaque est le gain le moins cher. La plupart des LPE noyau résident dans les pilotes et les appels système obscurs.
lockdown, les filtres seccomp, la désactivation des modules inutilisés et la signature de ceux que l'on conserve mettent les bugs hors de portée avant même de tester la moindre mitigation. - Restez à jour. Le durcissement du noyau (épinglage de CR4, FG-KASLR, CFI noyau, durcissement de la freelist) s'est amélioré régulièrement ; un vieux noyau manque de défenses qu'un nouveau a par défaut.
Points clés à retenir
- KASLR randomise la base du noyau, mais un seul pointeur fuité dérandomise l'ensemble du noyau à image unique — restreindre les fuites compte donc autant que randomiser.
- KPTI isole les tables de pages utilisateur et noyau (atténuation de Meltdown et isolation), ce n'est pas un contrôle anti-ROP général.
- Un noyau durci empile KASLR + restrictions de fuites + canaris + SMEP/SMAP + KPTI + durcissement de la freelist/des structures + CFI.
- Réduire la surface d'attaque (lockdown, seccomp, moins de modules) est la mesure au plus fort effet de levier de toutes.
Ceci complète l'arc Exploitation du noyau : d'un bug à root, ret2usr et SMEP/SMAP, et les défenses KASLR/KPTI. À comparer avec l'ordre des mitigations userland dans la pile de mitigations.