Explication des vulnérabilités et des attaques par débordement de tampon
Le terme « tampon » est un terme générique qui fait référence à un endroit où stocker ou conserver temporairement quelque chose avant de l'utiliser, afin d'atténuer les différences entre la vitesse d'entrée et la vitesse de sortie. En programmation informatique, les données peuvent être placées dans un tampon logiciel avant d'être traitées. Un tampon logiciel n'est qu'une zone de mémoire physique (RAM) avec une capacité spécifiée pour stocker les données allouées par le programmeur ou le programme. Les données sont temporairement stockées jusqu'à ce que l'ordinateur soit prêt à les accepter ou avant d'être déplacées vers un autre emplacement.
Les tampons sont utiles lorsqu'il existe une différence entre les données de débit reçues et le débit auquel elles sont traitées. Voici quelques exemples de mise en mémoire tampon que nous constatons dans la vie de tous les jours :
- Lorsque vous diffusez un film depuis Internet, par exemple, une partie du film que vous diffusez est téléchargée vers un emplacement mémoire (tampon) de votre appareil pour vous aider à garder une longueur d'avance sur votre visionnage. Des retards de « mise en mémoire tampon » se produisent lorsque les données vidéo sont traitées plus rapidement qu'elles ne sont reçues.
- Le clavier de votre smartphone dispose d'un tampon utilisé pour conserver les frappes avant qu'elles ne soient traitées. Vous l'avez peut-être vu en action sans vous en rendre compte. La plupart d’entre nous ont vécu une situation où nous tapions quelque chose sur un clavier et n’obtenions aucune réponse. Puis, tout d’un coup, un texte éclate instantanément sur l’écran. Toutes les frappes étaient conservées dans le tampon et, lorsque le système s'est dégelé, elles ont toutes été libérées du tampon.
- Le tampon de votre imprimante est utilisé pour la mise en file d'attente, ce qui signifie simplement que le texte à imprimer est envoyé vers une zone tampon ou une bobine afin qu'il puisse être imprimé à partir de là. Cela libère l'ordinateur pour qu'il puisse s'occuper d'autres choses.
L'exemple de mise en mémoire tampon vidéo montre ce qui se passe lorsque les données sont traitées plus rapidement qu'elles ne sont reçues. Mais parfois, c’est l’inverse qui se produit : la quantité de données reçues est supérieure à la capacité tampon attribuée. Le débordement de données supplémentaire provoque le gel, le dysfonctionnement ou même le crash du programme. C’est ce que les informaticiens appellent communément un buffer overflow ou un buffer overrun. Dans cet article, nous expliquerons en détail les vulnérabilités et les attaques par débordement de tampon. Plus précisément, nous couvrirons les domaines suivants :
- Qu’est-ce que le débordement de tampon ?
- Vulnérabilités et attaques par débordement de tampon
- Exemples notables d'attaques par débordement de tampon
- Comment détecter un débordement de tampon
- Comment prévenir et atténuer le débordement de tampon
Qu’est-ce que le débordement de tampon ?
Un débordement de tampon, comme son nom l'indique, est une anomalie dans laquelle un programme informatique, tout en écrivant des données dans un tampon, dépasse sa capacité ou les limites du tampon, puis fait irruption dans les limites d'autres tampons et corrompt ou écrase les données légitimes présentes. Imaginez un récipient conçu pour contenir huit litres de liquide, mais tout d’un coup, plus de 10 litres y sont versés. Oui, vous l'avez bien deviné ! N’ayant pas assez d’espace pour contenir le liquide supplémentaire, le contenu déborde des limites du récipient. Le débordement de tampon est en principe similaire à ce concept.
Par exemple, imaginons que Joe ait écrit une application Web qui oblige les utilisateurs à saisir leur nom d'utilisateur lorsqu'ils souhaitent accéder à l'application. Lors du développement de l'application Web, Joe alloue une capacité tampon de 8 octets pour le stockage du nom d'utilisateur saisi par les utilisateurs. Après tout, il ne s’attend pas à ce que quiconque saisisse un nom d’utilisateur de plus de 8 caractères. Désormais, un utilisateur nommé Jane a décidé de saisir 10 chaînes répétées de la lettre « J » au lieu du nom d'utilisateur Jane. À sa grande surprise, l'application Web se bloque et refuse d'accepter de nouvelles connexions de la part de tous les autres utilisateurs, entraînant un déni de service.

