Use-After-Free — Réutilisation de mémoire libérée

Heap Avancé

Principe

Use-After-Free : un programme libère un bloc mémoire (free()) mais garde un pointeur vers lui et l'utilise encore. Si un attaquant peut réallouer ce bloc avec du contenu contrôlé avant que le pointeur soit réutilisé, il peut détourner l'exécution.

Exemple et exploitation

// Code vulnérable :
struct Animal { char nom[32]; void (*speak)(void); };
struct Animal *chat = malloc(sizeof(struct Animal));
chat->speak = &miauler;
free(chat);              // libéré
chat->speak();           // UAF ! si réalloué avec nos données

// Exploitation :
// 1. free(A)  -> mis dans tcache
// 2. malloc(sizeof(A)) -> retourne A
// 3. écrire &system dans speak
// 4. chat->speak() -> system() !

// Détecter :
valgrind --tool=memcheck ./binary
gcc -fsanitize=address ./source.c