Use-after-free: usare memoria già liberata
Dopo free(p), p resta puntato (dangling). Se l'allocatore riassegna quel chunk a un altro oggetto, usare p legge/scrive l'oggetto nuovo.
Sfruttarlo
Lo schema classico: liberi un oggetto con una funzione virtuale (vtable/puntatore a funzione), rialloci un buffer della stessa dimensione riempito con dati tuoi, poi l'oggetto vecchio viene "usato" e chiama il puntatore che ora controlli.
free(obj);
spray(size_of_obj, controlled_bytes); // riempi il chunk liberato
obj->method(); // salta all'indirizzo che hai scrittoDifesa
Azzera i puntatori dopo la free. Usa smart pointer/ownership (Rust li elimina per costruzione). Allocatori con quarantena e delayed reuse, ASAN in test, e mitigazioni come pointer authentication (ARM) o CFI riducono l'impatto.