Randomizacja układu przestrzeni adresowej

Randomizacja układu przestrzeni adresowej ( ASLR ) to technika zabezpieczania komputera , która zapobiega wykorzystywaniu luk w zabezpieczeniach związanych z uszkodzeniem pamięci . Aby uniemożliwić atakującemu niezawodne przeskoczenie, na przykład, do konkretnej wykorzystywanej funkcji w pamięci, ASLR losowo rozmieszcza pozycje w przestrzeni adresowej kluczowych obszarów danych procesu , w tym podstawy pliku wykonywalnego i pozycje stosu , sterty i biblioteki .

Historia

Linux PaX po raz pierwszy ukuł termin „ASLR” i opublikował pierwszy projekt i implementację ASLR w lipcu 2001 roku jako łatkę dla jądra Linuksa . Jest postrzegana jako kompletna implementacja, zawierająca również łatkę do losowania stosu jądra od października 2002 roku.

Pierwszym popularnym systemem operacyjnym, który domyślnie obsługiwał ASLR, był OpenBSD w wersji 3.4 w 2003 r., a następnie Linux w 2005 r.

Korzyści

Randomizacja przestrzeni adresowej utrudnia niektóre rodzaje ataków bezpieczeństwa, utrudniając atakującemu przewidzenie docelowych adresów. Na przykład osoby atakujące próbujące wykonać ataki typu return-to-libc muszą zlokalizować kod, który ma zostać wykonany, podczas gdy inne osoby atakujące próbujące wykonać kod powłoki wstrzyknięty na stosie muszą najpierw znaleźć stos. W obu przypadkach system ukrywa powiązane adresy pamięci przed atakującymi. Wartości te należy odgadnąć, a błędne odgadnięcie zwykle nie jest możliwe do odzyskania z powodu awarii aplikacji.

Skuteczność

Losowość układu przestrzeni adresowej opiera się na małej szansie atakującego na odgadnięcie lokalizacji losowo rozmieszczonych obszarów. Bezpieczeństwo zwiększa się poprzez zwiększenie przestrzeni wyszukiwania. Zatem randomizacja przestrzeni adresowej jest bardziej efektywna, gdy w losowych przesunięciach występuje więcej entropii . Entropię zwiększa się albo przez zwiększenie ilości obszaru pamięci wirtualnej , w którym zachodzi randomizacja, albo przez skrócenie okresu, w którym zachodzi randomizacja. Okres jest zwykle wdrażany tak krótko, jak to możliwe, więc większość systemów musi zwiększyć randomizację przestrzeni VMA.

Aby pokonać losowość, atakujący muszą z powodzeniem odgadnąć pozycje wszystkich obszarów, które chcą zaatakować. W przypadku obszarów danych, takich jak stos i sterta, gdzie można załadować niestandardowy kod lub przydatne dane, można zaatakować więcej niż jeden stan, używając slajdów NOP dla kodu lub powtarzających się kopii danych. Pozwala to na powodzenie ataku, jeśli obszar jest losowo przydzielany do jednej z kilku wartości. Natomiast obszary kodu, takie jak baza biblioteki i główny plik wykonywalny, muszą zostać dokładnie wykryte. Często te obszary są mieszane, na przykład ramki stosu są wstrzykiwane do stosu i zwracana jest biblioteka.

Można zadeklarować następujące zmienne:

  • (bity entropii na szczycie stosu)
  • (bity entropii podstawy mmap () )
  • (bity entropii głównej bazy wykonywalnej)
  • (bity entropii podstawy sterty)
  • (zaatakowane bity na próbę entropii stosu)
  • (zaatakowane bity na próbę podstawowej entropii mmap () )
  • (zaatakowane bity na próbę głównej entropii pliku wykonywalnego)
  • (zaatakowane bity na próbę entropii bazowej sterty)
  • (podjęto próby)
  • (całkowita ilość entropii: )

