Heap Overflow

Reading time: 5 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks

Osnovne informacije

Heap overflow je kao stack overflow ali u heap-u. U suštini to znači da je neki prostor rezervisan u heap-u za skladištenje podataka i skladišteni podaci su bili veći od rezervisanog prostora.

U stack overflow-ima znamo da će neki registri poput pokazivača instrukcija ili stack frame-a biti vraćeni iz stack-a i to bi moglo biti moguće zloupotrebiti. U slučaju heap overflow-a, nema osetljivih informacija koje se po defaultu čuvaju u heap chunk-u koji može biti overflow-ovan. Međutim, to mogu biti osetljive informacije ili pokazivači, tako da kritičnost ove ranjivosti zavisi od koji podaci mogu biti prepisani i kako bi napadač mogao to zloupotrebiti.

tip

Da biste pronašli offset-e overflow-a, možete koristiti iste obrasce kao u stack overflow-ima.

Stack Overflow vs Heap Overflow

U stack overflow-ima raspored i podaci koji će biti prisutni u stack-u u trenutku kada se ranjivost može aktivirati su prilično pouzdani. To je zato što je stack linearan, uvek se povećava u kolidirajućoj memoriji, u specifičnim mestima izvršavanja programa stack memorija obično čuva slične vrste podataka i ima neku specifičnu strukturu sa nekim pokazivačima na kraju dela stack-a koji koristi svaka funkcija.

Međutim, u slučaju heap overflow-a, korišćena memorija nije linearna, već su alokirani chunk-ovi obično na odvojenim pozicijama memorije (ne jedan pored drugog) zbog bins i zona koje razdvajaju alokacije po veličini i zato što se prethodno oslobođena memorija koristi pre nego što se alociraju novi chunk-ovi. Teško je znati objekat koji će kolidirati sa onim koji je ranjiv na heap overflow. Dakle, kada se pronađe heap overflow, potrebno je pronaći pouzdan način da se željeni objekat postavi pored u memoriji onog koji može biti overflow-ovan.

Jedna od tehnika koja se koristi za ovo je Heap Grooming koja se koristi, na primer, u ovom postu. U postu se objašnjava kako kada u iOS kernel-u zona ostane bez memorije za skladištenje chunk-ova memorije, ona se širi za kernel stranicu, a ova stranica se deli na chunk-ove očekivanih veličina koji će se koristiti redom (do iOS verzije 9.2, zatim se ovi chunk-ovi koriste na randomizovan način kako bi se otežala eksploatacija ovih napada).

Stoga, u prethodnom postu gde se dešava heap overflow, kako bi se primorao overflow-ovani objekat da kolidira sa objektom žrtvom, nekoliko kallocs se primorava od strane nekoliko niti kako bi se pokušalo osigurati da su svi slobodni chunk-ovi popunjeni i da je stvorena nova stranica.

Da bi se primoralo ovo popunjavanje objektima specifične veličine, out-of-line alokacija povezana sa iOS mach port-om je idealan kandidat. Prilagođavanjem veličine poruke, moguće je tačno odrediti veličinu kalloc alokacije i kada se odgovarajući mach port uništi, odgovarajuća alokacija će odmah biti vraćena nazad kfree.

Zatim, neki od ovih mesta mogu biti oslobođeni. kalloc.4096 slobodna lista oslobađa elemente u redosledu poslednji ulaz-prvi izlaz, što u suštini znači da ako su neka mesta oslobođena i eksploatacija pokušava da alocira nekoliko objekata žrtava dok pokušava da alocira objekat ranjiv na overflow, verovatno je da će ovaj objekat biti praćen objektom žrtvom.

Primer libc

Na ovoj stranici moguće je pronaći osnovnu emulaciju Heap overflow-a koja pokazuje kako prepisivanje prev in use bita sledećeg chunk-a i pozicije prev veličine omogućava konzolidaciju korišćenog chunk-a (praveći da misli da je neiskorišćen) i zatim ponovo alocirati omogućavajući prepisivanje podataka koji se koriste u različitom pokazivaču.

Još jedan primer iz protostar heap 0 pokazuje vrlo osnovan primer CTF-a gde se heap overflow može zloupotrebiti da pozove funkciju pobednika da dobije zastavicu.

U protostar heap 1 primeru moguće je videti kako zloupotreba buffer overflow-a omogućava prepisivanje u bliskom chunk-u adrese gde će arbitrarni podaci od korisnika biti napisani.

Primer ARM64

Na stranici https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/ možete pronaći primer heap overflow-a gde je komanda koja će biti izvršena smeštena u sledeći chunk iz overflow-ovanog chunk-a. Tako, moguće je modifikovati izvršenu komandu prepisivanjem sa lakom eksploatacijom kao:

bash
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt

Ostali primeri

  • Auth-or-out. Hack The Box
  • Koristimo ranjivost Integer Overflow da bismo dobili Heap Overflow.
  • Korumpiramo pokazivače na funkciju unutar struct-a prekomernog dela da postavimo funkciju kao što je system i dobijemo izvršenje koda.

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks