Double Free
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)
Se si libera un blocco di memoria più di una volta, può danneggiare i dati dell'allocatore e aprire la porta ad attacchi. Ecco come avviene: quando si libera un blocco di memoria, torna in un elenco di chunk liberi (ad esempio, il "fast bin"). Se si libera lo stesso blocco due volte di seguito, l'allocatore lo rileva e genera un errore. Ma se si libera un altro chunk nel mezzo, il controllo del double-free viene bypassato, causando corruzione.
Ora, quando si richiede nuova memoria (utilizzando malloc
), l'allocatore potrebbe fornire un blocco che è stato liberato due volte. Questo può portare a due puntatori diversi che puntano alla stessa posizione di memoria. Se un attaccante controlla uno di quei puntatori, può modificare il contenuto di quella memoria, il che può causare problemi di sicurezza o addirittura consentire loro di eseguire codice.
Example:
In questo esempio, dopo aver riempito il tcache con diversi chunk liberati (7), il codice libera il chunk h
, poi il chunk i
, e poi h
di nuovo, causando un double free (noto anche come Fast Bin dup). Questo apre la possibilità di ricevere indirizzi di memoria sovrapposti durante la riallocazione, il che significa che due o più puntatori possono puntare alla stessa posizione di memoria. Manipolare i dati attraverso un puntatore può quindi influenzare l'altro, creando un rischio critico per la sicurezza e potenziale per sfruttamento.
Eseguendolo, nota come i1
e i2
abbiano ottenuto lo stesso indirizzo:
Possiamo allocare solo chunk di dimensioni Fast-Bin tranne per la dimensione 0x70
, che impedisce la solita sovrascrittura di __malloc_hook
.
Invece, utilizziamo indirizzi PIE che iniziano con 0x56
come obiettivo per Fast Bin dup (1/2 possibilità).
Un luogo in cui sono memorizzati gli indirizzi PIE è in main_arena
, che si trova all'interno di Glibc e vicino a __malloc_hook
.
Miriamo a un offset specifico di main_arena
per allocare un chunk lì e continuare ad allocare chunk fino a raggiungere __malloc_hook
per ottenere l'esecuzione del codice.
Utilizzando i bin Tcache e un overflow di byte nullo, possiamo ottenere una situazione di double-free:
Allocchiamo tre chunk di dimensione 0x110
(A
, B
, C
)
Liberiamo B
Liberiamo A
e allocchiamo di nuovo per utilizzare l'overflow di byte nullo
Ora il campo di dimensione di B
è 0x100
, invece di 0x111
, quindi possiamo liberarlo di nuovo
Abbiamo un Tcache-bin di dimensione 0x110
e uno di dimensione 0x100
che puntano allo stesso indirizzo. Quindi abbiamo un double free.
Sfruttiamo il double free utilizzando Tcache poisoning
Impara e pratica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)