L’heap overflow è una forma di corruzione della memoria che si verifica quando un programma scrive oltre i limiti di un buffer allocato dinamicamente nell’heap. A differenza del buffer overflow classico, che colpisce lo stack, l’heap overflow agisce sulla memoria gestita da malloc/free (o equivalenti), dove risiedono oggetti, strutture dati e metadati dell’allocatore.
La pericolosità di questa classe di vulnerabilità risiede nel fatto che l’heap è condiviso da molteplici allocazioni: sovrascrivere i metadati dell’allocatore o le strutture di oggetti adiacenti consente di redirigere il flusso di esecuzione in modi difficili da rilevare.
Struttura dell’heap
L’heap è un’area di memoria a crescita dinamica gestita dall’allocatore del sistema operativo o della libreria runtime (es. ptmalloc2 su Linux, jemalloc, tcmalloc). Ogni blocco allocato è preceduto da un’intestazione (chunk header) contenente metadati come la dimensione del blocco e i flag di stato.
[ chunk header | dati utente | padding ] [ chunk header | dati utente ] ...
Sovrascrivere il chunk header del blocco successivo permette all’attaccante di manipolare il comportamento di free() o malloc() per ottenere scritture arbitrarie in memoria.
Meccanismo di sfruttamento
1. Overflow del buffer
Il programma scrive più byte di quanti ne contenga il buffer allocato:
char *buf = malloc(64);
// legge 128 byte in un buffer da 64 → heap overflow
memcpy(buf, input, 128);
2. Corruzione dei metadati (unlink attack)
L’attaccante sovrascrive i puntatori fd (forward) e bk (backward) nel chunk libero adiacente. Quando free() esegue la consolidazione (unlink), scrive valori controllati dall’attaccante in posizioni arbitrarie di memoria.
3. Corruzione di oggetti adiacenti
In linguaggi con gestione manuale della memoria, oggetti adiacenti possono contenere puntatori a funzione o vtable (C++). Sovrascriverli consente di dirottare il flusso di esecuzione al successivo invocazione del metodo virtuale.
4. Use-After-Free come prerequisito
L’heap overflow viene spesso combinato con vulnerabilità use-after-free: l’attaccante libera un blocco e poi lo rialloca con contenuto controllato, sovrapponendosi a strutture critiche.
Tecniche di mitigazione
| Meccanismo | Descrizione |
|---|---|
| Safe unlinking | I moderni allocatori verificano la consistenza dei puntatori fd/bk prima dell’unlink. |
| Heap canaries | Valore casuale inserito tra il chunk header e i dati, verificato al momento della deallocazione. |
| Guard pages | Pagine di memoria non mappate inserite tra le allocazioni: ogni accesso fuori bounds provoca un segfault immediato. |
| ASLR | Randomizzazione dello spazio degli indirizzi rende imprevedibili le posizioni degli oggetti nell’heap. |
| Memory-safe languages | Rust, Go e Java eliminano l’intera categoria tramite ownership, garbage collection e bounds checking. |
| AddressSanitizer (ASan) | Strumento di analisi dinamica che rileva overflow heap a runtime durante il testing. |
Differenze rispetto al buffer overflow su stack
| Caratteristica | Stack overflow | Heap overflow |
|---|---|---|
| Area colpita | Stack (variabili locali, return address) | Heap (allocazioni dinamiche) |
| Sfruttamento tipico | Sovrascrittura del return address | Corruzione di metadati o puntatori a funzione |
| Determinismo | Relativamente predicibile | Dipende dal layout dell’allocatore |
| Protezioni specifiche | Stack canary, NX/DEP | Safe unlinking, heap canary, guard pages |
Rilevanza nella sicurezza moderna
Gli heap overflow sono alla base di numerosi exploit di alto profilo, in particolare nei browser web (motori JavaScript come V8, SpiderMonkey) e nei kernel di sistema operativo. La complessità dell’allocatore moderno rende questi attacchi difficili ma non impossibili: tecniche come heap grooming (manipolazione del layout heap per posizionare oggetti critici in posizioni prevedibili) sono ampiamente documentate nei writeup di CTF e nelle ricerche di sicurezza offensive.
Strumenti come AddressSanitizer e Valgrind sono essenziali nel ciclo di sviluppo per rilevare queste vulnerabilità prima della produzione.