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.
Cet article s'articule autour des points suivants :
Contenu associé
Sécurité des applications web ?
Extraction de données
Falsification de requêtes intersites
Attaque par force brute
Pourquoi utiliser HTTPS ?
Abonnez-vous à theNET, le récapitulatif mensuel de Cloudflare des idées les plus populaires concernant Internet !
Copier le lien de l'article
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.
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.
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.
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.
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 :
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.
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 :
*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.