Aby obliczyć prawdopodobieństwo sukcesu atakującego, musimy założyć liczbę prób α przeprowadzonych bez przerwania przez IPS oparty na sygnaturach, organy ścigania lub inny czynnik; w przypadku brutalnego wymuszenia demona nie można ponownie uruchomić. Musimy również dowiedzieć się, ile bitów jest istotnych i ile jest atakowanych w każdej próbie, pozostawiając tyle bitów, które atakujący musi pokonać.

Poniższe wzory przedstawiają prawdopodobieństwo sukcesu dla danego zestawu prób α na N bitach entropii.

  • oddzielne zgadywanie; przestrzeń adresowa jest losowana po każdej próbie)
  • (systematyczne brutalne wymuszanie na kopiach programu z tą samą przestrzenią adresową)

systemach może być w tysiącach lub w nowoczesnych systemach 64-bitowych liczby te zwykle sięgają co najmniej milionów, Hector Marco-Gisbert i Ismael Ripoll pokazali w 2014 roku, jak ominąć ASLR w systemach 64-bitowych w mniej niż jedną sekundę w pewnych okolicznościach. W przypadku systemów 32-bitowych przy szybkości komputera 2004, które mają 16 bitów do losowego losowania adresów, Shacham i współpracownicy stwierdzają: „... 16 bitów losowego losowania adresów można pokonać atakiem brutalnej siły w ciągu kilku minut . Stwierdzenie autorów zależy od możliwości wielokrotnego atakowania tej samej aplikacji bez żadnych opóźnień. Właściwe implementacje ASLR, takie jak ta zawarta w grsecurity, zapewniają kilka metod uniemożliwiających takie ataki siłowe. Jedna metoda polega na uniemożliwieniu wykonywania pliku wykonywalnego przez konfigurowalny czas, jeśli uległ on awarii określoną liczbę razy.

Android, [ potrzebne źródło inne niż podstawowe ] i ewentualnie inne systemy, [ który? ] zaimplementuj Randomizację kolejności ładowania bibliotek , formę ASLR, która losuje kolejność ładowania bibliotek. To zapewnia bardzo małą entropię. Poniżej przedstawiono przybliżoną liczbę bitów entropii dostarczonych na potrzebną bibliotekę; nie uwzględnia to jeszcze różnych rozmiarów bibliotek, więc rzeczywista uzyskana entropia jest naprawdę nieco wyższa. Należy zauważyć, że osoby atakujące zwykle potrzebują tylko jednej biblioteki; matematyka jest bardziej złożona w przypadku wielu bibliotek, co również pokazano poniżej. Należy zauważyć, że przypadek atakującego używającego tylko jednej biblioteki jest uproszczeniem bardziej złożonej formuły na . .

  • l (liczba załadowanych bibliotek)
  • β (liczba bibliotek używanych przez atakującego)

Wartości te są zwykle niskie nawet dla dużych wartości l , co najważniejsze, ponieważ osoby atakujące zazwyczaj mogą używać tylko standardowej biblioteki C , a zatem często można założyć, że . Jednak nawet w przypadku niewielkiej liczby bibliotek uzyskuje się tutaj kilka bitów entropii; potencjalnie interesujące jest zatem połączenie randomizacji kolejności ładowania biblioteki z randomizacją adresów VMA, aby uzyskać kilka dodatkowych bitów entropii. Zauważ, że te dodatkowe bity entropii nie będą miały zastosowania do innych segmentów mmap(), tylko do bibliotek.

Zmniejszenie entropii

Atakujący mogą skorzystać z kilku metod w celu zmniejszenia entropii obecnej w losowej przestrzeni adresowej, od prostych wycieków informacji po atakowanie wielu bitów entropii na atak (na przykład przez rozpylanie sterty ) . Niewiele można w tej sprawie zrobić.

