Jak mogę tymczasowo wyłączyć ASLR (randomizacja układu przestrzeni adresowej)?

Odpowiedzi:

75

Według artykułu Jak skuteczna jest ASLR w systemach Linux? , możesz skonfigurować ASLR w systemie Linux za pomocą /proc/sys/kernel/randomize_va_spaceinterfejsu.

Obsługiwane są następujące wartości:

  • 0 - Brak randomizacji. Wszystko jest statyczne.
  • 1 - Konserwatywna randomizacja. Udostępniane biblioteki, stos mmap(), VDSO i sterty są losowe.
  • 2 - Pełna randomizacja. Oprócz elementów wymienionych w poprzednim punkcie, zarządzana pamięć brk()jest również losowa.

Aby go wyłączyć, uruchom

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

i aby włączyć to ponownie, uruchom

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

To nie przetrwa ponownego uruchomienia, więc musisz to skonfigurować sysctl. Dodaj plik /etc/sysctl.d/01-disable-aslr.confzawierający:

kernel.randomize_va_space = 0

powinien trwale to wyłączyć.

gertvdijk
źródło
1
Czym dokładnie jest „pełna randomizacja”? Czy obejmuje to sam plik wykonywalny? A co to jest brk()?
Shuzheng
26

/proc/sys/kernel/randomize_va_spaceInterfejs sterowania całego systemu ASLR.

Jeśli nie chcesz zmiany obejmującej cały system, użyj funkcji ADDR_NO_RANDOMIZE osobowości, aby tymczasowo wyłączyć ASLR. Kontrolowanie tej flagi osobowości można wykonać za pomocą setarchi jej -Ropcji ( manpage ), poprzedzając polecenie.

Uważam, że bardzo wygodnie jest otworzyć całkowicie nową powłokę, używając:

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

Spowoduje to otwarcie dla ciebie nowej powłoki Bash z wyłączonym ASLR, w tym wszystkich procesów potomnych (programy uruchamiane z tej powłoki).

Po prostu exitskorupa, kiedy skończysz.


Nawiasem mówiąc, na i386 ulimit -s unlimitedmoże „wyłączyć” ASLR.


EDYCJA (kwi 2016): ulimit -s unlimitedNaprawiono i przypisano CVE-2016-3672 .

youfu
źródło
Drobne szczegóły w duchu util-linux: zamiast uname -mjednego można również użyć archpliku binarnego, który zasadniczo robi to samo.
drumfire
1
@drumfire archnie jest dostępny jako aplet
busyboksa
+1 za powrót dwa lata później i dodanie informacji dotyczących CVE.
Multisync
3

Bardziej trwałe sposoby wyłączenia ASLR powinny być przechowywane w maszynie wirtualnej z oczywistych powodów.

aby przetestować możliwość zastępowania adresów powrotu ramki stosu itp., musisz skompilować bez kanarek stosu -fno-stack-protector, a jednocześnie umożliwić wykonanie kodu na stosie, z którym musisz skompilować -z execstack, dzięki czemu

$ gcc -fno-stack-protector -z execstack -o <my_program> my_code.c
Nowa osoba
źródło
2

Możesz po prostu użyć sudo sysctl kernel.randomize_va_space=0do tymczasowego wyłączenia ASLR.

Lzutao
źródło