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?
Réponses
Trop de publicités?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.
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.
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
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
.