Cybersécurité

Définition dépassement de tampon ?

Dépassement de 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 si l’on versait 12 onces de lait dans un verre de 8 onces.

Qu’est-ce qu’un dépassement de tampon ?

Le débordement de 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, ce qui entraîne l’écrasement des emplacements 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 débordements de mémoire tampon peuvent être exploités par des attaquants 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.

Qu’est-ce qu’un tampon ?

Un tampon, ou tampon de données, est une zone de stockage physique en mémoire utilisée pour stocker temporairement des données pendant qu’elles sont déplacées d’un endroit à un autre. Ces tampons vivent 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 profitent 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 tampons sont conçus pour contenir des quantités spécifiques de données. À moins que le programme utilisant la mémoire tampon ne contienne des instructions intégrées pour éliminer les données lorsqu’une quantité trop importante est envoyée à la mémoire tampon, le programme écrasera les données dans la mémoire adjacente à la mémoire tampon.

Les débordements de mémoire tampon peuvent être exploités par les attaquants pour corrompre les logiciels. Bien qu’elles soient bien comprises, les attaques par débordement 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 débordement de mémoire tampon dans les logiciels SSL.

Comment les attaquants exploitent-ils les débordements de mémoire tampon ?

Un attaquant peut délibérément introduire dans un programme une entrée soigneusement élaborée qui fera que le programme essaiera de stocker cette entrée dans une mémoire tampon qui n’est pas assez grande, en écrasant les portions de mémoire connectées à l’espace tampon. Si la disposition de la mémoire du programme est bien définie, l’attaquant peut délibérément écraser des zones connues pour contenir du code exécutable. L’attaquant peut alors remplacer ce code par son propre code exécutable, ce qui peut changer radicalement la manière dont le programme est censé fonctionner.

Par exemple, si la partie écrasée en mémoire contient un pointeur (un objet qui pointe vers un autre endroit en mémoire), le code de l’attaquant 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 de l’attaquant.

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

Certains langages de codage sont plus sensibles que d’autres au débordement de la mémoire tampon. Le C et le 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 dépassement de la mémoire tampon, mais ne peuvent pas l’empêcher complètement.

Comment se protéger contre les attaques par débordement de la mémoire tampon

Heureusement, les systèmes d’exploitation modernes disposent de protections d’exécution qui aident à atténuer les attaques par débordement de mémoire tampon. Examinons deux protections communes qui contribuent à atténuer le risque d’exploitation :

  • Randomisation de l’espace d’adressage – Réorganise de façon aléatoire les emplacements de l’espace d’adressage des zones de données clés d’un processus. Les attaques par débordement de mémoire tampon reposent généralement sur la connaissance de l’emplacement exact d’un code exécutable important, 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 soit exécutables soit non exécutables, empêchant un exploit d’exécuter le code trouvé dans une zone non exécutable.

Les développeurs de logiciels peuvent également prendre des précautions contre les vulnérabilités de débordement 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 de débordement de la mémoire tampon, parfois dans le sillage d’une exploitation réussie. Lorsque de nouvelles vulnérabilités sont découvertes, les ingénieurs doivent corriger le logiciel concerné et s’assurer que les utilisateurs du logiciel ont accès au correctif.

Quels sont les différents types d’attaques par débordement de la mémoire tampon ?

Il existe un certain nombre d’attaques par débordement de mémoire tampon qui utilisent des stratégies différentes et ciblent des morceaux de code différents. En voici quelques-unes parmi les plus 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 débordement 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) trop grand pour le type d’entier censé le stocker ; cela peut entraîner un dépassement de tampon.
  • Débordement Unicode – Un débordement Unicode crée un dépassement de tampon en insérant dans une entrée des caractères Unicode qui attendent des caractères ASCII. (ASCII et unicode sont des normes de codage qui permettent aux ordinateurs de représenter du texte. Par exemple, la lettre « a » est représentée par le chiffre 97 en ASCII. Alors que les codes ASCII ne couvrent que les caractères des langues occidentales, l’unicode peut créer des caractères pour presque toutes les langues écrites du monde. Comme il y a beaucoup plus de caractères disponibles en unicode, de nombreux 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 vivent dans la mémoire vive de l’ordinateur. La pile est organisée de manière ordonné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 magasin de munitions sera la première à être tirée. Le tas est un réservoir désorganisé de mémoire supplémentaire, les données n’entrent pas dans le tas et ne le quittent pas 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.

Ecrire un commentaire