Libc Protections
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Malloc przydziela pamięć w grupach 8-bajtowych (32-bitowych) lub 16-bajtowych (64-bitowych). Oznacza to, że koniec kawałków w systemach 32-bitowych powinien być wyrównany do 0x8, a w systemach 64-bitowych do 0x0. Funkcja zabezpieczeń sprawdza, czy każdy kawałek jest poprawnie wyrównany w tych konkretnych lokalizacjach przed użyciem wskaźnika z bin.
Egzekwowanie wyrównania kawałków w systemach 64-bitowych znacznie zwiększa bezpieczeństwo Malloc, ograniczając umiejscowienie fałszywych kawałków do tylko 1 na każde 16 adresów. To komplikuje wysiłki związane z eksploatacją, szczególnie w scenariuszach, w których użytkownik ma ograniczoną kontrolę nad wartościami wejściowymi, co sprawia, że ataki są bardziej złożone i trudniejsze do skutecznego przeprowadzenia.
Atak Fastbin na __malloc_hook
Nowe zasady wyrównania w Malloc również uniemożliwiają klasyczny atak związany z __malloc_hook
. Wcześniej napastnicy mogli manipulować rozmiarami kawałków, aby nadpisać ten wskaźnik funkcji i uzyskać wykonanie kodu. Teraz surowe wymagania dotyczące wyrównania zapewniają, że takie manipulacje nie są już możliwe, zamykając powszechną drogę eksploatacji i zwiększając ogólne bezpieczeństwo.
Zmiana Wskaźników to ulepszenie zabezpieczeń stosowane w celu ochrony wskaźników Fd fastbin i tcache w operacjach zarządzania pamięcią. Technika ta pomaga zapobiegać pewnym rodzajom taktyk eksploatacji pamięci, szczególnie tym, które nie wymagają wycieków informacji o pamięci lub które manipulują lokalizacjami pamięci bezpośrednio w odniesieniu do znanych pozycji (relatywne nadpisania).
Sednem tej techniki jest formuła obfuskacji:
New_Ptr = (L >> 12) XOR P
L to Lokalizacja Przechowywania wskaźnika.
P to rzeczywisty wskaźnik Fd fastbin/tcache.
Powód przesunięcia bitowego lokalizacji przechowywania (L) o 12 bitów w prawo przed operacją XOR jest kluczowy. Ta manipulacja odnosi się do podatności inherentnej w deterministycznej naturze 12 najmniej znaczących bitów adresów pamięci, które są zazwyczaj przewidywalne z powodu ograniczeń architektury systemu. Przesuwając bity, przewidywalna część jest usuwana z równania, zwiększając losowość nowego, zmienionego wskaźnika i tym samym chroniąc przed eksploatacjami, które polegają na przewidywalności tych bitów.
Ten zmieniony wskaźnik wykorzystuje istniejącą losowość zapewnianą przez Losowe Rozmieszczenie Przestrzeni Adresowej (ASLR), które losowo rozmieszcza adresy używane przez programy, aby utrudnić napastnikom przewidywanie układu pamięci procesu.
Demangling wskaźnika w celu odzyskania oryginalnego adresu polega na użyciu tej samej operacji XOR. Tutaj zmieniony wskaźnik traktowany jest jako P w formule, a po XOR z niezmienioną lokalizacją przechowywania (L) ujawnia oryginalny wskaźnik. Ta symetria w zmienianiu i demanglingu zapewnia, że system może efektywnie kodować i dekodować wskaźniki bez znaczącego narzutu, jednocześnie znacznie zwiększając bezpieczeństwo przed atakami, które manipulują wskaźnikami pamięci.
Zmiana wskaźników ma na celu zapobieganie częściowym i pełnym nadpisaniom wskaźników w zarządzaniu stertą, co stanowi znaczące ulepszenie w zakresie bezpieczeństwa. Ta funkcja wpływa na techniki eksploatacji na kilka sposobów:
Zapobieganie Relatywnym Nadpisaniom Byte Byte: Wcześniej napastnicy mogli zmieniać część wskaźnika, aby przekierować kawałki sterty do różnych lokalizacji bez znajomości dokładnych adresów, technika widoczna w bezwyciekowym House of Roman exploit. Dzięki zmianie wskaźników, takie relatywne nadpisania bez wycieku sterty teraz wymagają brutalnego wymuszania, co drastycznie zmniejsza ich prawdopodobieństwo sukcesu.
Zwiększona Trudność Ataków na Tcache Bin/Fastbin: Powszechne ataki, które nadpisują wskaźniki funkcji (jak __malloc_hook
) poprzez manipulację wpisami fastbin lub tcache, są utrudnione. Na przykład atak może polegać na wycieku adresu LibC, zwolnieniu kawałka do bin tcache, a następnie nadpisaniu wskaźnika Fd, aby przekierować go do __malloc_hook
w celu wykonania dowolnego kodu. Dzięki zmianie wskaźników, te wskaźniki muszą być poprawnie zmienione, co wymaga wycieku sterty do dokładnej manipulacji, podnosząc tym samym barierę eksploatacji.
Wymóg Wycieku Sterty w Lokalizacjach Niezwiązanych ze Stertą: Tworzenie fałszywego kawałka w obszarach niezwiązanych ze stertą (jak stos, sekcja .bss lub PLT/GOT) teraz również wymaga wycieku sterty z powodu potrzeby zmiany wskaźników. To zwiększa złożoność eksploatacji tych obszarów, podobnie jak wymóg manipulacji adresami LibC.
Wyciek Adresów Sterty Staje się Bardziej Wyzwanie: Zmiana wskaźników ogranicza użyteczność wskaźników Fd w fastbin i tcache jako źródeł wycieków adresów sterty. Jednak wskaźniki w nieposortowanych, małych i dużych binach pozostają niezmienione, więc nadal mogą być używane do wycieków adresów. Ta zmiana zmusza napastników do badania tych bin w poszukiwaniu informacji do eksploatacji, chociaż niektóre techniki mogą nadal pozwalać na demangling wskaźników przed wyciekiem, chociaż z ograniczeniami.
Aby lepiej zrozumieć proces sprawdź oryginalny post stąd.
Formuła używana do zmiany i demanglingu wskaźników to:
New_Ptr = (L >> 12) XOR P
Gdzie L to lokalizacja przechowywania, a P to wskaźnik Fd. Gdy L jest przesuwany w prawo o 12 bitów, ujawnia najbardziej znaczące bity P, z powodu natury XOR, która zwraca 0, gdy bity są XORowane ze sobą.
Kluczowe Kroki w Algorytmie:
Początkowy Wyciek Najbardziej Znaczących Bitów: XORując przesunięte L z P, efektywnie uzyskujesz górne 12 bitów P, ponieważ przesunięta część L będzie zerowa, pozostawiając odpowiadające bity P niezmienione.
Odzyskiwanie Bitów Wskaźnika: Ponieważ XOR jest odwracalny, znajomość wyniku i jednego z operandów pozwala obliczyć drugi operand. Ta właściwość jest używana do dedukcji całego zestawu bitów dla P poprzez sukcesywne XORowanie znanych zestawów bitów z częściami zmienionego wskaźnika.
Iteracyjne Demangling: Proces jest powtarzany, za każdym razem używając nowo odkrytych bitów P z poprzedniego kroku do dekodowania następnego segmentu zmienionego wskaźnika, aż wszystkie bity zostaną odzyskane.
Obsługa Bitów Deterministycznych: Ostatnie 12 bitów L jest tracone z powodu przesunięcia, ale są one deterministyczne i mogą być odbudowane po procesie.
Możesz znaleźć implementację tego algorytmu tutaj: https://github.com/mdulin2/mangle
Ochrona wskaźników to technika łagodzenia eksploatacji stosowana w glibc w celu ochrony przechowywanych wskaźników funkcji, szczególnie tych rejestrowanych przez wywołania biblioteczne, takie jak atexit()
. Ta ochrona polega na zamieszaniu wskaźników poprzez XORowanie ich z tajnym kluczem przechowywanym w danych wątku (fs:0x30
) i zastosowaniu rotacji bitowej. Mechanizm ten ma na celu zapobieganie przejmowaniu kontroli nad przepływem przez napastników poprzez nadpisywanie wskaźników funkcji.
Zrozumienie Operacji Ochrony Wskaźników: Zamieszanie (zmiana) wskaźników odbywa się za pomocą makra PTR_MANGLE
, które XORuje wskaźnik z 64-bitowym sekretem, a następnie wykonuje lewą rotację o 0x11 bitów. Operacja odwrotna do odzyskania oryginalnego wskaźnika jest obsługiwana przez PTR_DEMANGLE
.
Strategia Ataku: Atak opiera się na podejściu znanego tekstu jawnego, gdzie napastnik musi znać zarówno oryginalną, jak i zmienioną wersję wskaźnika, aby wydedukować sekret użyty do zmiany.
Wykorzystywanie Znanych Tekstów Jawnych:
Identyfikacja Stałych Wskaźników Funkcji: Przez badanie kodu źródłowego glibc lub zainicjowanych tabel wskaźników funkcji (jak __libc_pthread_functions
), napastnik może znaleźć przewidywalne wskaźniki funkcji.
Obliczanie Sekretu: Używając znanego wskaźnika funkcji, takiego jak __pthread_attr_destroy
, oraz jego zmienionej wersji z tabeli wskaźników funkcji, sekret można obliczyć, wykonując rotację w prawo zmienionego wskaźnika, a następnie XORując go z adresem funkcji.
Alternatywne Teksty Jawne: Napastnik może również eksperymentować z zamianą wskaźników z znanymi wartościami, takimi jak 0 lub -1, aby sprawdzić, czy te generują rozpoznawalne wzory w pamięci, potencjalnie ujawniając sekret, gdy te wzory zostaną znalezione w zrzutach pamięci.
Praktyczne Zastosowanie: Po obliczeniu sekretu, napastnik może manipulować wskaźnikami w kontrolowany sposób, zasadniczo obchodząc ochronę Ochrony Wskaźników w aplikacji wielowątkowej, mając wiedzę o adresie bazowym libc i możliwość odczytu dowolnych lokalizacji pamięci.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)