Qu’est-ce qu’une vulnérabilité de type Use-After-Free (UAF) ?
Use-After-Free (UAF) est une vulnérabilité primitive de corruption de la mémoire qui continue à représenter une menace importante pour tous les types de logiciels, des systèmes d’exploitation aux logiciels d’application. Cette faille de sécurité critique se produit lorsqu’un composant d’application tente d’accéder à des données dans une adresse mémoire qui a déjà été libérée, d’où son nom : use-after-free (utilisation après libération).
Les vulnérabilités UAF peuvent conduire à l’exploitation potentielle d’un logiciel ou même à la compromission d’un système. Voici ce qu’est la vulnérabilité UAF, pourquoi elle se produit et comment vous pouvez sécuriser votre logiciel contre une vulnérabilité UAF.
Qu’est-ce que la vulnérabilité Use-After-Free (UAF) ?
Avant de nous pencher sur la vulnérabilité Use-After-Free, prenons un peu de recul et comprenons quelques principes de base de la gestion de la mémoire. Lorsqu’un programme est exécuté, ses données et son code sont chargés dans la mémoire.
La gestion de la mémoire est le processus qui consiste à gérer le stockage (appelé allocation de mémoire) et le retrait (appelé désallocation de mémoire) des données et du code dans la mémoire de manière optimale. Les deux principaux segments de la mémoire où les données du programme sont stockées sont la pile et le tas.
Les programmes peuvent se voir allouer un espace mémoire de manière statique sur la pile et de manière dynamique sur le tas. Une vulnérabilité de type « use-after-free » se produit lorsque les programmeurs ne gèrent pas correctement l’allocation et la désallocation de la mémoire dynamique dans leurs programmes. Cela signifie que la classe de vulnérabilités UAF est un type d’exploitation du tas. Pour mieux comprendre cette vulnérabilité, il est utile d’avoir une bonne compréhension du fonctionnement des pointeurs en programmation.
Use-After-Free (UAF), comme son nom l’indique, est un type de vulnérabilité primitive de corruption de la mémoire qui se produit lorsqu’un objet qui a déjà été désalloué de la mémoire est accédé à nouveau, ce qui entraîne des plantages ou des conséquences involontaires telles que des fuites de mémoire, une escalade des privilèges (EOP) ou l’exécution de code arbitraire. Découvrons comment cette condition se produit en premier lieu et comment elle est exploitée.
Comment le Use-After-Free (UAF) est-il exploité ?
Use-After-Free (UAF), comme son nom l’indique, est une vulnérabilité primitive de corruption de mémoire qui se produit lorsqu’un programme continue d’accéder à des emplacements de mémoire qu’il a libérés. Examinons un exemple de code :
Pouvez-vous repérer la vulnérabilité ? Comme vous pouvez le voir, dans ce code, l’élément MUO est désalloué de la mémoire à l’aide de la fonction free() mais elle est à nouveau appelée à la ligne suivante à l’aide de la fonction printf() de l’ordinateur. Il en résulte un comportement inattendu du programme et, selon l’endroit où la vulnérabilité est présente dans le logiciel, elle peut être exploitée pour obtenir une escalade des privilèges et des fuites de mémoire.
Comment atténuer la vulnérabilité Use-After-Free ?
L’UAF se produit en raison d’erreurs dans la programmation d’une application. Il existe quelques précautions à prendre pour éviter les vulnérabilités Use-After-Free dans votre logiciel.
Voici quelques bonnes pratiques que vous pouvez adopter pour minimiser les vulnérabilités liées à la corruption de la mémoire dans votre logiciel :
- Utiliser des langages de programmation sûrs pour la mémoire comme Rust avec des mécanismes intégrés pour prévenir les vulnérabilités primitives de corruption de la mémoire comme UAF, Buffer Overflows, etc. Si vous utilisez des langages de programmation comme C/C++, vous êtes plus susceptibles d’introduire des bogues de mémoire dans votre code. Pour la même raison, même les systèmes d’exploitation comme Windows et Linux migrent lentement vers Rust. Vous devriez également envisager de vous familiariser avec Rust si vous créez des programmes de bas niveau.
- Outre l’utilisation d’un langage sûr pour la mémoire, il est recommandé de suivre les meilleures pratiques, telles que la définition d’un pointeur à la valeur NULL après sa libération, afin d’éviter l’introduction d’une vulnérabilité de type Use-After-Free (utilisation après la libération).
- Vous pouvez également mettre en œuvre des techniques telles que l’allocation unique (OTA), qui empêche les attaquants d’accéder aux objets de mémoire libérés, et une politique stricte de cycle de vie des objets, qui permet de garder une trace de chaque objet de mémoire alloué et désalloué. Gardez à l’esprit que ces implémentations peuvent augmenter la mémoire et les performances.
Exemples réels de la vulnérabilité Use-After-Free (UAF)
La vulnérabilité Use-After-Free (UAF) a été découverte et exploitée dans divers scénarios du monde réel, des navigateurs web au noyau Android en passant par les applications de tous les jours. Cela démontre la nécessité de prendre des mesures de sécurité proactives. Voici quelques exemples concrets d’UAF :
- Navigateurs Internet : Les vulnérabilités de l’UAF dans les navigateurs web ont été exploitées pour exécuter du code arbitraire, compromettre la vie privée de l’utilisateur et exécuter des attaques par exécution de code à distance. Un exemple récent est la CVE-2021-38008, qui exploite une vulnérabilité UAF dans Google Chrome, permettant aux acteurs de la menace d’exécuter du code arbitraire à distance sur la machine de la victime.
- Systèmes d’exploitation : Les vulnérabilités de l’UAF trouvées dans les noyaux Windows/Linux/Android ont permis aux attaquants d’obtenir des privilèges élevés, de contourner les mécanismes de sécurité et d’obtenir la persistance. Il existe une pléthore de vulnérabilités UAF qui ont été trouvées et sont encore trouvées dans les noyaux des systèmes d’exploitation à ce jour. À l’heure où nous écrivons ces lignes, CVE-2023-3269, une autre vulnérabilité UAF dans le noyau Linux conduisant à une escalade des privilèges, a été rendue publique. CVE-2022-23270 est un exemple de vulnérabilité UAF dans le noyau Windows.
- Applications logicielles : Les vulnérabilités UAF dans les applications logicielles ont été exploitées pour manipuler le comportement du programme, ce qui a conduit à la divulgation d’informations, à l’exécution de codes arbitraires, au blocage du programme et, dans le pire des cas, à l’élévation des privilèges. De nombreuses applications logicielles ont été et sont encore sensibles aux attaques de l’UAF. Ces logiciels sont principalement des programmes C/C++ qui ont été développés avec des approches de gestion de la mémoire inefficaces et peu sûres.
Pour en savoir plus sur les vulnérabilités Use-After-Free dans les applications du monde réel, vous pouvez consulter le site suivant CVE officiel de MITRE et trier par mot-clé Use-After-Free.
L’allocation efficace de la mémoire contribue à la sécurité des logiciels
Une allocation de mémoire optimale et bien pensée contribue grandement à protéger vos applications contre les vulnérabilités les plus courantes en matière de corruption de mémoire primitive.
L’UAF ainsi que le Time Of Check Time of Use (TOCTOU), les conditions de course et les Buffer Overflows (BOF) sont quelques-unes des vulnérabilités de mémoire les plus couramment exploitées. Toutes ces vulnérabilités peuvent être évitées en apprenant comment la mémoire de votre programme est gérée par la plateforme sur laquelle il s’exécute. Vous saurez ainsi comment le système d’exploitation alloue votre programme dans la mémoire et vous disposerez des outils nécessaires pour concevoir des logiciels offrant des performances et une sécurité optimales.
Si vous ne l’avez pas encore fait, vous pouvez commencer par comprendre comment la gestion de la mémoire se fait sous Linux, le système d’exploitation serveur le plus utilisé au monde.
Quel est l’exemple d’une vulnérabilité de type « use after free » ?
Par exemple, si le bloc mémoire qui contenait initialement un message de bienvenue à afficher dans le menu principal a été réalloué de sorte qu’il contient désormais le nom d’utilisateur et le mot de passe de l’utilisateur, ce mot de passe s’afficherait dans le menu principal à la place du message de bienvenue si le pointeur était accidentellement réutilisé.
Qu’est-ce que l’utilisation après la vulnérabilité ?
Qu’est-ce qu’une vulnérabilité de type « use after free » ? Use after free (UAF) est un type de bogue qui peut être exploité dans les langages de programmation qui ne sont pas sûrs pour la mémoire. En C++, un développeur est responsable de l’allocation (et de la désallocation) de la mémoire sur la pile ou le tas.
Qu’est-ce que use after free Owasp ?
Les erreurs d’utilisation après libération se produisent lorsqu’un programme continue d’utiliser un pointeur après qu’il a été libéré. Comme les erreurs de double libération et les fuites de mémoire, les erreurs d’utilisation après libération ont deux causes communes qui se chevauchent parfois : Les conditions d’erreur et d’autres circonstances exceptionnelles.
Qu’est-ce que l’utilisation après libération du tas ?
Le terme « use after free » est souvent utilisé dans les vulnérabilités liées au tas. La vulnérabilité use-after-free exploite une erreur commise par l’auteur original d’un logiciel et peut avoir des effets dévastateurs allant de l’exécution de code à distance à la fuite de données sensibles.