CWE-416 : usage après libération, le pointeur qui survit à sa mémoire
- Accueil
- Référentiels & catalogues
- Cwe
- CWE-416 : usage après libération, le pointeur qui survit à sa mémoire
CWE-416 : usage après libération, le pointeur qui survit à sa mémoire
Section intitulée « CWE-416 : usage après libération, le pointeur qui survit à sa mémoire »Septième du CWE Top 25 2025. Le libellé officiel, Use After Free, est l’un des rares que la profession emploie tel quel ; le catalogue reconnaît aussi UAF et dangling pointer, le « pointeur pendouillant », qui a le mérite de l’image.
Un locataire rend les clés et quitte l’appartement. Il garde dans son carnet l’adresse et le code de la porte, et continue d’y envoyer son courrier. Six mois plus tard, quelqu’un d’autre habite là, et reçoit des lettres adressées au précédent, parfois les ouvre, parfois y répond. CWE-416 décrit ce carnet d’adresses.
→ Lire l’explication complète de la marmotte
Ce que la variante recouvre exactement
Section intitulée « Ce que la variante recouvre exactement »Le produit réutilise ou référence une zone de mémoire après l’avoir libérée. Le catalogue prend la peine de décrire la suite, et c’est cette suite qui fait la gravité : la zone libérée est généralement réattribuée à un autre usage, enregistrée dans un autre pointeur, tandis que le pointeur d’origine continue de désigner une adresse qui se trouve maintenant à l’intérieur de la nouvelle allocation. Toute opération passant par l’ancien pointeur agit alors sur des données qui ne lui appartiennent plus.
Le défaut n’est donc pas « libérer deux fois » (cela porte un autre numéro) ni « oublier de libérer », qui est une fuite de mémoire et un problème de performance. C’est la fenêtre entre la libération et le dernier usage du pointeur qui constitue la faiblesse, et sa durée n’a pas d’importance : un seul accès suffit.
Deux conséquences sont notées par le catalogue comme pouvant suivre cette faiblesse : CWE-120, la copie de tampon sans vérification de taille, et CWE-123, la condition « écrire quoi, où ». Autrement dit, un usage après libération sert souvent de marchepied à une écriture mémoire contrôlée, ce qui explique les notes de gravité élevées : la chaîne aboutit régulièrement à l’exécution de code.
Sa place dans l’arbre
Section intitulée « Sa place dans l’arbre »Détail qui compte pour lire le classement : CWE-416 est une variante, pas une base. Elle décrit un défaut lié à une façon précise de gérer la mémoire (l’allocation dynamique manuelle), et non un mécanisme général. Son parent dans la vue de recherche est CWE-825, le déréférencement de pointeur expiré ; dans la vue simplifiée, c’est CWE-672, « opération sur une ressource après son expiration ou sa libération », qui couvre aussi les identifiants de session périmés et les descripteurs de fichiers fermés. La même idée, appliquée à d’autres ressources que la mémoire.
Elle n’a pas d’entrée fille : le catalogue considère qu’on ne descend pas plus bas. En revanche, elle appartient à la grande famille mémoire aux côtés de l’écriture hors limites, avec une différence de nature : le débordement se trompe sur la taille d’une zone valide, l’usage après libération se trompe sur la durée de vie d’une zone. Les protections qui gênent le premier (les canaris, la non-exécutabilité des données) ne font presque rien contre le second, et c’est pourquoi les techniques d’exploitation modernes le préfèrent.
Pourquoi elle est si haut
Section intitulée « Pourquoi elle est si haut »Parce que la concurrence multiplie les occasions. Un programme à un seul fil d’exécution peut suivre la durée de vie de ses objets à la relecture. Dès que plusieurs fils partagent des structures, la libération par l’un pendant l’usage par l’autre devient un problème de synchronisation, c’est-à-dire un problème que personne ne résout par la vigilance. Les noyaux de systèmes d’exploitation, les navigateurs et les piles réseau (massivement concurrents) fournissent l’essentiel des vulnérabilités de ce type.
Parce que les navigateurs en publient beaucoup. Les moteurs de rendu et les machines virtuelles JavaScript manipulent des graphes d’objets dont la durée de vie dépend du document affiché, donc de données entièrement contrôlées par l’extérieur. Chaque campagne de recherche sur un moteur produit une série de vulnérabilités de cette classe.
Parce que l’exploitation est fiable. Contrairement à beaucoup de défauts mémoire, celui-ci donne à l’attaquant un contrôle relativement précis sur ce qui occupe la mémoire libérée, ce qui lui permet de construire une chaîne reproductible. La gravité attribuée est donc presque toujours élevée, et le score du classement multiplie fréquence et gravité.
Le mécanisme, et où le site le traite
Section intitulée « Le mécanisme, et où le site le traite »Le site traite les fondations de cette famille : comment un débordement écrase la pile pose ce qu’est une zone mémoire et ce qui se trouve autour, et ASLR, DEP, NX, canaris et CFI explique quelles protections freinent l’exploitation, en notant, précisément, celles qui ne protègent pas de l’usage après libération.
Pour la dimension temporelle, qui est le cœur du problème, exploiter une course TOCTOU montre la même erreur de raisonnement appliquée à des fichiers : vérifier à un instant, agir à un autre, et supposer que rien n’a changé entre les deux.
Et pour la seule solution structurelle, Rust et la sécurité mémoire par construction décrit le mécanisme de propriété qui rend cette classe inexprimable : le compilateur refuse un programme où un emprunt survit à ce qu’il emprunte. C’est la raison principale pour laquelle les noyaux et les navigateurs y migrent leurs composants les plus exposés.
Ce qu’une équipe en fait
Section intitulée « Ce qu’une équipe en fait »Mettre le pointeur à zéro après libération, systématiquement, et transformer en règle de compilation ce qui n’est sinon qu’une bonne intention. Cela ne supprime pas la classe mais change la panne : un déréférencement de pointeur nul plante proprement au lieu d’agir sur la mémoire du voisin.
Confier la durée de vie au langage ou à la bibliothèque : pointeurs intelligents, compteurs de références, conteneurs propriétaires. Le code qui libère à la main est celui qui se trompe.
Faire tourner les analyseurs dynamiques en intégration continue. Les détecteurs d’erreurs mémoire trouvent ces défauts à l’exécution, y compris les cas concurrents que l’analyse statique rate, et c’est l’investissement le plus rentable sur une base de code existante.
- CWE-416: Use After Free, MITRE, liste 4.20 : définition, parents CWE-825 et CWE-672, relations CanPrecede.
- 2025 CWE Top 25, MITRE : rang 7.
🐝 Ce qui arrive si on s’en passe
Section intitulée « 🐝 Ce qui arrive si on s’en passe »Une équipe qui ne suit pas la durée de vie de ses objets produit un logiciel qui fonctionne parfaitement en test et plante en production, à des endroits sans rapport apparent avec le défaut. Le symptôme est mobile : il dépend de ce que le programme a alloué entre-temps, donc de la charge, de l’ordre des requêtes et du nombre de fils actifs. L’équipe passe alors des semaines à chercher un bogue de concurrence dans le module qui plante, lequel est innocent. Le coût suivant est celui de l’exploitation : cette classe de défaut est, avec le débordement de tas, le pilier des chaînes d’attaque contre les navigateurs et les noyaux, parce qu’elle offre à l’attaquant un contrôle précis sur ce qui occupe la mémoire relâchée. Enfin, elle est de celles qui résistent à l’audit : aucune relecture humaine ne garantit qu’aucun chemin d’exécution, sur des centaines de milliers de lignes, ne touche une zone libérée.
🦫 Explication de la marmotte 🍫
Section intitulée « 🦫 Explication de la marmotte 🍫 »Quand un programme a besoin de place en mémoire, il en demande au système, s’en sert, puis la rend. Une fois rendue, cette place est disponible pour n’importe quel autre usage : le système la réattribuera à la première demande suivante, peut-être dans une microseconde, peut-être dans la même seconde, à un autre morceau du même programme.
Pour se souvenir de l’endroit où se trouve sa place, le programme conserve une adresse, appelée pointeur. Le défaut consiste à rendre la place sans effacer l’adresse, puis à s’en servir encore. Le programme écrit alors dans une zone qui appartient désormais à autre chose, ou lit des données qui ne sont plus les siennes. C’est exactement ce qui se passerait si l’on continuait à envoyer son courrier à un appartement qu’on a quitté.
Ce défaut s’appelle CWE-416, « usage après libération ». Il est redoutable pour deux raisons. D’abord, il ne se manifeste pas tout de suite ni toujours au même endroit : tout dépend de ce qui a récupéré la place entre-temps, donc du hasard des circonstances. Un programme peut fonctionner des mois avant de montrer le défaut. Ensuite, quelqu’un qui connaît le défaut peut souvent s’arranger pour que ce soit son contenu qui occupe la place libérée, et obtenir ainsi que le programme exécute ce qu’il a choisi.
Les protections ajoutées aux systèmes contre les autres défauts de mémoire fonctionnent mal contre celui-ci, ce qui en fait l’un des préférés des attaquants qui visent les navigateurs et les systèmes d’exploitation. La seule parade de fond consiste à employer un langage qui refuse de compiler un programme où une adresse survit à la place qu’elle désigne : le compilateur fait alors le travail que la vigilance humaine n’arrive pas à faire sur plusieurs centaines de milliers de lignes.
À lire aussi
- CWE-122 : débordement de tampon dans le tasCWE-122, heap-based buffer overflow : ce que la variante recouvre, pourquoi le tas se prête mieux à l'exploitation que la pile, son lien avec CWE-416, et son rang 16 au Top 25 2025.
- CWE-125 : lecture hors limites, la fuite qui ne casse rienCWE-125, out-of-bounds read : ce que la classe recouvre, ses deux variantes de sur-lecture et de sous-lecture, pourquoi elle fuit plus qu'elle ne plante, et son rang 8 au Top 25 2025.
- CWE-121 : débordement de tampon dans la pileCWE-121, stack-based buffer overflow : ce que la variante recouvre, ce que la pile contient d'intéressant pour un attaquant, la confusion avec l'épuisement de pile CWE-674, et son rang 14 au Top 25 2025.
- CWE-120 : débordement de tampon classique, la copie sans mesureCWE-120, copie de tampon sans vérification de la taille de l'entrée : la cause plutôt que le geste, sa place entre CWE-787 et CWE-20, l'héritage des fonctions non bornées, et son rang 11 au Top 25 2025.
Pages voisines
La citent
CWE-416 : usage après libération, le pointeur qui survit à sa mémoire
Elle cite
- Lien dans les deux sens :CWE Top 25 2025 : les vingt-cinq faiblesses logicielles les plus dangereuses
- CWE-476 : déréférencement de pointeur nul, la panne du cas non prévu
- CWE-787 : écriture hors limites, la tête de la famille mémoire
- ASLR DEP NX canaries et CFI contre les exploits mémoire
- Comment un buffer overflow écrase la pile
- Exploiter une race condition TOCTOU sur fichier privilégié
- Rust et la sécurité mémoire par construction, garanties et limites
: les deux pages se citent l’une l’autre.