Le scénario décrit ci-dessus est un débordement de tampon typique. Le nom d'utilisateur à 10 caractères saisi par Jane a dépassé ses limites et a été copié sur tous les autres tampons environnants dans la fonction vulnérable, ce qui a provoqué un mauvais comportement de l'application. Cela peut être exploité pour exécuter du code arbitraire sur l'application Web.
En saisissant des données conçues pour provoquer un débordement de tampon, il est possible d'écrire dans des zones connues pour contenir du code exécutable et de le remplacer par du code malveillant ; ou pour écraser sélectivement les données relatives à l'état du programme, provoquant ainsi un comportement qui n'était pas prévu par le programmeur d'origine. Ces données écrasées peuvent également altérer le fonctionnement normal de l'application en lui faisant effectuer des activités non autorisées, entraînant un comportement erratique du programme tel que des erreurs d'accès à la mémoire, des résultats incorrects ou même des plantages. Ceci est communément appelé attaque par débordement de tampon . L’exploitation du comportement d’un débordement de tampon est un exploit de sécurité bien connu. Un exemple courant est celui où les cybercriminels exploitent le débordement de tampon pour modifier le chemin d’exécution des applications.
Vulnérabilités et attaques par débordement de tampon
Le problème de dépassement de tampon est l’un des problèmes les plus anciens et les plus courants dans le développement de logiciels, remontant à l’introduction de l’informatique interactive. Certains langages de programmation tels que C et C++ sont vulnérables au débordement de mémoire tampon, car ils ne contiennent aucune vérification de limites intégrée ni protection contre l'accès ou l'écrasement des données dans leur mémoire. Des langages de haut niveau plus modernes tels que Java , Python , et C# ont des fonctionnalités intégrées qui aident à réduire les risques de débordement de mémoire tampon, mais ne peuvent pas l'éliminer complètement.
De nombreuses cyberattaques exploitent les vulnérabilités de débordement de mémoire tampon pour compromettre ou prendre le contrôle des applications ou des systèmes cibles. Les attaquants exploitent les problèmes de dépassement de tampon en tentant d'écraser la mémoire d'une application afin de modifier le chemin d'exécution du programme, déclenchant ainsi une réponse exposant des données privées. Si les attaquants connaissent la disposition de la mémoire d'un programme, ils peuvent intentionnellement envoyer de nouvelles instructions à l'application en injectant du code supplémentaire pour obtenir un accès non autorisé à l'application.
Les attaques par débordement de mémoire tampon se présentent sous différentes formes et emploient différentes tactiques pour cibler les applications vulnérables. Les deux tactiques d’attaque les plus courantes sont :
- Attaque par débordement de pile : un débordement de tampon basé sur la pile se produit lorsqu'un programme écrit plus de données dans un tampon situé sur la pile que ce qui est réellement alloué à ce tampon. Cela entraîne presque toujours la corruption des données adjacentes sur la pile. Il s’agit du type d’attaque par débordement de tampon le plus courant.
- Attaque par débordement de tas : un débordement de tampon basé sur le tas est l'endroit où le tampon, à écraser, se voit allouer une grande partie de mémoire supplémentaire. L'exploitation est effectuée en corrompant les données stockées de manière à ce que l'application écrase les structures internes. Ce type d'attaque cible les données du pool de mémoire ouvert appelé tas.
Exemples notables d'attaques par débordement de tampon
Le fait que le débordement de tampon continue de figurer parmi les vulnérabilités de sécurité les plus courantes dans les logiciels, bien qu'il soit connu de la communauté de la sécurité depuis de nombreuses années, est quelque peu surprenant. Les attaques par débordement de tampon ont été responsables de certains des les plus grandes violations de données de l’histoire. Voici quelques exemples notables :
Ver Morris : Le ver Morris de 1988 a été l’un des premiers vers informatiques distribués sur Internet et le premier à attirer l’attention des médias grand public. Il exploitait une vulnérabilité de débordement de tampon dans les systèmes Unix sendmail, finger et rsh /rexec, infectant 10 % d’Internet en deux jours. L'exploitation du ver Morris a infecté plus de 60 000 machines entre 1988 et 1990. Il a parfois été surnommé le « Grand Ver » ou le « Grand Daddy » en matière de débordements de tampon, en raison de l'impact dévastateur qu'il a eu sur Internet à l'heure actuelle. à cette époque, à la fois en termes de temps d'arrêt global du système et d'impact psychologique sur la perception de la sécurité et de la fiabilité d'Internet.
Slameur SQL : SQL Slammer est un ver informatique de 2003 qui exploitait un bug de dépassement de tampon dans les produits de base de données SQL Server et Desktop Engine de Microsoft. Il s'agit d'un petit morceau de code qui ne fait rien d'autre que générer des adresses IP aléatoires et s'envoyer à ces adresses. Si une adresse sélectionnée appartient à un hôte qui exécute une copie non corrigée du service de résolution Microsoft SQL Server écoutant sur le port UDP 1434, l'hôte est immédiatement infecté et commence à diffuser sur Internet davantage de copies du programme de ver. Un correctif était disponible auprès de Microsoft six mois avant le lancement du ver, mais de nombreuses installations n'avaient pas été corrigées. SQL Slammer a provoqué un déni de service sur certains hôtes Internet, FAI et distributeurs automatiques et a considérablement ralenti le trafic Internet général. Il s'est propagé rapidement, infectant 90 % des hôtes vulnérables (environ 75 000 victimes) en 10 minutes, selon Silicon Defence.
Saignement de cœur : Heartbleed est un bug de sécurité largement médiatisé dans OpenSSL qui a été révélé en 2014. Il exploitait une vulnérabilité de surcharge de tampon dans la bibliothèque de cryptographie OpenSSL utilisée pour la mise en œuvre du protocole Transport Layer Security (TLS). La cause première est exactement la même que celle du débordement de tampon : manque de vérification des limites. Bien qu'il soit difficile d'évaluer le coût total de Heartbleed, plusieurs attaques et violations de données, notamment de produits VPN, au cours de cette période, étaient liées à Heartbleed. Les experts estiment que près des deux tiers des sites Web compatibles https dans le monde, soit des millions de sites, ont été touchés. eWEEK a estimé comme point de départ 500 millions de dollars de dommages. La vulnérabilité est résolue en mettant à jour OpenSSL vers une version corrigée.
Adobe Flash Player: En 2016, une vulnérabilité de dépassement de tampon a été découverte dans Adobe Flash Player pour Windows, macOS, Linux et Chrome OS. La vulnérabilité était due à une erreur dans Adobe Flash Player lors de l'analyse d'un fichier SWF (Shockwave Flash) spécialement conçu. Des entités malveillantes pourraient exploiter ces vulnérabilités pour contourner les restrictions de sécurité, exécuter du code arbitraire et obtenir des informations sensibles en incitant les utilisateurs à ouvrir les fichiers SWF ou les documents Office contenant du contenu Flash Player malveillant intégré distribué par courrier électronique. Adobe a répondu en publiant des mises à jour de sécurité qui ont résolu et résolu les problèmes.
VoIP WhatsApp : En mai 2019, Facebook a annoncé une vulnérabilité associée à tous ses produits WhatsApp. La vulnérabilité exploitait une faiblesse de débordement de tampon dans la pile VOIP de WhatsApp sur les smartphones. Cela permet l'exécution de code à distance via une série spécialement conçue de paquets SRTP (protocole de transport sécurisé en temps réel) envoyés à un numéro de téléphone cible. Un exploit de cette vulnérabilité a été utilisé pour infecter plus de 1 400 smartphones avec des logiciels malveillants en appelant simplement le téléphone cible via Whatsapp, même si l’appel n’a pas été pris. En particulier, l'infection par un logiciel espion du téléphone d'un avocat basé au Royaume-Uni impliqué dans un procès très médiatisé a suscité beaucoup d'attention médiatique. Facebook a répondu en publiant des mises à jour de sécurité qui ont résolu les problèmes de débordement de mémoire tampon.
Comment détecter un débordement de tampon
La principale raison pour laquelle un dépassement de tampon se produit est que les développeurs de logiciels ne parviennent pas à vérifier les limites. Les programmeurs doivent accorder une attention particulière aux sections de codes dans lesquelles des tampons sont utilisés, en particulier aux fonctions traitant des entrées fournies par l'utilisateur. Considérez les lignes de codes suivantes :
variable $nom d'utilisateur [8]
imprimer « Entrez le nom d'utilisateur : »
getstring ($nom d'utilisateur)
Le programme ci-dessus affiche (imprime) « Entrez le nom d'utilisateur : » à l'écran, accepte la saisie « Nom d'utilisateur » (définie sur une longueur de 8 octets ou caractères) des utilisateurs, puis la stocke dans la variable $username. Il ressort clairement du code ci-dessus qu’aucune vérification des limites n’est effectuée. La variable $ déclarée par le programmeur fait 8 octets de long, mais n'effectue pas de vérification des limites sur la fonction getstring(), ce qui la rend vulnérable aux attaques par débordement de tampon. Le programmeur suppose que l'utilisateur tape un nom propre tel que « Jones ». Mais que se passe-t-il si l'utilisateur saisit quelque chose comme « JonesXXXXXXXXXXXXXXXXXXXXXXXX » ? Le programme plantera probablement, plutôt que de demander à l'utilisateur une entrée valide. Malheureusement, comme indiqué précédemment, les langages de programmation tels que C/C++ ne fournissent aucune vérification de limites intégrée. Les 8 premiers octets seront copiés dans la mémoire allouée à la variable $username. Le reste des caractères écrasera les 20 prochains octets de mémoire. C'est ce qu'on appelle briser la pile.
Afin de détecter les débordements de tampon dans le code source, il est important que vous compreniez en premier lieu le fonctionnement du code. Deuxièmement, vous devez prêter une attention particulière aux entrées externes, aux manipulations de tampon et aux fonctions susceptibles de déborder de tampon, en particulier les fonctions gets(), strcpy(), strcat() et printf(). Ces fonctions, si elles ne sont pas appliquées avec soin, peuvent potentiellement ouvrir la porte à des attaques par débordement de mémoire tampon.
Évaluation de la vulnérabilité et tests de logiciels des méthodologies peuvent être utilisées pour détecter les erreurs de dépassement de tampon dans ces fonctions et d’autres parties du code source. Il existe deux approches principales disponibles en matière de tests logiciels : les tests statiques et dynamiques. Les révisions de code, les relectures ou les inspections sont appelées tests statiques. Cependant, parcourir manuellement des milliers de lignes de code source à la recherche d’erreurs potentielles de dépassement de tampon peut s’avérer une tâche herculéenne. En outre, il est toujours possible de passer à côté d’erreurs critiques du fait d’un oubli. Heureusement, outils de test d'applications statiques tels que Checkmarx, Coverity et d'autres vérifient automatiquement les bogues de dépassement de tampon en analysant le code source d'un programme cible, sans exécuter le programme.
L'exécution de codes avec un ensemble donné de cas de test (manuels ou automatisés) est appelée test dynamique. Outils de test d'applications dynamiques tels qu'Appknox, Veracode Dynamic Analysis ou Invicti exécutent automatiquement le programme cible et vérifient si le comportement d'exécution du programme satisfait à certaines caractéristiques de sécurité attendues. Ces outils peuvent être utilisés pour la détection de vulnérabilités de débordement de tampon pendant et/ou après le développement, et pour le respect de la qualité de code attendue (assurance qualité).
Comment atténuer et empêcher le débordement de tampon
Il existe plusieurs approches différentes pour atténuer et prévenir les débordements de tampon. Ils incluent une formation des développeurs de logiciels sur le codage sécurisé, l'application de pratiques de codage sécurisées, l'utilisation de fonctions de gestion sécurisée des tampons, la révision du code, l'analyse statique du code source, la détection des dépassements de tampon au moment de l'exécution et l'arrêt des exploits via le système d'exploitation. Chaque approche a ses limites et ses contraintes. Par exemple, les révisions de code, aussi approfondies soient-elles, peuvent manquer des bogues. C'est là que l'analyse statique entre en jeu, cependant, l'analyse statique peut parfois entraîner des faux positifs ou des faux négatifs, ou les deux. Les tests dynamiques, en revanche, signalent les problèmes observés lors de l'exécution ; mais cela nécessite également la sélection des entrées de test et l'exécution du programme, ce qui peut être difficile et long.
Le moyen le plus simple d’éviter les vulnérabilités de débordement de mémoire tampon consiste simplement à éviter les langages de programmation qui y sont sujets. Des langages tels que C/C++ autorisent ces vulnérabilités grâce à un accès direct à la mémoire et à un manque de vérification des limites intégrée. Les langages tels que Java, Python, C#, .NET, entre autres, ne partagent pas ces caractéristiques et sont donc beaucoup moins sensibles aux débordements de tampon. Cependant, en réalité, il n’est pas toujours possible de passer à un langage de programmation complètement différent. Lorsque tel est le cas, l'utilisation des pratiques sécurisées suivantes pour la gestion des tampons devient nécessaire :
- Vérification des limites : la vérification des limites dans les bibliothèques de types de données abstraites peut limiter l'apparition de dépassements de tampon. Dans la mesure du possible, évitez d'utiliser des fonctions de bibliothèque standard telles que gets(), strcpy(), strcat() qui sont sensibles aux débordements de tampon.
- Protection de l'espace exécutable : désignez ou marquez les régions de mémoire comme non exécutables pour empêcher l'exécution de code machine dans ces zones.
- Utiliser des systèmes d'exploitation modernes : la plupart des systèmes d'exploitation modernes disposent de fonctionnalités de protection d'exécution intégrées, telles que la réorganisation aléatoire de l'emplacement de l'espace d'adressage des principales zones de données d'un processus et la protection de la zone non exécutable contre les exploits. . Ces protections d'exécution intégrées aident à atténuer les attaques par débordement de mémoire tampon.
Les vulnérabilités de débordement de mémoire tampon peuvent être difficiles à détecter, surtout lorsque le logiciel est très volumineux et complexe. Cependant, grâce à l'utilisation de pratiques de codage sécurisées, de fonctions de gestion sécurisée des tampons et de fonctionnalités de sécurité appropriées du compilateur et du système d'exploitation, une défense solide contre les débordements de tampon peut être construite. En plus de ces mesures préventives, une analyse et une identification cohérentes de ces failles constituent une étape essentielle pour prévenir un exploit.