Opryskiwanie sterty
W bezpieczeństwie komputerowym rozpylanie sterty jest techniką stosowaną w exploitach w celu ułatwienia wykonania dowolnego kodu . Część kodu źródłowego exploita, która implementuje tę technikę, nazywana jest sprayem sterty . Ogólnie rzecz biorąc, kod, który rozpyla stertę, próbuje umieścić określoną sekwencję bajtów we wcześniej określonym miejscu w pamięci procesu docelowego , każąc mu przydzielić (duże) bloki na stercie procesu i wypełnij bajty w tych blokach odpowiednimi wartościami.
Operacja
Rozpylanie sterty w rzeczywistości nie wykorzystuje żadnych problemów z bezpieczeństwem, ale można go użyć do ułatwienia wykorzystania luki. Sam spray sterty nie może być użyty do złamania jakichkolwiek granic bezpieczeństwa: potrzebny jest oddzielny problem bezpieczeństwa.
Wykorzystanie kwestii bezpieczeństwa jest często trudne, ponieważ na ten proces mogą wpływać różne czynniki. Przypadkowe wyrównanie pamięci i czasu wprowadza dużo losowości (z punktu widzenia atakującego). Aby to zrekompensować i zwiększyć szanse na pomyślną eksploatację, można zastosować oprysk hałdy, aby wprowadzić dużą ilość zamówień. Rozpylanie sterty wykorzystuje fakt, że w większości architektur i systemów operacyjnych lokalizacja początkowa dużych alokacji sterty jest przewidywalna, a kolejne alokacje są z grubsza sekwencyjne. Oznacza to, że opryskiwana sterta będzie z grubsza znajdować się w tym samym miejscu za każdym razem, gdy opryskiwana jest sterta.
Exploity często wykorzystują określone bajty do rozpylania sterty, ponieważ dane przechowywane na stercie pełnią wiele ról. Podczas wykorzystywania luki w zabezpieczeniach kod aplikacji często może odczytać adres z dowolnego miejsca w pamięci. Ten adres jest następnie używany przez kod jako adres funkcji do wykonania. Jeśli exploit może zmusić aplikację do odczytania tego adresu z rozpylanej sterty, może kontrolować przepływ wykonywania, gdy kod używa tego adresu jako wskaźnika funkcji i przekierowuje go do rozpylanej sterty. Jeśli exploitowi uda się przekierować przepływ sterowania do rozproszonej sterty, znajdujące się tam bajty zostaną wykonane, umożliwiając exploitowi wykonanie dowolnych działań, jakich życzy sobie atakujący. Dlatego bajty na stercie są ograniczone do reprezentowania prawidłowych adresów w samym sprayu sterty, przechowując ważne instrukcje dla architektury docelowej, więc aplikacja nie ulegnie awarii. Dlatego powszechne jest spryskiwanie pojedynczym bajtem, który przekłada się zarówno na prawidłowy adres, jak i na NOP lub podobna do NOP w architekturze docelowej. Dzięki temu spray sterty może działać jako bardzo duży sanek NOP (na przykład 0x0c0c0c0c jest często używany jako niekanoniczny NOP)
Historia
Spraye sterty były sporadycznie używane w exploitach od co najmniej 2001 roku, ale technika ta zaczęła być szeroko stosowana w exploitach dla przeglądarek internetowych latem 2005 roku po wydaniu kilku takich exploitów, które wykorzystywały tę technikę przeciwko szerokiej gamie błędów w Internecie Odkrywca . Rozpryski stosowane we wszystkich tych exploitach były bardzo podobne, co pokazało wszechstronność techniki i łatwość jej użycia, bez konieczności wprowadzania większych modyfikacji między exploitami. Okazało się, że jest wystarczająco proste do zrozumienia i użycia, aby umożliwić początkującym hakerom szybkie pisanie niezawodnych exploitów dla wielu typów luki w zabezpieczeniach przeglądarek internetowych i wtyczek do przeglądarek internetowych . Wiele exploitów przeglądarek internetowych, które wykorzystują rozpylanie sterty, składa się tylko z rozpylania sterty, które jest kopiowane i wklejane z poprzedniego exploita w połączeniu z małym fragmentem skryptu lub kodu HTML , który wyzwala lukę.
Realizacja
JavaScript
Rozpylacze sterty dla przeglądarek internetowych są powszechnie implementowane w JavaScript i rozpylają stertę, tworząc duże ciągi znaków . Najczęściej stosowaną techniką jest rozpoczynanie od ciągu jednego znaku i ciągłe łączenie go ze sobą. W ten sposób długość łańcucha może rosnąć wykładniczo , aż do maksymalnej długości dozwolonej przez silnik skryptowy . W zależności od tego, jak przeglądarka implementuje ciągi znaków, ASCII lub Unicode w łańcuchu można używać znaków. Kod rozpylania sterty tworzy kopie długiego ciągu z kodem powłoki i przechowuje je w tablicy, aż do momentu, w którym rozpylona zostanie wystarczająca ilość pamięci, aby zapewnić działanie exploita.
VBScript
Czasami język VBScript jest używany w programie Internet Explorer do tworzenia ciągów przy użyciu funkcji String .
ActionScript
W lipcu 2009 wykryto, że exploity wykorzystywały ActionScript do rozpylania sterty w Adobe Flash .
Obrazy
Chociaż udowodniono, że rozpylanie sterty można wykonać innymi sposobami, na przykład ładując pliki obrazów do procesu, nie było to szeroko stosowane (stan na sierpień 2008). [ wymaga aktualizacji ]
HTML5
We wrześniu 2012 r. na EuSecWest 2012 zaprezentowano nową technikę. Dwóch badaczy CORE, Federico Muttis i Anibal Sacco, wykazało, że stertę można rozpylać z bardzo dużą ziarnistością alokacji dzięki zastosowaniu technologii wprowadzonych w HTML5 . W szczególności użyli niskopoziomowego interfejsu mapy bitowej oferowanego przez interfejs API kanwy oraz pracowników sieciowych , aby zrobić to szybciej.
Wykrywanie i zapobieganie
- Projekt Nozzle firmy Microsoft Research ma na celu wykrywanie i zapobieganie rozpylaniu hałdy.
- BuBBle to kolejny środek zaradczy, który można rozważyć w celu wykrycia i zapobieżenia atakowi uruchomionemu po rozpyleniu sterty
Zobacz też
- NOP slide lub NOP sanki, technika uzupełniająca opryskiwanie hałd
- Heap feng shui , technika manipulowania układem sterty
- oprysk JIT