Qu'est-ce que le débordement de tampon (buffer overflow) ?

Un débordement de tampon se produit lorsqu'un programme écrit des données dans une mémoire tampon jusqu'à surcharger la capacité de cette dernière. Le processus revient en quelque sorte à verser 40 cl de liquide dans un verre de 25 cl.

Objectifs d’apprentissage

Cet article s'articule autour des points suivants :

  • Définir une mémoire tampon
  • Expliquer la notion de débordement de tampon et son utilisation dans le cadre d'une cyberattaque
  • Comprendre qui est le plus vulnérable et comment se protéger contre les attaques par débordement de tampon

Contenu associé


Vous souhaitez continuer à enrichir vos connaissances ?

Abonnez-vous à theNET, le récapitulatif mensuel de Cloudflare des idées les plus populaires concernant Internet !

Consultez la politique de confidentialité de Cloudflare pour en savoir plus sur la manière dont nous collectons et traitons vos données personnelles.

Copier le lien de l'article

Qu'est-ce que le débordement de tampon (buffer overflow) ?

Le débordement de tampon désigne une anomalie qui se produit lorsqu'un logiciel écrit des données dans une mémoire tampon jusqu'à surcharger la capacité de cette dernière, entraînant ainsi l'écrasement des emplacements de mémoire adjacents. En d'autres termes, un trop grand nombre d'informations sont transmises dans un conteneur ne disposant pas de suffisamment d'espace et ces dernières finissent par remplacer les données situées dans les conteneurs adjacents.

Les pirates peuvent tirer parti du débordement de tampon pour modifier la mémoire d'un ordinateur afin de perturber l'exécution d'un programme ou ou d'en prendre le contrôle.

Attaque par débordement de tampon

Qu'est-ce qu'une mémoire tampon ?

Une mémoire tampon, ou tampon de données, est une zone de stockage physique utilisée pour stocker temporairement des données pendant qu'elles se déplacent d'un endroit à un autre. Ces mémoires tampons se situent généralement dans la mémoire RAM. Les ordinateurs utilisent fréquemment des tampons pour améliorer leurs performances ; la plupart des disques durs modernes tirent parti de la mise en mémoire tampon pour accéder efficacement aux données, et de nombreux services en ligne utilisent également des tampons. Par exemple, les tampons sont fréquemment utilisés dans les flux vidéo en ligne pour éviter les interruptions. Lorsqu'une vidéo est diffusée en continu, le lecteur vidéo télécharge et stocke peut-être 20 % de la vidéo à la fois dans une mémoire tampon, puis la diffuse en continu à partir de cette mémoire tampon. De cette façon, des baisses mineures de la vitesse de connexion ou des interruptions rapides du service n'affecteront pas les performances du flux vidéo.

Les mémoires tampons sont conçues pour contenir des quantités spécifiques de données. À moins que le programme utilisant la mémoire tampon ne dispose d'instructions intégrées pour éliminer les données lorsqu'une trop grande quantité est envoyée à la mémoire tampon, le programme écrasera les données contenues dans la mémoire adjacente à la mémoire tampon.

Les pirates peuvent tirer parti du débordement de tampon afin de corrompre un logiciel. Bien qu'il s'agisse d'un phénomène particulièrement bien compris, les attaques par débordement de tampon demeurent un problème de sécurité important pour les équipes de cybersécurité. En 2014, une menace connue sous le nom de « heartbleed » a laissé des centaines de millions d'utilisateurs exposés aux attaques en raison d'une vulnérabilité par débordement de tampon des logiciels SSL.

Comment les pirates exploitent-ils les attaques par débordement de tampon ?

Un pirate peut délibérément introduire dans un programme des données minutieusement élaborées, ce qui amènera le programme à essayer de stocker ces données dans une mémoire tampon qui n'est pas assez grande, écrasant ainsi les portions de mémoire connectées à l'espace tampon. Si la disposition de la mémoire du programme est bien définie, le pirate peut délibérément écraser des zones connues pour contenir du code exécutable. Le pirate peut alors remplacer ce code par son propre code exécutable, ce qui peut modifier radicalement la manière dont le programme est censé fonctionner.

Par exemple, si la partie écrasée dans la mémoire contient un pointeur (un objet qui pointe vers un autre endroit dans la mémoire), le code du pirate pourrait remplacer ce code par un autre pointeur qui pointe vers une charge utile d'exploitation. Cela peut transférer le contrôle de l'ensemble du programme au code du pirate.