Istnieje możliwość wycieku informacji o układzie pamięci przy użyciu luk w zabezpieczeniach ciągów formatujących . Funkcje łańcuchowe formatu, takie jak printf , używają listy zmiennych argumentów do wykonania swojego zadania; specyfikatory formatu opisują wygląd listy argumentów. Ze względu na sposób, w jaki argumenty są zwykle przekazywane, każdy specyfikator formatu przesuwa się bliżej szczytu ramki stosu. Ostatecznie można wyodrębnić wskaźnik powrotu i wskaźnik ramki stosu, ujawniając adres podatnej biblioteki i adres znanej ramki stosu; może to wyeliminować losowość bibliotek i stosów jako przeszkodę dla atakującego.

Można również zmniejszyć entropię w stosie lub stercie. Stos zwykle musi być wyrównany do 16 bajtów, więc jest to najmniejszy możliwy interwał losowania; podczas gdy sterta musi być wyrównana do strony, zazwyczaj 4096 bajtów. Podczas próby ataku możliwe jest wyrównanie zduplikowanych ataków z tymi interwałami; slajd NOP może być użyty z wstrzyknięciem kodu powłoki, a ciąg znaków „ /bin/sh ” może zostać zastąpiony przez „ ////////bin/sh ” dla dowolnej liczby ukośników podczas próby powrotu do systemu . Liczba usuniętych bitów to dokładnie dla n zaatakowanych interwałów.

Takie spadki są ograniczone ze względu na ilość danych w stosie lub stercie. Na przykład stos jest zwykle ograniczony do 8 MB i rośnie do znacznie mniej; pozwala to na co najwyżej 19 bitów , chociaż bardziej ostrożne oszacowanie wynosiłoby około 8–10 bitów , co odpowiada 4–16 KB wypełnienia stosu. Z drugiej strony sterta jest ograniczona zachowaniem alokatora pamięci; w przypadku glibc alokacje powyżej 128 KB są tworzone przy użyciu mmap , ograniczając atakujących do 5 bitów redukcji. Jest to również czynnik ograniczający w przypadku brutalnego wymuszania; chociaż liczbę ataków do wykonania można zmniejszyć, rozmiar ataków jest na tyle zwiększony, że zachowanie może w pewnych okolicznościach stać się widoczne dla systemów wykrywania włamań .

Ograniczenia

Adresy chronione przez ASLR mogą wyciekać przez różne kanały boczne, usuwając narzędzie do łagodzenia skutków. Niedawne ataki wykorzystały informacje ujawnione przez bufor predykcyjny celu gałęzi procesora (BTB) lub tablice stron kroczących jednostki zarządzania pamięcią (MMU). Nie jest jasne, czy tę klasę ataków ASLR można złagodzić. Jeśli nie mogą, korzyść z ASLR jest zmniejszona lub wyeliminowana.

Implementacje

Kilka głównych systemów operacyjnych ogólnego przeznaczenia implementuje ASLR.

Android

Android 4.0 Ice Cream Sandwich zapewnia randomizację układu przestrzeni adresowej (ASLR), aby pomóc chronić system i aplikacje innych firm przed exploitami wynikającymi z problemów z zarządzaniem pamięcią. W systemie Android 4.1 dodano obsługę plików wykonywalnych niezależnych od pozycji. Android 5.0 zrezygnował z obsługi innych niż PIE i wymaga, aby wszystkie dynamicznie łączone pliki binarne były niezależne od pozycji. Randomizacja kolejności ładowania bibliotek została przyjęta do projektu open source systemu Android w dniu 26 października 2015 r. [ Potrzebne źródło inne niż podstawowe ] i została uwzględniona w wersji Androida 7.0.

DragonFly BSD

DragonFly BSD ma implementację ASLR opartą na modelu OpenBSD, dodaną w 2010 roku. Jest ona domyślnie wyłączona i można ją włączyć, ustawiając sysctl vm.randomize_mmap na 1.

FreeBSD

Wsparcie dla ASLR pojawiło się we FreeBSD 13.0. Domyślnie jest wyłączone.

