Qu'est-ce que la saturation de la mémoire tampon ?

Un débordement de mémoire tampon se produit lorsqu'un programme qui écrit des données dans une mémoire tampon surcharge la capacité de cette dernière. C'est comme verser 340 grammes de lait dans un verre de 0,236588 litres.

Share facebook icon linkedin icon twitter icon email icon

Débordement de la mémoire tampon

Objectifs d’apprentissage

Après avoir lu cet article, vous pourrez :

  • Définir une mémoire tampon
  • Expliquez la notion de saturation de la mémoire tampon et comment elle peut être utilisée dans le cadre d'une cyberattaque
  • Comprendre qui est le plus vulnérable et comment se protéger contre les attaques par saturation de la mémoire tampon

Que signifie le débordement de la mémoire tampon ?

Le débordement de la mémoire tampon est une anomalie qui se produit lorsque le logiciel qui écrit des données dans une mémoire tampon dépasse la capacité de cette dernière, entraînant l'écrasement des emplacements de mémoire adjacents. En d'autres termes, trop d'informations sont transmises dans un conteneur qui n'a pas assez d'espace, et ces informations finissent par remplacer les données dans les conteneurs adjacents.

Les saturations de mémoire tampon peuvent être exploités par des pirates dans le but de modifier la mémoire d'un ordinateur afin de miner ou de prendre le contrôle de l'exécution d'un programme.

Buffer Overflow

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 saturations de mémoire tampon peuvent être exploités par les pirates pour corrompre les logiciels. Bien qu'elles soient bien comprises, les attaques par saturation de mémoire tampon restent un problème de sécurité majeur qui tourmente les équipes de cybersécurité. En 2014, une menace connue sous le nom de "heartbleed" a exposé des centaines de millions d'utilisateurs à des attaques en raison d'une vulnérabilité de saturation de mémoire tampon dans les logiciels SSL.

Comment les pirates exploitent-ils les saturations de la mémoire 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 saturation de la mémoire tampon ?

Certains langages de codage sont plus sensibles que d'autres au saturation de la mémoire tampon. C et C++ sont deux langages populaires très vulnérables, car ils ne contiennent aucune protection intégrée contre l'accès ou l'écrasement de données dans leur mémoire. Windows, Mac OSX et Linux contiennent tous du code écrit dans l'un de ces langages ou dans les deux.

Des langages plus modernes comme Java, PERL et C# ont des fonctionnalités intégrées qui aident à réduire les risques de saturation de la mémoire tampon, mais ne peuvent pas l'empêcher complètement.

Mesures anti-attaques par saturation de la mémoire tampon

Heureusement, les systèmes d'exploitation modernes disposent de protections d'exécution aidant à atténuer les attaques par saturation de mémoire tampon. Examinons deux types de protections communes qui contribuent à réduire le risque d'exploitation.

  • Randomisation espace d'adresse - Réorganise de façon aléatoire les emplacements de l'espace d'adresse des zones de données clés d'un processus. Les attaques par saturation de mémoire tampon reposent généralement sur la connaissance de l'emplacement exact du code exécutable principal, la randomisation des espaces d'adresses rend cela 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 au saturation de la mémoire tampon en écrivant dans des langages qui ont des protections intégrées ou en utilisant des procédures de sécurité spéciales dans leur code.

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

Quels sont les différents types d'attaques par saturation de mémoire tampon ?

Il existe un certain nombre d'attaques par saturation de mémoire tampon qui utilisent des stratégies différentes et ciblent des morceaux différents de code. En voici quelques-unes parmi les lus connues.

  • Attaque par débordement de pile - Il s'agit du type d'attaque par débordement de pile le plus courant et implique le débordement d'une mémoire tampon sur la pile d'appel*.
  • 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 d'entier - Dans un débordement d'entier, une opération arithmétique aboutit à un entier (nombre entier) qui est trop grand pour le type d'entier censé le stocker ; cela peut entraîner un débordement de tampon.
  • Saturation Unicode - Une saturation Unicode crée une saturation de la mémoire tampon en insérant des caractères Unicode dans une entrée qui attend des caractères ASCII. (L'ASCII et unicode sont des normes de codage qui permettent aux ordinateurs de faire apparaître du texte. Par exemple, la lettre "a" est représentée par le nombre 97 en ASCII. Alors que les codes ASCII ne couvrent que les caractères des langues occidentales, unicode peut créer des caractères pour presque toutes les langues écrites sur terre. Comme il y a beaucoup plus de caractères disponibles en unicode, 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.