Libc Beskermings
Reading time: 8 minutes
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Chunk Aliging Handhaving
Malloc allokeer geheue in 8-byte (32-bit) of 16-byte (64-bit) groepe. Dit beteken dat die einde van chunks in 32-bit stelsels met 0x8 moet ooreenstem, en in 64-bit stelsels met 0x0. Die sekuriteitskenmerk kontroleer dat elke chunk korrek ooreenstem op hierdie spesifieke plekke voordat 'n pointer van 'n bin gebruik word.
Sekuriteitsvoordele
Die handhaving van chunk-aliging in 64-bit stelsels verbeter Malloc se sekuriteit aansienlik deur die plasing van vals chunks te beperk tot slegs 1 uit elke 16 adresse. Dit bemoeilik uitbuitingspogings, veral in scenario's waar die gebruiker beperkte beheer oor invoerwaardes het, wat aanvalle meer kompleks en moeiliker maak om suksesvol uit te voer.
- Fastbin Aanval op __malloc_hook
Die nuwe aliging reëls in Malloc keer ook 'n klassieke aanval wat die __malloc_hook
betrek. Voorheen kon aanvallers chunk-grootte manipuleer om hierdie funksie pointer te oorskry en kode-uitvoering te verkry. Nou verseker die streng aliging vereiste dat sulke manipulasies nie meer lewensvatbaar is nie, wat 'n algemene uitbuitingsroete sluit en die algehele sekuriteit verbeter.
Pointer Vermenging op fastbins en tcache
Pointer Vermenging is 'n sekuriteitsverbetering wat gebruik word om fastbin en tcache Fd pointers in geheuebestuur operasies te beskerm. Hierdie tegniek help om sekere tipes geheue-uitbuitings taktieke te voorkom, spesifiek dié wat nie gelekte geheue-inligting vereis nie of wat geheue-lokasies direk manipuleer relatief tot bekende posisies (relatiewe oorskrywings).
Die kern van hierdie tegniek is 'n obfuskeringsformule:
New_Ptr = (L >> 12) XOR P
- L is die Berging Plek van die pointer.
- P is die werklike fastbin/tcache Fd Pointer.
Die rede vir die bitgewys verskuiwing van die berging plek (L) met 12 bits na regs voor die XOR operasie is krities. Hierdie manipulasie spreek 'n kwesbaarheid aan wat inherent is aan die deterministiese aard van die minste betekenisvolle 12 bits van geheue adresse, wat tipies voorspelbaar is weens stelsels argitektuur beperkings. Deur die bits te verskuif, word die voorspelbare gedeelte uit die vergelyking verwyder, wat die ewekansigheid van die nuwe, vermengde pointer verbeter en sodoende beskerming bied teen uitbuitings wat op die voorspelbaarheid van hierdie bits staatmaak.
Hierdie vermengde pointer benut die bestaande ewekansigheid wat deur Address Space Layout Randomization (ASLR) verskaf word, wat adresse wat deur programme gebruik word, ewekansig maak om dit moeilik te maak vir aanvallers om die geheue-opstelling van 'n proses te voorspel.
Demengeling van die pointer om die oorspronklike adres te herwin behels die gebruik van dieselfde XOR operasie. Hier word die vermengde pointer as P in die formule behandel, en wanneer dit met die onveranderde berging plek (L) XOR word, lei dit tot die oorspronklike pointer wat onthul word. Hierdie simmetrie in vermenging en demengeling verseker dat die stelsel effektief pointers kan kodeer en dekodeer sonder beduidende oorhoofse koste, terwyl dit aansienlik die sekuriteit teen aanvalle wat geheue pointers manipuleer, verhoog.
Sekuriteitsvoordele
Pointer vermenging poog om gedeeltelike en volle pointer oorskrywings in heap bestuur te voorkom, 'n beduidende verbetering in sekuriteit. Hierdie kenmerk beïnvloed uitbuitings tegnieke op verskeie maniere:
- Voorkoming van Bye Byte Relatiewe Oorskrywings: Voorheen kon aanvallers 'n deel van 'n pointer verander om heap chunks na verskillende plekke te herlei sonder om presiese adresse te ken, 'n tegniek wat in die leakless House of Roman uitbuiting duidelik is. Met pointer vermenging vereis sulke relatiewe oorskrywings sonder 'n heap leak nou brute forcing, wat hul waarskynlikheid van sukses drasties verminder.
- Verhoogde Moeilikheid van Tcache Bin/Fastbin Aanvalle: Algemene aanvalle wat funksie pointers oorskryf (soos
__malloc_hook
) deur fastbin of tcache inskrywings te manipuleer, word belemmer. Byvoorbeeld, 'n aanval kan behels om 'n LibC adres te lek, 'n chunk in die tcache bin vry te stel, en dan die Fd pointer te oorskryf om dit na__malloc_hook
te herlei vir arbitrêre kode-uitvoering. Met pointer vermenging moet hierdie pointers korrek vermeng wees, wat 'n heap leak vir akkurate manipulasie vereis, wat die uitbuitingsdrempel verhoog. - Vereiste vir Heap Leaks in Nie-Heap Plekke: Om 'n vals chunk in nie-heap areas (soos die stapel, .bss afdeling, of PLT/GOT) te skep vereis nou ook 'n heap leak weens die behoefte aan pointer vermenging. Dit verleng die kompleksiteit van die uitbuiting van hierdie areas, soortgelyk aan die vereiste om LibC adresse te manipuleer.
- Lek van Heap Adresse Word Meer Uitdagend: Pointer vermenging beperk die nuttigheid van Fd pointers in fastbin en tcache bins as bronne vir heap adreslekke. egter, pointers in onsortering, klein, en groot bins bly onvermeng, en is dus steeds bruikbaar vir die lek van adresse. Hierdie skuif dwing aanvallers om hierdie bins te verken vir uitbuitbare inligting, alhoewel sommige tegnieke steeds toelaat dat pointers gedemeng word voor 'n lek, hoewel met beperkings.
Demengeling van Pointers met 'n Heap Leak
caution
Vir 'n beter verduideliking van die proses kyk die oorspronklike pos hier.
Algoritme Oorsig
Die formule wat gebruik word vir die vermenging en demengeling van pointers is:
New_Ptr = (L >> 12) XOR P
Waar L die berging plek is en P die Fd pointer is. Wanneer L na regs verskuif word met 12 bits, blootstel dit die mees betekenisvolle bits van P, weens die aard van XOR, wat 0 uitset wanneer bits met hulself XOR word.
Sleutelstappe in die Algoritme:
- Begin Leak van die Meest Betekenisvolle Bits: Deur die verskoven L met P te XOR, kry jy effektief die boonste 12 bits van P omdat die verskoven gedeelte van L nul sal wees, wat P's ooreenstemmende bits onveranderd laat.
- Herwinning van Pointer Bits: Aangesien XOR omkeerbaar is, laat die kennis van die resultaat en een van die operandi jou toe om die ander operand te bereken. Hierdie eienskap word gebruik om die hele stel bits vir P af te lei deur bekendgestelde stelle bits met dele van die vermengde pointer suksesief te XOR.
- Iteratiewe Demengeling: Die proses word herhaal, elke keer die nuut ontdekte bits van P van die vorige stap gebruik om die volgende segment van die vermengde pointer te dekodeer, totdat al die bits herwin is.
- Hantering van Deterministiese Bits: Die finale 12 bits van L gaan verlore weens die verskuiwing, maar hulle is deterministies en kan na die proses weer opgebou word.
Jy kan 'n implementering van hierdie algoritme hier vind: https://github.com/mdulin2/mangle
Pointer Wag
Pointer wag is 'n uitbuiting mitigasie tegniek wat in glibc gebruik word om gestoor funksie pointers te beskerm, veral dié wat deur biblioteek oproepe soos atexit()
geregistreer is. Hierdie beskerming behels die verhaspeling van die pointers deur hulle met 'n geheim wat in die draad data (fs:0x30
) gestoor is, te XOR en 'n bitgewys rotasie toe te pas. Hierdie meganisme poog om te voorkom dat aanvallers die vloei van beheer oorneem deur funksie pointers te oorskryf.
Omseiling van Pointer Wag met 'n lek
- Begrip van Pointer Wag Operasies: Die verhaspeling (vermenging) van pointers word gedoen met die
PTR_MANGLE
makro wat die pointer met 'n 64-bit geheim XOR en dan 'n linker rotasie van 0x11 bits uitvoer. Die omgekeerde operasie om die oorspronklike pointer te herwin, word hanteer deurPTR_DEMANGLE
. - Aanvalstrategie: Die aanval is gebaseer op 'n bekende-plaintekst benadering, waar die aanvaller beide die oorspronklike en die vermengde weergawes van 'n pointer moet ken om die geheim wat vir vermenging gebruik is, af te lei.
- Uitbuiting van Bekende Plaintexts:
- Identifisering van Vasgestelde Funksie Pointers: Deur glibc se bronkode of geïnitialiseerde funksie pointer tabelles (soos
__libc_pthread_functions
) te ondersoek, kan 'n aanvaller voorspelbare funksie pointers vind. - Berekening van die Geheim: Deur 'n bekende funksie pointer soos
__pthread_attr_destroy
en sy vermengde weergawe uit die funksie pointer tabel te gebruik, kan die geheim bereken word deur die vermengde pointer omgekeerd te roteer (regsrotasie) en dit dan met die adres van die funksie te XOR.
- Alternatiewe Plaintexts: Die aanvaller kan ook eksperimenteer met die vermenging van pointers met bekende waardes soos 0 of -1 om te sien of hierdie identifiseerbare patrone in geheue produseer, wat moontlik die geheim kan onthul wanneer hierdie patrone in geheue dumps gevind word.
- Praktiese Toepassing: Nadat die geheim bereken is, kan 'n aanvaller pointers op 'n beheerde manier manipuleer, wat in wese die Pointer Wag beskerming in 'n multithreaded toepassing omseil met kennis van die libc basis adres en 'n vermoë om arbitrêre geheue plekke te lees.
Verwysings
- https://maxwelldulin.com/BlogPost?post=5445977088
- https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.