Ochrony Libc
Reading time: 7 minutes
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
Egzekwowanie Wyrównania Kawałków
Malloc przydziela pamięć w grupach 8-bajtowych (32-bit) lub 16-bajtowych (64-bit). 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 kosza.
Korzyści Zabezpieczeń
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 na fastbins i tcache
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 fastbin/tcache Fd.
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 deterministycznym charakterze 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ęść zostaje usunięta 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 Randomizację Układu Adresów (ASLR), która randomizuje 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 zmianie i demanglingu zapewnia, że system może efektywnie kodować i dekodować wskaźniki bez znacznego narzutu, jednocześnie znacznie zwiększając bezpieczeństwo przed atakami, które manipulują wskaźnikami pamięci.
Korzyści Zabezpieczeń
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 Bajtów: Wcześniej napastnicy mogli zmieniać część wskaźnika, aby przekierować kawałki sterty do różnych lokalizacji bez znajomości dokładnych adresów, co jest techniką widoczną w eksploatacji bez wycieków House of Roman. Dzięki zmianie wskaźników, takie relatywne nadpisania bez wycieku sterty teraz wymagają brutalnego wymuszania, drastycznie zmniejszając 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 kosza 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 Wycieków 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 koszach pozostają niezmienione, więc nadal mogą być używane do wycieków adresów. Ta zmiana zmusza napastników do badania tych koszy w poszukiwaniu informacji do eksploatacji, chociaż niektóre techniki mogą nadal pozwalać na demangling wskaźników przed wyciekiem, chociaż z ograniczeniami.
Demangling Wskaźników z Wyciekem Sterty
caution
Aby uzyskać lepsze wyjaśnienie procesu sprawdź oryginalny post stąd.
Przegląd Algorytmu
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 przesunięty 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: Przez XORowanie przesuniętego 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.
- Iteracyjny 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 zostaje utraconych 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
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 zastosowanie rotacji bitowej. Mechanizm ten ma na celu zapobieganie przejmowaniu kontroli nad przepływem przez nadpisywanie wskaźników funkcji.
Obchodzenie Ochrony Wskaźników z Wyciekem
- 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 przezPTR_DEMANGLE
. - Strategia Ataku: Atak opiera się na podejściu znanego tekstu jawnego, w którym 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
, i jego zmienionej wersji z tabeli wskaźników funkcji, sekret można obliczyć, wykonując rotację w prawo na zmienionym wskaźniku, 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.
Odnośniki
- https://maxwelldulin.com/BlogPost?post=5445977088
- https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.