iOS (iPhone, iPod touch, iPad)

Apple wprowadził ASLR w iOS 4.3 (wydany w marcu 2011).

KASLR został wprowadzony w iOS 6. Losowa baza jądra to 0x01000000 + ((1+0xRR) * 0x00200000) , gdzie 0xRR to losowy bajt z SHA1 (dane losowe) wygenerowany przez iBoot (program ładujący iOS drugiego etapu).

Linuks

Jądro Linuksa domyślnie włączało słabą formę ASLR od wersji jądra 2.6.12, wydanej w czerwcu 2005. Zestawy poprawek PaX i Exec Shield do jądra Linuksa zapewniają pełniejsze implementacje. Poprawka Exec Shield dla Linuksa dostarcza 19 bitów entropii stosu w okresie 16 bajtów i 8 bitów bazowej losowości mmap w okresie 1 strony 4096 bajtów. To umieszcza podstawę stosu na obszarze o szerokości 8 MB zawierającym 524 288 możliwych pozycji, a podstawę mmap na obszarze o szerokości 1 MB zawierającym 256 możliwych pozycji.

Plik wykonywalny niezależny od pozycji (PIE) implementuje losowy adres bazowy dla głównego pliku wykonywalnego pliku binarnego i istnieje od 2003 r. Zapewnia taką samą losowość adresu głównemu plikowi wykonywalnemu, jak w przypadku bibliotek współdzielonych. Funkcji PIE nie można używać razem z prelink dla tego samego pliku wykonywalnego. Narzędzie do łączenia wstępnego implementuje randomizację w czasie przed łączeniem, a nie w czasie wykonywania, ponieważ z założenia prelink ma na celu obsłużenie relokacji bibliotek, zanim musi to zrobić dynamiczny linker, co pozwala na jednorazową relokację dla wielu uruchomień programu. W rezultacie rzeczywista randomizacja przestrzeni adresowej zniweczyłaby cel łączenia wstępnego.

Randomizację można wyłączyć dla określonego procesu, zmieniając jego domenę wykonania, używając personalizacji(2) .

Randomizacja układu przestrzeni adresowej jądra

Randomizacja układu przestrzeni adresowej jądra (KASLR) umożliwia randomizację przestrzeni adresowej dla obrazu jądra Linuksa poprzez losowe losowanie miejsca umieszczenia kodu jądra w czasie rozruchu. KASLR został włączony do głównej linii jądra Linuksa w wersji jądra 3.14, wydanej 30 marca 2014 r. Po wkompilowaniu można go wyłączyć podczas rozruchu, określając nokaslr jako jeden z parametrów rozruchu jądra.

Istnieje kilka ataków typu side-channel na procesory x86, które mogą spowodować wyciek adresów jądra. Pod koniec 2017 roku opracowano izolację tablicy stron jądra (KPTI, czyli KAISER), aby odeprzeć te ataki. Jednak ta metoda nie chroni przed atakami kanału bocznego wykorzystującymi kolizje w strukturach predyktorów rozgałęzień .

Od 2021 r. Randomizacja układu przestrzeni adresowej jądra o drobniejszym ziarnie (lub granulowany funkcja KASLR, FGKASLR) jest planowanym rozszerzeniem KASLR w celu randomizacji do poziomu funkcji.

Microsoft Windows

System Windows Vista firmy Microsoft (wydany w styczniu 2007 r.) i nowsze mają włączoną funkcję ASLR tylko dla plików wykonywalnych i bibliotek dołączanych dynamicznie , które są specjalnie połączone w celu obsługi ASLR. Ze względu na kompatybilność nie jest domyślnie włączona dla innych aplikacji. Zazwyczaj tylko starsze oprogramowanie jest niekompatybilne, a ASLR można w pełni włączyć, edytując wpis rejestru HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages lub instalując zestaw narzędzi Microsoft Enhanced Mitigation Experience Toolkit .

