Qu'est-ce qu'un débordement de tampon (buffer overflow) ? Comment fonctionnent ces types d'attaques
Un débordement de tampon (buffer overflow) se produit lorsqu'un programme ou un processus tente d'écrire plus de données dans un bloc de mémoire de longueur fixe, ou tampon, que la capacité allouée à ce tampon. Les tampons contiennent une quantité définie de données ; toute donnée supplémentaire écrasera les valeurs de données dans les adresses mémoire adjacentes au tampon de destination.
Ce type de débordement peut être évité si le programme inclut suffisamment de vérifications de limites pour signaler ou rejeter les données lorsqu'une quantité trop importante est envoyée à un tampon mémoire. Les débordements de tampon font partie des vulnérabilités les plus persistantes et les plus dangereuses dans les logiciels. Ils sont souvent exploités par des pirates pour obtenir un accès non autorisé ou exécuter du code arbitraire.
Qu'est-ce qu'une attaque par débordement de tampon et comment fonctionne-t-elle ?
L'exploitation d'un débordement de tampon permet à un pirate informatique de contrôler ou de bloquer un processus, ou encore de modifier ses variables internes. Le débordement de tampon occupe toujours une place importante dans le classement CWE (Common Weakness Enumeration) et dans le Top 25 des erreurs logicielles les plus dangereuses du SANS. Un débordement de tampon classique est spécifié comme CWE-120 dans le dictionnaire CWE des types de faiblesses. Bien qu'ils soient bien connus, les débordements de tampon continuent de nuire aux logiciels des fournisseurs, petits et grands.
Un débordement de tampon peut se produire de manière involontaire ou être provoqué par un acteur malveillant. Un acteur malveillant peut envoyer une entrée soigneusement conçue, appelée « code arbitraire », à un programme. Le programme tente alors de stocker cette entrée dans un tampon qui n'est pas suffisamment grand pour la contenir. Si les données excédentaires sont ensuite écrites dans la mémoire adjacente, elles écrasent toutes les données qui s'y trouvent déjà.
Les données d'origine dans la mémoire tampon comprennent le pointeur de retour de la fonction exploitée, c'est-à-dire l'adresse vers laquelle le processus doit se diriger ensuite. Cependant, l'attaquant peut définir de nouvelles valeurs pour pointer vers une adresse de son choix. L'attaquant définit généralement les nouvelles valeurs vers un emplacement où se trouve la charge utile de l'exploit. Cette modification altère le chemin d'exécution du processus et transfère le contrôle vers le code malveillant de l'attaquant.
Les attaques modernes par débordement de tampon intègrent souvent des techniques d'obfuscation avancées pour contourner la détection et exploiter les vulnérabilités des systèmes en temps réel.
Types d'attaques par débordement de tampon
Les techniques permettant d'exploiter les vulnérabilités liées aux débordements de tampon varient en fonction du système d'exploitation (OS) et du langage de programmation. Cependant, l'objectif est toujours de manipuler la mémoire d'un ordinateur afin de perturber ou de contrôler l'exécution d'un programme.
Les débordements de tampon sont classés en fonction de l'emplacement du tampon dans la mémoire du processus. Il s'agit principalement de débordements basés sur la pile ou sur le tas. Les deux résident dans la mémoire vive d'un appareil.
Voici quelques types d'attaques par débordement de tampon.
Débordement de tampon basé sur la pile ou attaque par dépassement de tampon de pile
La pile stocke les données selon une structure « dernier entré, premier sorti ». Il s'agit d'un espace continu dans la mémoire utilisé pour organiser les données associées aux appels de fonction, y compris les paramètres de fonction, les variables locales de fonction et les informations de gestion, telles que les pointeurs de trame et d'instruction. Normalement, la pile est vide jusqu'à ce que le programme ciblé nécessite une entrée de l'utilisateur, comme un nom d'utilisateur ou un mot de passe. À ce stade, le programme écrit une adresse mémoire de retour dans la pile, puis l'entrée de l'utilisateur est placée au-dessus. Lorsque la pile est traitée, l'entrée de l'utilisateur est envoyée à l'adresse de retour spécifiée par le programme.
Cependant, une pile a une taille limitée. Le programmeur qui développe le code doit réserver un espace spécifique pour la pile. Si la saisie de l'utilisateur est plus longue que l'espace réservé dans la pile et que le programme ne vérifie pas que la saisie tient dans cet espace, la pile sera saturée. Ce n'est pas un problème majeur, mais cela devient une faille de sécurité importante lorsqu'il s'agit d'une saisie malveillante.
Attaque par débordement de tampon basée sur le tas
Le tas est une structure mémoire utilisée pour gérer la mémoire dynamique. Les programmeurs utilisent souvent le tas pour allouer de la mémoire dont la taille est inconnue au moment de la compilation, lorsque la quantité de mémoire requise est trop importante pour tenir dans la pile ou lorsque la mémoire est destinée à être utilisée dans plusieurs appels de fonction. Les attaques basées sur le tas inondent l'espace mémoire réservé à un programme ou à un processus. Les vulnérabilités basées sur le tas, comme le bug zero-day découvert dans Google Chrome en 2021, sont difficiles à exploiter, elles sont donc plus rares que les attaques de pile.
Attaque par débordement d'entier
La plupart des langages de programmation définissent des tailles maximales pour les entiers. Lorsque ces tailles sont dépassées, le résultat peut provoquer une erreur ou renvoyer un résultat incorrect dans la limite de longueur de l'entier. Une attaque par débordement d'entier peut se produire lorsqu'un entier est utilisé dans une opération arithmétique et que le résultat du calcul est une valeur supérieure à la taille maximale de l'entier. Par exemple, 8 bits de mémoire sont nécessaires pour stocker le nombre 192. Si le processus ajoute 64 à ce nombre, la réponse 256 ne tiendra pas dans la mémoire allouée, car elle nécessite 9 bits.
Attaque par chaînes de format
Les pirates modifient le fonctionnement d'une application en utilisant de manière abusive les fonctions de formatage de chaînes de caractères, telles que printf et sprintf, afin d'accéder à d'autres espaces mémoire et de les manipuler.
Attaques par débordement Unicode
Ces attaques exploitent la mémoire supplémentaire nécessaire pour stocker une chaîne au format Unicode par rapport aux caractères ASCII (American Standard Code for Information Interchange). Elles peuvent être utilisées contre des programmes qui s'attendent à ce que toutes les entrées soient des caractères ASCII.
Exemples concrets d'attaques par débordement de tampon
Les attaques par débordement de tampon ont été au cœur de certains des incidents de cybersécurité les plus médiatisés :
- Le ver Morris (1988) : l'un des premiers vers Internet, il exploitait les vulnérabilités de débordement de tampon dans les systèmes Unix, provoquant des perturbations à grande échelle.
- Heartbleed (2014) : bien qu'il s'agisse principalement d'un bug de divulgation de mémoire, Heartbleed dans OpenSSL exploitait les limites de mémoire, permettant aux pirates de lire des données sensibles.
- Le ransomware WannaCry (2017) : il a exploité EternalBlue, un exploit de type « buffer overflow » ciblant les systèmes Windows, pour se propager rapidement à travers les réseaux.
Ces exemples soulignent l'importance des mesures proactives visant à détecter et à atténuer les vulnérabilités liées au débordement de tampon.
Comment prévenir les attaques par débordement de tampon
Il existe plusieurs moyens de prévenir les attaques par débordement de tampon, notamment les cinq suivants :
- Utilisez les protections d'exécution du système d'exploitation. La plupart des systèmes d'exploitation utilisent des protections d'exécution, telles que celles décrites ci-dessous, afin de rendre plus difficiles les attaques par débordement de tampon :
- Randomisation de la disposition de l'espace d'adressage. L'ASLR organise de manière aléatoire les positions de l'espace d'adressage des zones de données clés d'un processus. Cela inclut la base de l'exécutable et les positions de la pile, du tas et des bibliothèques. Cette approche rend difficile pour un attaquant d'accéder de manière fiable à une fonction particulière dans la mémoire. Prévention de l'exécution des données. La DEP marque les zones de mémoire comme exécutables ou non exécutables. Cela empêche un attaquant d'exécuter des instructions écrites dans une zone de données à l'aide d'un débordement de tampon. Protection contre le remplacement de la gestion structurée des exceptions. La SEHOP est conçue pour bloquer les attaques qui utilisent la technique de remplacement de la gestion structurée des exceptions, qui implique l'utilisation d'un débordement de tampon basé sur la pile.
- Randomisation de la disposition de l'espace d'adressage. L'ASLR organise de manière aléatoire les positions de l'espace d'adressage des zones de données clés d'un processus. Cela inclut la base de l'exécutable et les positions de la pile, du tas et des bibliothèques. Cette approche rend difficile pour un attaquant d'accéder de manière fiable à une fonction particulière dans la mémoire.
- Prévention de l'exécution des données. La DEP marque les zones de mémoire comme exécutables ou non exécutables. Cela empêche un pirate d'exécuter des instructions écrites dans une zone de données à l'aide d'un débordement de tampon.
- Protection contre le remplacement de la gestion structurée des exceptions. SEHOP est conçu pour bloquer les attaques qui utilisent la technique de remplacement de la gestion structurée des exceptions, qui implique l'utilisation d'un débordement de tampon basé sur la pile.
- Maintenez vos appareils à jour. Les fournisseurs publient des correctifs et des mises à jour logicielles pour corriger les vulnérabilités de type « buffer overflow » qui ont été découvertes. Il existe toutefois une période de risque entre la découverte de la vulnérabilité et la création et le déploiement du correctif.
- Suivez le principe du moindre privilège (POLP). Les utilisateurs et les applications ne doivent disposer que des autorisations nécessaires à l'exécution de leurs tâches ou des missions qui leur sont assignées. L'application du principe POLP réduit le risque d'attaque par débordement de tampon. Dans l'exemple d'attaque par débordement de pile ci-dessus, la fenêtre d'invite de commande qui a été ouverte s'exécute avec le même ensemble d'autorisations que l'application qui a été compromise ; moins elle dispose de privilèges, moins l'attaquant en aura. Dans la mesure du possible, n'accordez que des privilèges temporaires aux utilisateurs et aux applications, et supprimez-les une fois la tâche terminée.
- Utilisez des langages de programmation sécurisés pour la mémoire. La raison la plus courante pour laquelle les attaques par débordement de tampon fonctionnent est que les applications ne parviennent pas à gérer les allocations de mémoire et à valider les entrées provenant du client ou d'autres processus. Les applications développées en C ou C++ doivent éviter les fonctions dangereuses de la bibliothèque standard qui ne sont pas vérifiées, telles que gets, scanf et strcpy. Elles doivent plutôt utiliser des bibliothèques ou des classes conçues pour effectuer en toute sécurité des opérations sur les chaînes de caractères et d'autres opérations mémoire. Mieux encore, utilisez un langage de programmation qui réduit les risques de débordement de tampon, tel que Java, Python ou C#.
- Valider les données. Les applications mobiles et Web développées en interne doivent toujours valider les entrées utilisateur et les données provenant de sources non fiables afin de s'assurer qu'elles correspondent aux attentes et d'éviter les valeurs d'entrée trop longues. Toute politique de sécurité des applications doit exiger des tests de vulnérabilité pour détecter les éventuelles vulnérabilités liées à la validation des entrées et au débordement de tampon avant le déploiement.
Les organisations doivent connaître les principaux signes des incidents de sécurité courants et savoir comment réagir pour assurer la sécurité des systèmes et des données. Découvrez les différents types d'incidents de sécurité et comment les prévenir.
