Libc Protections
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Malloc alocira memoriju u 8-bajtnih (32-bitnih) ili 16-bajtnih (64-bitnih) grupama. To znači da se kraj chunk-ova u 32-bitnim sistemima treba uskladiti sa 0x8, a u 64-bitnim sistemima sa 0x0. Bezbednosna funkcija proverava da li se svaki chunk ispravno usklađuje na ovim specifičnim mestima pre nego što koristi pokazivač iz bin-a.
Sprovođenje usklađivanja chunk-ova u 64-bitnim sistemima značajno poboljšava bezbednost Malloc-a tako što ograničava postavljanje lažnih chunk-ova na samo 1 od svake 16 adresa. To otežava napade, posebno u scenarijima gde korisnik ima ograničenu kontrolu nad ulaznim vrednostima, čineći napade složenijim i teže izvodivim.
Fastbin Attack on __malloc_hook
Nova pravila usklađivanja u Malloc-u takođe sprečavaju klasičan napad koji uključuje __malloc_hook
. Prethodno su napadači mogli manipulisati veličinama chunk-ova da prepišu ovaj pokazivač funkcije i dobiju izvršenje koda. Sada, strogi zahtevi za usklađivanje osiguravaju da takve manipulacije više nisu moguće, zatvarajući uobičajeni put za eksploataciju i poboljšavajući ukupnu bezbednost.
Pointer Mangling je bezbednosno poboljšanje koje se koristi za zaštitu fastbin i tcache Fd pokazivača u operacijama upravljanja memorijom. Ova tehnika pomaže u sprečavanju određenih vrsta taktika eksploatacije memorije, posebno onih koje ne zahtevaju informacije o propuštenoj memoriji ili koje direktno manipulišu lokacijama memorije u odnosu na poznate pozicije (relativni prepisivanja).
Osnova ove tehnike je formula za obfuscation:
New_Ptr = (L >> 12) XOR P
L je lokacija skladištenja pokazivača.
P je stvarni fastbin/tcache Fd pokazivač.
Razlog za pomeranje lokacije skladištenja (L) za 12 bita udesno pre XOR operacije je kritičan. Ova manipulacija se bavi ranjivošću koja je inherentna determinističkoj prirodi najmanje značajnih 12 bita adresa memorije, koje su obično predvidljive zbog ograničenja arhitekture sistema. Pomeraanjem bitova, predvidljivi deo se izbacuje iz jednačine, povećavajući nasumičnost novog, izmenjenog pokazivača i time štiteći od eksploatacija koje se oslanjaju na predvidljivost ovih bitova.
Ovaj izmenjeni pokazivač koristi postojeću nasumičnost koju pruža Randomizacija rasporeda adresa (ASLR), koja randomizuje adrese koje koriste programi kako bi otežala napadačima da predviđaju raspored memorije procesa.
Demangling pokazivača za vraćanje originalne adrese uključuje korišćenje iste XOR operacije. Ovde se izmenjeni pokazivač tretira kao P u formuli, a kada se XOR-uje sa nepromenjenom lokacijom skladištenja (L), rezultira otkrivanjem originalnog pokazivača. Ova simetrija u izmeni i vraćanju osigurava da sistem može efikasno kodirati i dekodirati pokazivače bez značajnog preopterećenja, dok značajno povećava bezbednost protiv napada koji manipulišu pokazivačima memorije.
Izmena pokazivača ima za cilj da spreči delimična i potpuna prepisivanja pokazivača u heap-u, što je značajno poboljšanje u bezbednosti. Ova funkcija utiče na tehnike eksploatacije na nekoliko načina:
Sprečavanje Bye Byte Relativnih Prepisivanja: Prethodno su napadači mogli promeniti deo pokazivača da preusmere heap chunk-ove na različite lokacije bez poznavanja tačnih adresa, tehnika koja je očigledna u eksploataciji bez propuštanja House of Roman. Sa izmenom pokazivača, takva relativna prepisivanja bez propuštanja heap-a sada zahtevaju brute forcing, drastično smanjujući verovatnoću uspeha.
Povećana Težina Tcache Bin/Fastbin Napada: Uobičajeni napadi koji prepisuju pokazivače funkcija (poput __malloc_hook
) manipulacijom fastbin ili tcache unosa su otežani. Na primer, napad bi mogao uključivati propuštanje LibC adrese, oslobađanje chunk-a u tcache bin, a zatim prepisivanje Fd pokazivača da ga preusmeri na __malloc_hook
za proizvoljno izvršenje koda. Sa izmenom pokazivača, ovi pokazivači moraju biti ispravno izmenjeni, što zahteva propuštanje heap-a za tačnu manipulaciju, čime se povećava barijera za eksploataciju.
Zahtev za Propuštanjem Heap-a u Ne-Heap Lokacijama: Kreiranje lažnog chunk-a u ne-heap oblastima (poput steka, .bss sekcije ili PLT/GOT) sada takođe zahteva propuštanje heap-a zbog potrebe za izmenom pokazivača. Ovo produžava složenost eksploatacije ovih oblasti, slično zahtevu za manipulaciju LibC adresama.
Propuštanje Heap Adresa Postaje Teže: Izmena pokazivača ograničava korisnost Fd pokazivača u fastbin i tcache bin-ovima kao izvora za propuštanje adresa heap-a. Međutim, pokazivači u nesortiranim, malim i velikim bin-ovima ostaju neizmenjeni, pa su i dalje upotrebljivi za propuštanje adresa. Ova promena podstiče napadače da istražuju ove bin-ove za eksploatabilne informacije, iako neke tehnike mogu i dalje omogućiti vraćanje pokazivača pre propuštanja, iako sa ograničenjima.
For a better explanation of the process check the original post from here.
Formula koja se koristi za izmenu i vraćanje pokazivača je:
New_Ptr = (L >> 12) XOR P
Gde je L lokacija skladištenja, a P Fd pokazivač. Kada se L pomeri udesno za 12 bita, izlaže najznačajnije bitove P, zbog prirode XOR, koja daje 0 kada se bitovi XOR-uju sami sa sobom.
Key Steps in the Algorithm:
Početno Propuštanje Najznačajnijih Bitova: XOR-ovanjem pomerene L sa P, efikasno dobijate gornjih 12 bitova P jer će pomerena deo L biti nula, ostavljajući odgovarajuće bitove P nepromenjenim.
Obnova Bitova Pokazivača: Pošto je XOR reverzibilan, poznavanje rezultata i jednog od operanada omogućava vam da izračunate drugi operand. Ova osobina se koristi za dedukciju celog skupa bitova za P sukcesivnim XOR-ovanjem poznatih skupova bitova sa delovima izmenjenog pokazivača.
Iterativno Vraćanje: Proces se ponavlja, svaki put koristeći novo otkrivene bitove P iz prethodnog koraka za dekodiranje sledećeg segmenta izmenjenog pokazivača, sve dok se svi bitovi ne obnove.
Rukovanje Determinističkim Bitovima: Poslednjih 12 bitova L se gubi zbog pomeranja, ali su deterministički i mogu se rekonstruisati nakon procesa.
Možete pronaći implementaciju ovog algoritma ovde: https://github.com/mdulin2/mangle
Pointer guard je tehnika mitigacije eksploatacije koja se koristi u glibc-u za zaštitu skladištenih pokazivača funkcija, posebno onih registrovanih pozivima biblioteka kao što je atexit()
. Ova zaštita uključuje mešanje pokazivača XOR-ovanjem sa tajnom koja se čuva u podacima niti (fs:0x30
) i primenom bitovne rotacije. Ovaj mehanizam ima za cilj da spreči napadače da preuzmu kontrolu nad tokom izvršenja prepisivanjem pokazivača funkcija.
Razumevanje Operacija Pointer Guard-a: Mešanje (izmena) pokazivača se vrši korišćenjem makroa PTR_MANGLE
koji XOR-uje pokazivač sa 64-bitnom tajnom i zatim vrši levu rotaciju od 0x11 bitova. Obrnuta operacija za vraćanje originalnog pokazivača se obavlja pomoću PTR_DEMANGLE
.
Strategija Napada: Napad se zasniva na pristupu poznatom plaintext-u, gde napadač treba da zna i originalne i izmenjene verzije pokazivača da bi dedukovao tajnu korišćenu za izmenu.
Eksploatacija Poznatih Plaintext-a:
Identifikacija Fiksnih Pokazivača Funkcija: Istražujući izvorni kod glibc-a ili inicijalizovane tabele pokazivača funkcija (poput __libc_pthread_functions
), napadač može pronaći predvidljive pokazivače funkcija.
Izračunavanje Tajne: Koristeći poznati pokazivač funkcije kao što je __pthread_attr_destroy
i njegovu izmenjenu verziju iz tabele pokazivača funkcija, tajna se može izračunati obrnuto rotirajući (desno rotirajući) izmenjeni pokazivač i zatim XOR-ujući ga sa adresom funkcije.
Alternativni Plaintext-i: Napadač može takođe eksperimentisati sa izmenom pokazivača sa poznatim vrednostima kao što su 0 ili -1 da vidi da li ove proizvode prepoznatljive obrasce u memoriji, potencijalno otkrivajući tajnu kada se ovi obrasci pronađu u dump-ovima memorije.
Praktična Primena: Nakon izračunavanja tajne, napadač može manipulirati pokazivačima na kontrolisan način, suštinski zaobilazeći zaštitu Pointer Guard u višedretvenoj aplikaciji sa znanjem o osnovnoj adresi libc-a i sposobnošću čitanja proizvoljnih lokacija memorije.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)