Lokalizacje sterty , stosu , bloku środowiska procesu i bloku środowiska wątku są również losowe. W dokumencie bezpieczeństwa firmy Symantec zauważono, że funkcja ASLR w 32-bitowym systemie Windows Vista może nie być tak solidna, jak oczekiwano, a firma Microsoft przyznała się do słabości w jej implementacji.

Oparte na hoście systemy zapobiegania włamaniom , takie jak WehnTrust i Ozone , oferują również ASLR dla systemów operacyjnych Windows XP i Windows Server 2003 . WehnTrust jest oprogramowaniem typu open source. Pełne szczegóły implementacji Ozone nie są dostępne.

W lutym 2012 zauważono, że ASLR w 32-bitowych systemach Windows przed Windows 8 może mieć zmniejszoną skuteczność w sytuacjach małej ilości pamięci. Podobny efekt uzyskano również w systemie Linux w tych samych badaniach. Kod testowy spowodował panikę jądra w systemie Mac OS X 10.7.3 , więc zachowanie ASLR w tym scenariuszu pozostało niejasne.

NetBSD

Wsparcie dla ASLR w przestrzeni użytkownika pojawiło się w NetBSD 5.0 ​​(wydanym w kwietniu 2009) i było domyślnie włączone w NetBSD-current w kwietniu 2016.

Obsługa jądra ASLR na amd64 została dodana w NetBSD-current w październiku 2017 r., Czyniąc NetBSD pierwszym systemem BSD obsługującym KASLR.

OpenBSD

W 2003 roku OpenBSD stał się pierwszym głównym systemem operacyjnym obsługującym silną formę ASLR i aktywującym go domyślnie. OpenBSD zakończył obsługę ASLR w 2008 roku, kiedy dodał obsługę PIE . Malloc(3) OpenBSD 4.4 został zaprojektowany w celu poprawy bezpieczeństwa poprzez wykorzystanie funkcji ASLR i gap page zaimplementowanych jako część wywołania systemowego OpenBSD mmap oraz wykrywanie błędów typu use-after-free. Wydany w 2013 roku OpenBSD 5.3 był pierwszym głównym systemem operacyjnym, który domyślnie włączał niezależne od pozycji pliki wykonywalne na wielu platformach sprzętowych , a OpenBSD 5.7 domyślnie aktywował niezależne od pozycji statyczne pliki binarne (Static-PIE).

System operacyjny Mac

W systemie Mac OS X Leopard 10.5 (wydanym w październiku 2007) firma Apple wprowadziła randomizację bibliotek systemowych.

W systemie Mac OS X Lion 10.7 (wydanym w lipcu 2011 r.) Apple rozszerzył swoją implementację, aby objąć wszystkie aplikacje, stwierdzając, że „randomizacja układu przestrzeni adresowej (ASLR) została ulepszona dla wszystkich aplikacji. Jest teraz dostępna dla aplikacji 32-bitowych (podobnie jak sterta zabezpieczenia pamięci), dzięki czemu aplikacje 64-bitowe i 32-bitowe są bardziej odporne na ataki”.

Począwszy od systemu OS X Mountain Lion 10.8 (wydanego w lipcu 2012 r.) i nowszych, cały system, w tym jądro, a także kexty i strefy, są losowo przenoszone podczas uruchamiania systemu.

Solaris

ASLR został wprowadzony w Solarisie począwszy od Solaris 11.1 (wydany w październiku 2012). ASLR w systemie Solaris 11.1 można ustawić dla całego systemu, dla strefy lub dla każdego pliku binarnego.

Eksploatacja

Wykazano, że atak kanałem bocznym z wykorzystaniem bufora docelowego gałęzi omija ochronę ASLR. W 2017 roku zademonstrowano atak o nazwie „ASLR⊕Cache”, który może pokonać ASLR w przeglądarce internetowej przy użyciu JavaScript.

Zobacz też

Linki zewnętrzne