Qui est vulnérable aux attaques par débordement de tampon ?

Certains langages de programmation sont plus sensibles que d'autres au débordement de tampon. Le C et le C++ constituent deux langages populaires particulièrement vulnérables, car ils ne bénéficient d'aucune protection intégrée contre l'accès ou l'écrasement de données au niveau de leur mémoire. Les systèmes d'exploitation Windows, Mac OSX et Linux contiennent tous du code écrit dans l'un de ces langages, voire les deux.

Les langages plus modernes, comme Java, PERL et C#, disposent de fonctionnalités intégrées permettant de réduire les risques de débordement de tampon, mais ils ne peuvent s'en protéger totalement.

Mesures de protection contre les attaques par débordement de tampon ?

Heureusement, les systèmes d'exploitation modernes disposent de protections de l'environnement d'exécution permettant d'atténuer les attaques par débordement de tampon. Examinons deux types de protections courantes contribuant à réduire le risque d'exploitation :

  • Randomisation de l'espace d'adressage – Réorganise de façon aléatoire les emplacements des zones de données clés d'un processus. Comme les attaques par débordement de tampon reposent généralement sur la connaissance de l'emplacement exact du code exécutable principal, la randomisation des espaces d'adressage rend l'opération presque impossible.
  • Prévention de l'exécution des données - Marque certaines zones de mémoire exécutables ou non exécutables, empêchant un exploitant d'exécuter le code se trouvant dans une zone non exécutable.

Les développeurs de logiciels peuvent également prendre des précautions contre les vulnérabilités aux attaques par débordement de tampon en écrivant dans des langages disposant de protections intégrées ou en incorporant des procédures de sécurité spéciales au sein de leur code.

Malgré les précautions prises, les développeurs continuent de découvrir de nouvelles vulnérabilités aux attaques par débordement de tampon, parfois à la suite d'une exploitation réussie. Lorsque de nouvelles vulnérabilités sont découvertes, les ingénieurs doivent déployer un correctif pour le logiciel concerné et s'assurer que les utilisateurs du logiciel ont bien accès au correctif.

Quels sont les différents types d'attaques par débordement de tampon ?

Un certain nombre d'attaques par débordement de tampon existent. Elles reposent sur des stratégies différentes et visent des morceaux différents de code. En voici quelques exemples, parmi les plus connues :

  • Attaque par débordement de pile – Il s'agit du type d'attaque par débordement de tampon le plus courant*.
  • Attaque par saturation de tas - Ce type d'attaque vise les données dans le pool de mémoire ouverte connu sous le nom de tas*.
  • Attaque par débordement - Lors d'une attaque par débordement d'entier, une opération arithmétique aboutit à un entier (nombre entier) qui s'avère trop grand pour le type d'entier censé le stocker. Il peut en résulter une attaque par débordement de tampon (Buffer overflow).
  • Débordement Unicode - le phénomène de débordement Unicode crée une saturation de la mémoire tampon par l'insertion de caractères Unicode au sein d'une entrée prévue pour des caractères ASCII. (Les normes d'encodage ASCII et Unicode permettent aux ordinateurs de faire apparaître du texte. La lettre « a » est ainsi représentée par le nombre 97 en ASCII. Tandis que l'ASCII ne couvre que les caractères des langues occidentales, l'Unicode peut créer des caractères pour la quasi-totalité des langues écrites du monde. Du fait du plus grand nombre de caractères disponibles sous cette norme, beaucoup de caractères Unicode sont plus grands que le plus grand caractère ASCII).

*Les ordinateurs reposent sur deux modèles d'allocation de mémoire différents, connus sous le nom de pile et de tas ; tous deux se trouvent dans la mémoire vive de l'ordinateur. La pile est proprement organisée et contient des données selon le modèle "dernier entré, premier sorti". Les données les plus récemment placées dans la pile seront les premières à en sortir, un peu comme la dernière balle insérée dans un chargeur de munitions est la première à être tirée. Le tas est une réserve désorganisée de mémoire supplémentaire, les données n'entrent pas ou ne sortent pas du tas dans un ordre particulier. Comme l'accès à la mémoire à partir de la pile est beaucoup plus rapide que l'accès à partir du tas, le tas est généralement réservé aux données plus volumineuses ou aux données qu'un programmeur veut gérer explicitement.