Wykorzystanie sterty: use-after-free i heap spraying
Poznają Państwo elementy wewnętrzne glibc malloc, warunki use-after-free i techniki heap spray.
Wykorzystanie sterty: use-after-free i heap spraying to bezpłatna lekcja Cyber Security Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cyber Security Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cyber Security Academy zawiera 4 lekcji w sumie.
Sterta
Sterta to pamięć dynamiczna przydzielana w czasie działania programu za pomocą malloc()/free()/new/delete. W przeciwieństwie do stosu układ sterty zależy od wzorców alokacji i zwalniania, a nie od stosu wywołań. Podatności sterty często występują w przeglądarkach, parserach i demonach sieciowych.
Use-After-Free (UAF)
Podatność Use-After-Free występuje, gdy program nadal używa obszaru pamięci po jego zwolnieniu. Jeśli zwolniony obszar zostanie ponownie zaalokowany z danymi kontrolowanymi przez atakującego, program zaczyna operować na danych atakującego za pomocą nieaktualnego wskaźnika.
Przykład UAF
Wzorzec UAF:
// Vulnerable C code:
struct Object *obj = malloc(sizeof(*obj));
free(obj);
// Later, attacker causes a new malloc to fill the freed region
// with their data...
obj->method(); // now calls attacker's function pointer!Heap Feng Shui
Heap feng shui (lub heap grooming) to technika manipulowania alokatorem sterty w celu umieszczania obiektów w określonych miejscach, co umożliwia kontrolowane ponowne użycie zwolnionej pamięci. Atakujący kształtuje stertę, wyzwalając alokacje i zwolnienia w precyzyjnej kolejności.
Heap Spraying
Heap spraying polega na alokowaniu dużych ilości danych kontrolowanych przez atakującego (shellcode + NOP sleds) w całej stercie. Gdy sterta jest wypełniona w tak dużym stopniu, błędny wskaźnik prawdopodobnie trafi w dane atakującego. Technika ta jest często używana wraz z podatnościami UAF lub błędami pomylenia typów.
// JavaScript heap spray:
var spray = [];
for(var i = 0; i < 100000; i++) {
spray[i] = unescape("%90%90...shellcode...");
}Podwójne zwolnienie
Double free występuje, gdy pamięć zostaje zwolniona dwukrotnie. Drugie zwolnienie uszkadza metadane alokatora sterty (wskaźniki listy wolnych bloków), potencjalnie pozwalając atakującemu kontrolować miejsce umieszczenia następnej alokacji — i zapisywać pod dowolnym adresem.
Przepełnienie bufora sterty
Podobnie jak przepełnienie stosu, przepełnienie bufora sterty zapisuje dane poza końcem alokacji na stercie. W przeciwieństwie do przepełnień stosu celem są zazwyczaj metadane sterty (rozmiar, wskaźniki do przodu i do tyłu) lub sąsiednie alokacje zawierające wskaźniki funkcji albo wskaźniki vtable.
Pomylenie typów
Type confusion występuje, gdy fragment pamięci zaalokowany jako jeden typ jest używany jako inny typ. Zjawisko to często występuje w silnikach JavaScript i kodzie C++. Jeśli atakujący może kontrolować kolejność alokacji, może sprawić, że silnik potraktuje dane atakującego jako zaufany obiekt.
Wewnętrzne mechanizmy ptmalloc i tcmalloc
Zrozumienie działania alokatora sterty pomaga w tworzeniu exploitów. ptmalloc w glibc używa binów (unsorted, small, large) oraz fast binów. tcache (pamięć podręczna wątku) jest pierwszym źródłem alokacji. Exploity często celują w uszkodzenie binów, aby kontrolować adresy przyszłych alokacji.
Zabezpieczenia
Zabezpieczenia przed wykorzystywaniem sterty:
- Losowanie sterty (część ASLR) — losuje bazowy adres sterty
- Bezpieczne odłączanie — sprawdza wskaźniki do przodu i do tyłu przed odłączeniem
- Wykrywanie zatruwania tcache — dodane w glibc 2.32
- Manglowanie wskaźników — szyfruje zapisane wskaźniki w tcache
- Języki bezpieczne pamięciowo — Rust eliminuje UAF na etapie kompilacji
Exploity sterty przeglądarki
Większość przeglądarkowych luk 0-day dotyczy podatności sterty w silnikach JavaScript (V8, SpiderMonkey). Współczesne przeglądarki stosują wieloetapowe łańcuchy ucieczki z piaskownicy: błąd sterty w procesie renderera → ucieczka do procesu przeglądarki → eskalacja uprawnień systemu operacyjnego. Każdy etap wymaga własnej techniki.
Szybki test: wykorzystywanie sterty
Która podatność pozwala atakującemu przejąć kontrolę nad wykonaniem programu dzięki użyciu nieaktualnego wskaźnika do pamięci, która została już zwolniona, a następnie ponownie zaalokowana z danymi atakującego?
Podsumowanie lekcji
Podatności sterty — UAF, podwójne zwolnienie, przepełnienie sterty i pomylenie typów — wykorzystują błędne zarządzanie pamięcią dynamiczną. Use-after-free jest obecnie najczęściej występującą klasą exploitów. Heap spraying maksymalizuje szansę trafienia w dane atakującego. Zabezpieczenia obejmują ASLR, bezpieczne odłączanie i manglowanie wskaźników. Języki bezpieczne pamięciowo, takie jak Rust, całkowicie eliminują te klasy podatności.
Często zadawane pytania
Czy lekcja „Wykorzystanie sterty: use-after-free i heap spraying” jest bezpłatna?
Tak — pełny tekst „Wykorzystanie sterty: use-after-free i heap spraying” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cyber Security Academy, przejdź na CoddyKit PRO. Kurs Cyber Security Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wykorzystanie sterty: use-after-free i heap spraying”?
Poznają Państwo elementy wewnętrzne glibc malloc, warunki use-after-free i techniki heap spray. Ćwiczysz Cyber Security Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Cyber Security Academy?
Nie wymagamy żadnego doświadczenia. Cyber Security Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Wykorzystanie sterty: use-after-free i heap spraying”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Cyber Security Academy?
Tak. Każda lekcja Cyber Security Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Przepełnienia bufora stosu
- Programowanie zorientowane na zwroty (ROP)
- Podatności format string
- Wykorzystanie sterty: use-after-free i heap spraying