Il s'agit d'un type d'exploit très spécifique qui affecte tous les types de logiciels.
Use-After-Free (UAF) est une vulnérabilité de corruption de mémoire primitive qui continue de 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 de l'application tente d'accéder aux données d'une adresse mémoire qui a déjà été libérée, d'où le nom — use-after-free.
Les vulnérabilités UAF peuvent conduire à une exploitation potentielle de logiciels ou même à une compromission du 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 plonger dans la vulnérabilité Use-After-Free, prenons un peu de recul et comprenons quelques bases 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 de gestion de la manière de stocker (appelée allocation de mémoire) et de supprimer (appelée désallocation de mémoire) les données et le code dans la mémoire de manière optimale. Les deux segments de mémoire principaux où les données du programme sont stockées sont la pile et le tas.
Les programmes peuvent se voir allouer de l'espace mémoire statiquement sur la pile et dynamiquement sur le tas. Une vulnérabilité d'utilisation après libération se produit lorsque les programmeurs ne gèrent pas correctement l'allocation et la désallocation dynamiques de mémoire dans leurs programmes. Cela signifie que la classe de vulnérabilités UAF est un type d'exploitation de tas. Pour mieux comprendre cette vulnérabilité, il est utile de bien comprendre comment fonctionnent les pointeurs en programmation.
Use-After-Free (UAF) comme son nom l'indique, est un type de vulnérabilité de corruption de mémoire primitive qui se produit lorsqu'un objet qui a déjà été désalloué de la mémoire est à nouveau accessible, ce qui entraîne des plantages ou des conséquences inattendues telles que des fuites de mémoire, une escalade de privilèges (EOP) ou du code arbitraire exécution. Apprenons comment cette condition se produit en premier lieu et comment est-elle exploitée.
Comment l'utilisation après libération (UAF) est-elle exploitée?
Use-After-Free (UAF), comme son nom l'indique, est une vulnérabilité de corruption de mémoire primitive qui se produit lorsqu'un programme continue d'accéder aux emplacements de mémoire qu'il a libérés. Prenons un exemple de code :
#inclure <stdio.h>
#inclure <stdlib.h>
entierprincipal(){
entier *MUO = malloc (sizeof(entier));
*MUO = 69420 ;
printf("Valeur: %d\n", *MUO);
gratuit (MUO);
printf("Valeur? : %d\n", *MUO);
retour0;
}
Pourrait repérer la vulnérabilité? Comme vous pouvez le voir, dans ce code, le MOU le pointeur est désalloué de la mémoire à l'aide de la gratuit() fonction, mais elle est rappelée à la ligne suivante à l'aide de la printf() fonction. Cela entraîne 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 élévation des privilèges et des fuites de mémoire.
Comment atténuer l'utilisation après la libération?
UAF se produit en raison d'erreurs dans la programmation d'une application. Vous pouvez prendre quelques précautions 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 de corruption de mémoire dans votre logiciel :
- Utilisation de langages de programmation sécurisés pour la mémoire comme Rust avec des mécanismes intégrés pour empêcher 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 susceptible 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 considérer apprendre la rouille si vous créez des programmes de bas niveau.
- Outre l'utilisation d'un langage sécurisé en mémoire, il est recommandé de suivre les meilleures pratiques telles que la définition d'un pointeur sur la valeur NULL après sa libération pour éviter toute introduction de la vulnérabilité Use-After-Free.
- Vous pouvez également implémenter des techniques telles que l'allocation unique (OTA) qui empêchent les attaquants d'accéder à la mémoire libérée objets et une politique stricte de cycle de vie des objets, qui aide à garder une trace de chaque objet mémoire qui est alloué et désaffecté. Gardez cependant à l'esprit que ces implémentations peuvent augmenter la surcharge de mémoire et de performances.
Exemples concrets de vulnérabilité d'utilisation après libération (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 quotidiennes. Cela montre la nécessité de mesures de sécurité proactives. Voici quelques exemples concrets d'UAF :
- Navigateurs Internet: les vulnérabilités UAF des navigateurs Web ont été exploitées pour exécuter du code arbitraire, compromettre la confidentialité des utilisateurs et exécuter des attaques d'exécution de code à distance. Un exemple récent serait CVE-2021-38008, qui exploitait une vulnérabilité UAF dans Google Chrome, permettant aux pirates d'exécuter du code arbitraire à distance sur la machine victime.
- Systèmes d'exploitation: les vulnérabilités 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 de gagner en persistance. Il existe une pléthore de vulnérabilités UAF qui ont été trouvées et se trouvent encore dans les noyaux des systèmes d'exploitation à ce jour. Au moment d'écrire ces lignes, CVE-2023-3269, une autre vulnérabilité UAF dans le noyau Linux conduisant à une élévation 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 programme comportement, conduisant à la divulgation d'informations, à l'exécution de code arbitraire, au plantage du programme et, dans le pire des cas, au privilège escalade. Plusieurs applications logicielles ont été et sont toujours sensibles aux attaques 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 dangereuses.
Pour en savoir plus sur les vulnérabilités Use-After-Free dans les applications du monde réel, vous pouvez consulter le officiel MITRE CVE page de liste et trier par mot-clé Use-After-Free.
Une allocation de mémoire efficace permet de sécuriser le logiciel
Une allocation de mémoire optimale et bien pensée contribue grandement à protéger vos applications contre les vulnérabilités courantes de corruption de mémoire primitive.
UAF avec Time Of Check Time of Use (TOCTOU), conditions de concurrence et Buffer Overflows (BOF) sont quelques-unes des vulnérabilités de mémoire les plus couramment exploitées. Tout cela peut être évité en apprenant comment la mémoire de votre programme est gérée par la plate-forme sur laquelle il s'exécute. Cela vous donne une idée claire de la façon dont le système d'exploitation alloue votre programme dans la mémoire et vous fournit les outils nécessaires pour concevoir des logiciels pour des performances et une sécurité optimales.
Si vous ne l'avez pas déjà fait, vous pouvez commencer par comprendre comment la gestion de la mémoire est effectuée sur Linux, le système d'exploitation serveur le plus utilisé au monde.