Un débordement, ou dépassement de tampon (en anglais buffer overflow), est un problème de sécurité qui affecte la mémoire. Il se produit quand un programme ne vérifie pas correctement les limites du tampon alloué en mémoire et qu’il écrit plus de données qu'elle ne peut contenir. Cette erreur entraîne un débordement de données dans l'espace mémoire adjacent, écrasant les informations qui s'y trouvent, ce qui conduit souvent à des plantages et à des conditions propices à une exploitation de la vulnérabilité par des pirates. Les débordements de mémoire tampon sont l'une des causes les plus anciennes et les plus courantes pouvant mener à l'exécution de code arbitraire. Des applications écrites dans des langages de programmation comme C et C++ sont plus sujettes à ces erreurs de codage que des applications écrites dans d'autres langages. Pour les éviter, la communauté des développeurs a mis au point des pratiques de codage sûres adoptées par les principaux éditeurs de logiciels dans le cadre de leurs cycles de développement sécurisés.

Toujours plus de débordements de tampon

En septembre 2019, The MITRE Corporation, une entreprise américaine d’intérêt public qui gère le catalogue Common Weakness Enumeration (CWE), a publié une liste des 25 principaux types de vulnérabilités pouvant affecter les logiciels. Étonnamment, dans ce classement, la première place revient au CWE-119 ou « Restriction Inappropriée du Fonctionnement dans les Limites d’une Mémoire Tampon » (Improper Restriction of Operations within the Bounds of a Memory Buffer), une catégorie plus large d'erreurs de gestion du tampon mémoire qui inclut les débordements de tampon et les lectures hors limites (out-of-bounds). Il est surprenant de constater que, malgré les nombreux efforts entrepris ces dernières années pour supprimer ces erreurs des logiciels, les débordements de tampon sont toujours en tête des vulnérabilités de MITRE. Cependant, c'est la première fois depuis 2011 que l’organisation à but non lucratif met à jour sa liste des 25 principales vulnérabilités et son classement est basé sur une nouvelle formule de notation qui combine la fréquence des vulnérabilités dans la base de données nationale sur les vulnérabilités (National Vulnerabilities Database - NVD) observée en 2017 et 2018 avec leurs scores de gravité moyens. La liste reflète donc le risque global associé à certains types de vulnérabilités en fonction de leur prévalence et du danger qu'elles représentent.

Mais la multiplication des dispositifs IoT pourrait aussi expliquer pourquoi les débordements de tampon se retrouvent à nouveau en tête des principales vulnérabilités. En effet, des recherches effectuées ces dernières années ont montré que, par rapport aux applications desktop modernes des fournisseurs établis, la qualité du code des logiciels fonctionnant sur ces appareils était très médiocre. Depuis toujours, les firmwares des systèmes embarqués sont affectés par d’innombrables problèmes de débordement de tampon et cela ne s'est pas beaucoup amélioré au fil du temps, car, en général, les fournisseurs de ces matériels ne s’embarrassent pas pour réviser une base de code initialement de mauvaise qualité. Ce qui a changé, c'est qu’il y a toujours plus de dispositifs IoT d’entreprise ou domestiques qui se connectent à Internet.

Quelques exemples d'attaques par débordement de tampon

Les débordements de tampon sont généralement affectés d’un score de gravité élevé, car ils peuvent entraîner l'exécution de code non autorisé et une prise de contrôle par des attaquants de l'espace mémoire situé hors de la mémoire tampon allouée, espace où ont été écrites les données excédentaires, et ces derniers peuvent rediriger un pointeur de fonction vers leur code malveillant. Même quand l'exécution de code arbitraire n'est pas possible, un débordement de tampon entraîne souvent un plantage de la machine, créant ainsi les conditions d’un déni de service (DoS) qui affecte la disponibilité de l'application et des processus qu'elle est censée traiter. Cette situation est particulièrement grave dans les déploiements de serveurs où une disponibilité continue est nécessaire et attendue. Dans certains cas, les attaquants peuvent également exploiter des débordements de tampon pour écraser des paramètres critiques dans la mémoire d'une application, par exemple un drapeau indiquant si l'utilisateur est un administrateur ou non. Cela peut conduire à une escalade des privilèges dans le contexte de l'application, voire du système lui-même. 

Enfin, une mauvaise gestion des limites de la mémoire tampon peut permettre à des attaquants de lire des données en dehors de la mémoire tampon au lieu de les écraser, et expose donc à la divulgation d'informations sensibles. C'est ce que l'on appelle une lecture hors limites. Même si elle est différente d'un dépassement de tampon classique, une lecture hors limites relève de la même catégorie d'erreurs de codage. Les attaquants peuvent également utiliser les lectures hors limites pour obtenir des informations qui pourront les aider à exploiter d'autres vulnérabilités. Par exemple, ils peuvent utiliser ces lectures hors-limites pour trouver des adresses mémoire protégées par des technologies anti-exploitation du kernel comme la distribution aléatoire de l'espace d'adressage ou Address Space Layout Randomization (ASLR).

Comment les éviter

Étant donné que les débordements de mémoire tampon sont le résultat d'erreurs de programmation, la meilleure façon de les éviter est de former les développeurs pour qu'ils évitent de commettre ces erreurs. Beaucoup de tutoriels et de livres sur le codage sécurisé traitent de la question des débordements de tampon, tout comme le font les programmes de certification de codage sécurisé. Le Centre de coordination du CERT et l'Institut de génie logiciel de l'Université Carnegie Mellon ont élaboré des normes de codage pour plusieurs langages de programmation, dont le C et le C++. Plusieurs solutions automatisées permettent de prévenir les débordements de tampon. C’est le cas des langages de programmation ou de frameworks et de bibliothèques dits memory-safe qui offrent des versions sécurisées de fonctions susceptibles de provoquer des débordements de tampon.

Les développeurs doivent également créer des applications qui utilisent des fonctionnalités comme l'ASLR et des techniques de compilation comme celle des « Position Independent Executable (PIE) qui permet de compiler des exécutables pour qu’ils se retrouvent en « position indépendante » et limiter ainsi l'impact potentiel des débordements de tampon. Les développeurs devraient également utiliser des drapeaux et des extensions de compilation qui détectent de telles erreurs, comme le drapeau /GS de Microsoft Visual Studio ou le drapeau FORTIFY_SOURCE GCC ajouté par Red Hat, StackGuard et ProPolice. Malheureusement, aucune de ces solutions n'offre une protection complète. Il est donc important d'effectuer des révisions périodiques du code et des tests de sécurité des applications avec des équipes de sécurité internes et externes, mais aussi d'intégrer dans les flux des « fuzzers », ces outils de tests automatisés pour traquer les vulnérabilités.