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.

PIE et code indépendant de la position

L'ASLR ne peut déplacer que du code qui ne suppose pas d'adresse de chargement fixe. Les bibliothèques partagées sont depuis longtemps compilées en code indépendant de la position (PIC), accédant à leurs données par adressage relatif au PC et via la table globale des décalages (GOT). Les anciens exécutables, en revanche, étaient liés pour une adresse fixe : le code du programme principal restait à un emplacement connu et fournissait aux attaquants une source fiable de gadgets ROP. Compiler avec -fPIE et -pie rend aussi l'exécutable relocalisable, de sorte que le chargeur peut le randomiser également. Sur x86-64, le coût est faible, car l'accès aux données relatif au PC est natif.

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.

S'entraîner : questions sur ASLR

Quel est l'objectif de l'ASLR (randomisation de l'agencement de l'espace d'adressage) ?

  1. AChanger à chaque exécution les adresses de la pile, du tas, des bibliothèques, etc., pour qu'un attaquant puisse difficilement prévoir les adresses visées
  2. BChoisir les adresses mémoire au hasard pour améliorer le taux de succès du cache
  3. CLibérer au hasard la mémoire inutilisée pour augmenter l'espace libre
Afficher la réponse et l'explication

Réponse : A. Changer à chaque exécution les adresses de la pile, du tas, des bibliothèques, etc., pour qu'un attaquant puisse difficilement prévoir les adresses visées

Dans les attaques exploitant un débordement de tampon notamment, connaître l'adresse des fonctions de bibliothèque ou des données sur la pile est essentiel. L'ASLR décale à chaque démarrage de processus les adresses de la pile, du tas, des bibliothèques partagées et de l'exécutable, empêchant l'attaquant de viser des adresses fixes. Elle ne suffit pas seule à tout empêcher et s'utilise en combinaison avec d'autres mesures, comme la séparation écriture-exécution.

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.

« ASLR » dans les explications

Questions mentionnant « ASLR » (3)

  1. Quel est l'objectif de l'ASLR (randomisation de l'agencement de l'espace d'adressage) ?
  2. Quel est l'agencement mémoire correct d'un processus typique sous Linux notamment, des adresses basses aux adresses hautes ?
  3. Quelle est la principale raison de produire un exécutable sous forme de PIE (exécutable indépendant de la position) ?

Termes associés

Tas (heap) Débordement (spill) PIE (exécutable indépendant de la position) Code indépendant de la position Bibliothèque partagée Bibliothèque statique Chargeur (loader) Décoration de noms (name mangling) Éditeur de liens (linker) Éditeur de liens dynamique

Retour au glossaire