78 votes

Comment puis-je désactiver temporairement ASLR (Address space layout randomization) ?

Je suis sur Ubuntu 12.04 32 bits, pour une expérience j'ai besoin de désactiver ASLR ; comment puis-je accomplir cela? Que dois-je faire ensuite pour réactiver ASLR?

114voto

RN. Points 559

Selon un article How Effective is ASLR on Linux Systems?, vous pouvez configurer ASLR dans Linux en utilisant l'interface /proc/sys/kernel/randomize_va_space.

Les valeurs suivantes sont supportées :

  • 0 - Aucune randomisation. Tout est statique.
  • 1 - Randomisation conservatrice. Les bibliothèques partagées, la pile, mmap(), VDSO et le tas sont randomisés.
  • 2 - Randomisation complète. En plus des éléments énumérés dans le point précédent, la mémoire gérée par brk() est également randomisée.

Donc, pour le désactiver, exécutez

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

et pour le réactiver, exécutez

echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

Ceci ne survivra pas à un redémarrage, vous devrez donc le configurer dans sysctl. Ajoutez un fichier /etc/sysctl.d/01-disable-aslr.conf contenant :

kernel.randomize_va_space = 0

devrait le désactiver définitivement.

39voto

youfu Points 499

Le /proc/sys/kernel/randomize_va_space interface contrôle le système ASLR.

Si vous ne voulez pas de changement systémique, utilisez le drapeau ADDR_NO_RANDOMIZE personality pour désactiver temporairement l'ASLR. Le contrôle de ce drapeau peut être effectué avec setarch et son option -R, comme

setarch `uname -m` -R /bin/bash

Cela ouvrira un nouveau shell Bash pour vous avec l'ASLR désactivé, incluant tous les processus enfants exécutés à partir de ce shell. Il vous suffit de taper exit pour quitter le shell une fois que vous avez fini.


À propos, sur i386, ulimit -s unlimited peut "désactiver" efficacement l'ASLR.

EDIT (Avr 2016) : Le ulimit -s unlimited a été corrigé et a reçu le CVE-2016-3672.

4voto

mattgcon Points 1222

Les moyens plus permanents de désactiver ASLR doivent être conservés dans une machine virtuelle pour des raisons évidentes.

Pour tester la capacité d'écraser les adresses de retour du frame de la pile, vous devrez compiler sans les canaris de la pile -fno-stack-protector, tandis que pour vous permettre d'exécuter du code sur la pile vous devez compiler avec -z execstack, en faisant

$ gcc -fno-stack-protector -z execstack -o  my_code.c

4voto

Brad Cathey Points 126

Vous pouvez utiliser la commande suivante pour désactiver temporairement ASLR.

sudo sysctl kernel.randomize_va_space=0

2voto

Jonas Kölker Points 241

Si vous souhaitez créer un programme qui désactive l'ASLR pour lui-même lorsqu'il s'exécute, vous pouvez utiliser l'appel système personality sur Linux. Voici une recette :

#include 
#include 

int main(int argc, char **argv) {
    const int old_personality = personality(ADDR_NO_RANDOMIZE);
    if (!(old_personality & ADDR_NO_RANDOMIZE)) {
        const int new_personality = personality(ADDR_NO_RANDOMIZE);
        if (new_personality & ADDR_NO_RANDOMIZE) {
            execv(argv[0], argv);
        }
    }
    printf("&argc == %p\n", (void *) &argc);
}

Si vous regardez le code source de setarch, il appelle personality deux fois selon un schéma approximatif. La principale différence est que setarch appelle exec sur un autre programme, tandis que ma recette s'appelle elle-même. Il est important d'utiliser la non-nullité de & ADDR_NO_RANDOMIZE et non des tests d'égalité : sinon, vous pouvez entrer dans une boucle d'exécution infinie si par exemple vous compilez avec -z execstack.

Voir aussi la page man pour personality.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X