Qu'est-ce que ASLR ?
Abréviation de Address Space Layout Randomization. Contre-mesure qui change à chaque exécution les adresses de la pile, du tas, des bibliothèques partagées et de l'exécutable, pour qu'un attaquant ne puisse pas facilement les prévoir.
Nom japonais: ASLR
« ASLR » apparaît dans 3 questions d'entraînement réparties sur 1 thèmes, dont Éditeurs de liens, chargeurs et exécutables.
Domaine: Éditeurs de liens, chargeurs et exécutables
Comment l'ASLR déplace un processus
Au lancement d'un programme, le noyau et le chargeur dynamique choisissent des décalages de base aléatoires, alignés sur les pages, pour chaque grande région de l'espace d'adressage : la pile, le tas, la zone mmap où sont projetées les bibliothèques partagées, et l'exécutable lui-même s'il a été construit comme exécutable indépendant de la position (PIE). L'ordre relatif des régions reste l'ordre habituel (text, data, BSS et tas aux adresses basses, pile en haut), mais leurs adresses absolues changent à chaque exécution. La randomisation de l'agencement de l'espace d'adressage (ASLR) modifie donc l'emplacement des éléments, pas ce que fait le programme.
Pourquoi les attaquants ont besoin d'adresses
Les exploits de corruption mémoire, comme les débordements de tampon sur la pile, écrasent généralement une adresse de retour ou un pointeur de fonction par l'adresse de quelque chose d'utile : un shellcode sur la pile, une fonction de bibliothèque comme system() dans une attaque return-to-libc, ou une chaîne de fragments d'instructions en programmation orientée retour (ROP). Chacune de ces techniques exige des adresses exactes. Avec l'ASLR, l'attaquant doit les deviner, et une mauvaise supposition fait généralement planter le processus au lieu de lui donner le contrôle. La protection est probabiliste : sa force dépend du nombre de bits aléatoires disponibles, bien plus limité dans les espaces d'adressage 32 bits que 64 bits.
Limites et défenses complémentaires
La randomisation s'applique par région : la fuite d'un seul pointeur d'une bibliothèque révèle le décalage de toute cette bibliothèque, et de là chacune de ses fonctions. Les processus enfants créés par fork() héritent de l'agencement du parent, ce qui permet aux attaquants de sonder à répétition un serveur qui fait des fork. Pour ces raisons, l'ASLR est combinée avec une mémoire modifiable non exécutable (W^X ou NX), des canaris de pile et des protections du flot de contrôle. Le noyau du système d'exploitation peut lui aussi être randomisé, ce qu'on appelle KASLR. Sous Linux, le réglage est visible dans /proc/sys/kernel/randomize_va_space.
Questions fréquentes
L'ASLR empêche-t-elle les attaques par débordement de tampon ?
Non. L'ASLR n'arrête pas le débordement lui-même ; elle rend seulement difficile de savoir vers quelle adresse sauter, si bien que la plupart des tentatives font planter le programme au lieu de réussir. Une fuite d'information révélant une seule adresse réelle peut la contourner, c'est pourquoi on l'associe à la mémoire NX et aux canaris de pile.
Quelle est la différence entre ASLR et PIE ?
L'ASLR est le mécanisme du système d'exploitation qui charge les régions mémoire à des adresses aléatoires à chaque exécution. Le PIE est une manière de compiler et de lier l'exécutable pour que son code fonctionne à n'importe quelle adresse, ce qui permet à l'ASLR de randomiser le programme principal en plus des bibliothèques, de la pile et du tas.
Comment vérifier si l'ASLR est activée sous Linux ?
Lisez /proc/sys/kernel/randomize_va_space : 0 signifie désactivée, 1 randomise la pile, la région mmap et les bibliothèques partagées, et 2 randomise en plus le tas géré par brk. La plupart des distributions utilisent 2 par défaut.