s
19 708 Pages

Remarque disambigua.svg homonymie - Si vous êtes à la recherche pour les dépassements de tampon liés aux télécommunications, voir Débordement de tampon (télécommunications).

en informatique la débordement de tampon (ou dépassement de tampon) Il est une condition d'erreur qui se produit dans exécution lorsqu'il est dans un tampon d'une taille donnée plus grandes données sont écrites. Lorsque cela se produit, il est écrasé une partie de la zone de mémoire immédiatement adjacente au tampon en question, avec plusieurs effets possibles en fonction de l'endroit où le tampon est situé et comment il est organisé dans la mémoire de la plate-forme logicielle particulière; dans certains programmes Cela provoque les vulnérabilités logicielles sécurité. les langues géré, à-dire basée sur un modèle de mémoire géré à l'exécution comme Java, devrait en théorie être à l'abri de ce type d'erreur, mais dans la pratique la possibilité reste présent dans le cas d'appels de code natif, ou à cause du bug du module de gestion (la machine virtuelle Java dans Si Java) ou compilateur JIT.

description

Lorsque, par erreur ou malveillance, ils sont envoyés à la capacité de mémoire tampon de données destiné à les contenir (qui par erreur, malveillance ou superficialité n'a pas été conçu correctement), les données extra allez écraser les variables internes du programme, ou son propre cheminée; en conséquence, en fonction de ce qui a été écrasé et ces valeurs, le programme peut donner des résultats erronés ou imprévisibles, accident, ou (si elle est un pilote de système, ou le même système d'exploitation) bloc ordinateur. Sachant très bien que le logiciel, le système d'exploitation et le type de fonctionnement de l'ordinateur, vous pouvez pré-calculer un ensemble de données malveillant qui a envoyé pour provoquer un débordement de tampon pour permettre à un pirate de prendre le contrôle du programme (et parfois, par ce biais, l'ensemble de l'ordinateur).

Tous les programmes sont vulnérables à ce type de problème. Pour les langages de bas niveau tels que l'assemblage, les données sont simple tableau d'octets, stockés dans des registres ou dans la mémoire principale: l'interprétation correcte de ces données (adresses, entiers, caractères, instructions, etc ...) est affecté aux fonctions et les instructions que l'accès et les manipuler; en utilisant les langages de bas niveau est donc un plus grand contrôle des ressources de la machine, mais nécessite une plus grande attention dans la phase de programmation afin d'assurer l'intégrité des données (et donc éviter des phénomènes tels que le débordement de la mémoire tampon). Les langues du plus haut niveau, tels que Java et Python (et bien d'autres), qui définissent la place le concept du type d'une variable et qui définissent un ensemble d'opérations autorisées en fonction du type, ne souffrent pas de vulnérabilités telles que les dépassements de tampon , parce qu'il ne vous permet pas de stocker dans un tampon une plus grande quantité de données par rapport à sa taille. Entre ces deux extrêmes, on trouve le langage C qui a quelques-unes des abstractions typiques des langages de haut niveau ainsi que des éléments typiques des langages de bas niveau, comme la possibilité d'accéder et de manipuler les adresses mémoire: ce qui rend pour utilise un langage susceptible inappropriée la mémoire; si cela est ajouté le fait que certaines bibliothèques de fonctions très courantes (en particulier pour l'entrée et la manipulation des chaînes comme la obtient) Ne pas effectuer une surveillance adéquate de la taille des tampons sur lesquels ils travaillent, et que C a été utilisé dans les années 70 pour écrire le système d'exploitation UNIX (et de ce sont alors dérivé des systèmes comme Linux) et la plupart des applications conçues pour fonctionner dessus, il en résulte que existe toujours et circule une grande quantité de code vulnérable aux dépassements de tampon.[1]

Tous les programmes sont vulnérables à ce genre de problème, en fait, parce qu'un programme donné est à risque doit:

  • Le programme prévoit pour l'entrée de données de taille variable et les stocker dans une mémoire tampon;
  • Le langage de programmation utilisé ne prévoit pas le contrôle automatique des la vérification des limites Tampon (au moment de la compilation ou à l'exécution), et le programmeur ne pénètre pas dans ces contrôles dans le code.

histoire

Les dépassements de tampon se sont connus et ont été partiellement documentés au public en 1972, lorsque l'étude sur la planification de la technologie de sécurité informatique a identifié un exploit en mesure d'exploiter la vulnérabilité: « Le code d'exécuter cette fonction ne vérifie pas les adresses source et destination correctement, ce qui permet des parties de le moniteur à superposer par l'utilisateur. Ceci peut être utilisé pour injecter du code dans le moniteur qui permettra à l'utilisateur de prendre le contrôle de la machine. », où pour moniteur il était destiné à ce qui est maintenant la noyau.[2]

Le premier exemple frappant d'une attaque par débordement de tampon a été basé sur Worm Morris (AKA Internet Worm), qui, en 1988 a conduit à l'écrasement de plus de 6000 systèmes connectés à l'Internet en quelques heures en exploitant le débordement de tampon dans le processus démon doigt UNIX de se propager à travers le réseau.[3]

Plus tard, en 1995, Thomas Lopatic publié sur la liste de diffusion Bugtraq par un fracassant basé sur pile exploiter httpd NCSA système d'exploitation du serveur Web HP-UX, et un an plus tard, en 1996, Elias Levy (également connu sous le nom Aleph One) a publié un article intitulé "Smashing the Stack for Fun and Profit" sur 'ezine Phrack, un guide pour l'exploitation de techniques étape par étape des débordements de mémoire tampon de pile.[4][5]

A la suite des dépassements de tampon ont été exploités par deux grands les vers InternetEn 2001, le Ver Code Red, qui exploitait le débordement de tampon dans le serveur Microsoft Internet Information Services (IIS) 5.0 [6], et en 2003, le 'SQL Slammer ver, ce qui a compromis les machines réalisées Microsoft SQL Server 2000.[7]

En dépit d'être l'une des vulnérabilités connues pour le plus long temps, toujours le dépassement de mémoire tampon est une faille de sécurité commune et d'une grande actualité: les organisations comme CERT / CC et SANS publier encore les avis relatifs à la sécurité de l'information, y compris un grand nombre d'exploits basés sur les dépassements de tampon; En outre, plusieurs éléments de la liste « CWE / SANS Top 25 Logiciel le plus dangereux Erreur » sont des variantes du dépassement de mémoire tampon.[8]

En Février 2016, les chercheurs de Google et Red Hat ont découvert la présence d'un dépassement de mémoire tampon de vulnérabilité dans la pile de fonction getaddrinfo bibliothèque glibc (Toutes les versions de 2.9). Cette bibliothèque est utilisée par des centaines d'applications et la plupart des distributions Linux (y compris ceux installés dans les routeurs et autres périphériques): la fonction affectée est en charge de lookups (résolution de noms DNS des hôtes et des adresses IP) et la vulnérabilité peut permettre à un attaquant d'envoyer des domaines malveillants ou des serveurs DNS, ainsi que les attaques man-in-the-middle à l'exécution de code arbitraire sur la machine victime.[9][10]

Types de dépassement de mémoire tampon et les attaques possibles

Le dépassement de mémoire tampon peut être indiqué par des noms différents en fonction de la position occupée par le tampon dans la mémoire allouée pour le processus.

L'emplacement de la mémoire tampon est important parce que les effets de débordement de la mémoire tampon sont principalement liés à:

  • ce qui est proche de la mémoire tampon
  • les données qui doivent être remplacées dans les zones adjacentes de mémoire dans la mémoire tampon

la mémoire virtuelle d'un processus

Lorsqu'un programme est exécuté le système d'exploitation fraye normalement un nouveau processus dans la mémoire principale et alloue un espace de mémoire virtuelle réservée au processus lui-même.

Cet espace mémoire en général a une structure donnée par (en partant du haut vers le bas):

  • noyau
  • cheminée (Pousse vers le bas)
  • mémoire libre
  • monceau (Grandissant)
  • données globales
  • code de programme

L'exécution du programme se compose à son tour de différents appels de fonction: chaque appel génère une trame de pile dans la pile (qui croît progressivement vers le bas dans la structure décrite ci-dessus, avec la politique LIFO); dans le cadre de la fonction appelée stocke les variables locales, l'adresse de la fonction d'appel qui renverra le contrôle (adresse de retour) et le pointeur de cadre dans la fonction appelante; ces deux derniers jouent en particulier un rôle fondamental pour assurer la bonne circulation de l'exécution du programme entre un appel de fonction et l'autre, en fait:

  • L'adresse de retour indique la fonction d'appel dans lequel l'instruction de la fonction d'appel doit rendre le contrôle;
  • Le pointeur de cadre dans la fonction appelante permet de restaurer son contexte d'exécution revenir avant le contrôle;

La pile grandit vers le bas à chacun, et chacun donc trame générée appel de fonction, a une structure du type (toujours de haut en bas):

Adresse de retour
Pointeur sur le cadre de la fonction d'appel
Variable locale 1
Variable locale 2
...

[1]

dépassement de mémoire tampon pile

Lorsque la mémoire tampon est allouée dans la pile, qui est une variable locale d'une fonction, tout dégagement à l'intérieur de la mémoire tampon d'une quantité de données à son débit plus élevé prend le nom de dépassement de pile (ou empiler brisant, ou débordement de tampon à base d'empiler).

Dans ce cas, les données adjacentes à la mémoire tampon qui risqueraient d'être écrasées par des données extra Je suis l'adresse de retour et le pointeur de cadre.

Si les données de pointeur en excès cadre Ecraser et l'adresse de retour, après l'exécution de la fonction tenteraient de rendre le contrôle à l'éducation pointée par l'adresse de retour qui peut contenir:

  • L'adresse d'une zone mémoire non accessible: les données excédentaires sont aléatoires, le programme se bloque généralement un retour erreur de segmentation. Il est un exemple de la façon dont le débordement de la mémoire tampon de la pile peut être utilisée comme une attaque du type déni de service (DoS), compromettre la disponibilité du service concerné.
  • Une adresse de mémoire définie: les données excédentaires sont calculées de manière à écraser l'adresse de retour avec l'adresse d'une zone de mémoire dans laquelle l'attaquant veut avoir accès, ou l'adresse à laquelle le code se trouve que l'attaquant veut courir.

Dans ce second cas, la chute basée sur les attaques par injection shellcode; les données entrées dans le tampon contenant du code exécutable en langage machine (assemblage) Et d'écraser l'adresse de retour est fait afin de reporter le code injecté dans la zone tampon. La tâche de ce code est normalement celui d'invoquer une ligne de commande, ou coquille, pourquoi ce code est dit shellcode (un appel à la fonction execve l'exécution du Bourne shell pour les systèmes UNIX, un appel à Système ( "command.exe") sur les systèmes Windows). Dans tous les cas, le programme en cours est remplacé par le shell, qui exécutera avec les mêmes privilèges que le programme de départ.

Il existe une variante de ce type d'attaque qui est basée sur le remplacement seul le pointeur de trame, et qui peut être utilisé lorsque la capacité de débordement est limité et ne permet pas d'arriver à remplacer l'adresse de retour. L'attaque consiste à exploiter le trop-plein pour remplacer le pointeur de la trame stockée de telle manière à le faire pointer sur un cadre factice de la pile, injecté dans le tampon en même temps que le shellcode; dans cette pile de faux cadres l'attaquant est entré l'adresse de retour en tant que pointeur vers le shellcode: lorsque les extrémités de la fonction a frappé son exécution, donc, retourne correctement le contrôle de la fonction appelante (en fait, l'adresse de retour ne change pas), mais il reprendra l'exécution d'un contexte faux et, quand, à son tour, elle aussi mettre fin à effectuer, le contrôle sera finalement transféré au shellcode (puisque dans ce cadre de pile a été modifié la RA de manière à pointer vers le code malveillant). les attaques off-by-one sont basés sur le principe suivant: si une erreur d'écriture du programmateur permet l'entrée dans un tampon même un octet plus que nécessaire (par exemple, en utilisant un <= invece del < dans un test de condition de contrôle), cette simple octets supplémentaires pourraient être utilisés par un utilisateur malveillant de modifier le pointeur de trame stockée suffisante pour le faire pointer sur un cadre factice de la pile, et ainsi obtenir indirectement le transfert du contrôle à l'aide du code malveillant injecté.[1]

Enfin, nous devons nous rappeler que débordement de pile et le débordement de la mémoire tampon de la pile ne sont pas synonymes: le premier indique une situation pour laquelle vous avez besoin d'une quantité trop élevée de la mémoire de la pile, selon une situation dans laquelle (pour diverses raisons) s'insère dans un tampon sur la pile un plus grand nombre de données la même capacité de mémoire tampon.[11]

débordement de tas

Un programme peut exiger que le système d'exploitation pour allouer dynamiquement une certaine quantité de mémoire dans tas, système l'exploitation des appels comme malloc () et gratuit() Dans C / UNIX. Ces tampons peuvent également être sensibles à déborder des problèmes dans le moment où il peut être inséré une quantité de données dépassant la mémoire allouée, et ces données doivent être comme d'habitude pour remplacer les zones adjacentes de mémoire dans la mémoire tampon.

On parle dans ces cas débordement de tas, mais, contrairement à la pile, dans le tas, ils ne sont pas stockés ni revenir adresses, ni pointeur de trame qui peut être modifié par un attaquant pour transférer la commande d'exécution de code arbitraire. Toutefois, cela ne signifie pas que ces anomalies ne constituent pas la vulnérabilité dangereuse en 2002 a été trouvé un type de vulnérabilité de débordement de tas dans une extension de Microsoft IIS qui pourrait être exploité pour exécuter du code arbitraire à droite sur ce type de serveurs.[12]

Lorsqu'un programme a plusieurs fonctions qui effectuent la même opération, mais d'une manière différente (par exemple, tri), Et vous voulez établir une exécution lequel utiliser pour traiter les données entrantes, il est souvent utilisé pour stocker les pointeurs de fonction dans le tas: ces pointeurs contiennent les adresses de début des fonctions, et sont utilisées pour rappeler ensuite l'exécution. Dans un tel scénario, un attaquant pourrait exploiter le débordement d'un tampon alloué sur le tas pour écraser ces pointeurs, en les remplaçant par un pointeur vers le shellcode injecté par le trop-plein: le prochain appel à l'une des fonctions implique le transfert du contrôle à l'shellcode au lieu de la fonction attendue.[13]

contre-mesures

Il existe différentes techniques pour prévenir ou révéler le phénomène de débordement de la mémoire tampon, avec divers compromis. En général, ces défenses peuvent être prises à différents niveaux:[14]

  • Un niveau de langue
  • Un code source
  • Un niveau du compilateur
  • En termes de système d'exploitation

Défenses au niveau de la langue

La meilleure défense contre les attaques en cas de débordement de la mémoire tampon est (ou au moment de la compilation dans le choix d'un langage de programmation qui fournit des contrôles automatiques de la taille de la mémoire tampon ou à exécution) Tel que Java, Python ou Perl. Si cette option peut être envisagée pour le développement de nouveaux programmes, il reste difficile à appliquer dans le cas des projets existants, car cela impliquerait la réécriture du code dans la nouvelle langue.[14]

Une alternative est d'utiliser bibliothèques sûres, ou bibliothèques de fonctions qui mettent en œuvre des protections contre le débordement de la mémoire tampon: dans les fonctions C sont vulnérables strcat, strcpy, obtient, sprintf (Et plus ...) dont il existe « sûr » que leurs homologues strncpy, strncat, snprintf. Un exemple de ces bibliothèques sûres Ils sont "libsafe", "libparanoia" et "libverify".[15] Libsafe, par exemple, met en oeuvre une technique de protection contre le débordement de mémoire tampon basé sur une modification de la pile se termine lorsque le contrôle d'une fonction à effectuer: si la pile est changé, le processus se termine par un erreur de segmentation.[16]

Défenses au niveau du code source

Il existe des outils qui peuvent détecter la vulnérabilité de dépassement de mémoire tampon dans le code source en effectuant plusieurs analyses sur le même ou moins complexe, à la fois statiques et dynamiques.

« ITS4 » est un exemple simple de l'analyseur statique qui recherche tous les appels de fonction vulnérables connus (comme strcpy ou popen), Conçu comme un remplacement pour la recherche par le biais grep: En raison de sa simplicité et l'analyse rudimentaire du code qui se rend compte qu'il est très facile de se heurter à des faux positifs et négatifs.[17]

Sinon, il y a outil plus complexe capable d'effectuer l'analyse dynamique du programme, tels que « Rational Purify », un débogueur de mémoire réalisé par IBM en mesure de détecter d'éventuelles anomalies dans la gestion de la mémoire lors de l'exécution du programme (accès aux variables débordements de mémoire tampon non initialisées, désallocation de mémoire incorrecte, etc ...).[18]

Défenses au niveau du compilateur

langues moyen / bas niveau comme C offrent une grande parce que « la performance sauve » de certains contrôles qui ne sont pas gérés automatiquement au niveau de la langue, laissant cette responsabilité au programmeur, et jetant ainsi les bases de vulnérabilités telles que les dépassements de tampon en cas d'absence des contrôles sur la taille de la mémoire tampon lors des accès.

L'une des techniques de défense de ces anomalies est prévu que les deux le compilateur d'inclure des contrôles sur la taille de tous les tampons dans le code compilé sans nécessiter de modification du code source, mais seulement au compilateur, mais seulement sur les frais de performance qui peuvent également augmenter la plus de 200%.[14] Ce fut la direction prise par deux différents patcher les projets du compilateur gcc écrit par Herman ten Bruges et Greg McGary.[19]

approche différente est plutôt « StackShield », une extension du compilateur gcc pour casser la pile sur la protection des systèmes Linux; au lieu d'entrer des contrôles lors de la compilation de la la vérification des limites tampon, l'objectif de StackShield est d'empêcher l'écrasement adresse de retour en stockant une copie dans une zone sécurisée ne peut pas être écrasé (au début du segment de données) au début de chaque appel de fonction, une copie qui est ensuite comparée à la fin de la fonction avec la valeur stockée dans la pile: si les valeurs ne correspondent pas StackShield peut mettre fin à l'exécution du programme ou à tâtons pour continuer à ignorer l'attaque et menace la plus grande partie du programme de tomber en panne.[20]

Une autre extension du compilateur gcc, « StackGuard », permet à la fois la détection de la prévention possible de débordement de la mémoire tampon de la pile est le même: la première défense, cependant, est beaucoup plus efficace et portable que le second, généralement moins fiable et sûr. La détection est basée sur l'écriture d'une trame de pile canari mot entre les variables locales et la adresse de retour et stocké sur l'hypothèse selon laquelle il est impossible de remplacer l'AR sans altérer la mot Canaries, dont il tire son nom pour cette analogie avec l'utilisation de canaris dans les mines de charbon comme le premier système d'alarme. Avant de rendre le contrôle de l'éducation mise de RA, il vérifie si la mot Canaries a subi des modifications: les modifications sont considérées comme une tentative potentielle de modifier l'exécution du programme de contrôle, puis attaque. La technique adoptée par StackGuard est efficace que si l'attaquant ne peut pas prédire la mot Canaries, dans ce cas, il serait en effet en mesure de concevoir le trop-plein de manière à écraser le mot Canaries avec sa valeur d'origine: StackGuard à cet effet effectue la répartition aléatoire de canari.[21]

Défenses au niveau du système d'exploitation

De nombreux systèmes d'exploitation ont tenté de résoudre le problème de dépassement de mémoire tampon en imposant des restrictions sur l'utilisation de la mémoire et donc faire des attaques plus complexes.

Un très largement utilisé au niveau du système d'exploitation du mécanisme de défense est basée sur une prise de certaines pages de mémoire, tels que ceux contenant cheminée et tas, non exécutable: toute tentative de transférer le code de contrôle d'exécution dans ces zones soulève une exception, ce qui empêche l'exécution. Ceci peut être réalisé en exploitant certaines caractéristiques matérielles des processeurs connus sous le nom "NX"(" No Execute ") bits ou" XD "(" eXecute Désactivé « ) bits, ou par des techniques logicielles qui simulent cette opération.

Certains systèmes d'exploitation basés sur UNIX comme OpenBSD et OS X soutenir directement le la protection de l'espace exécutable, pour d'autres OS, il est à la place disponible grâce à des extensions optionnelles telles que:

Les dernières versions de Microsoft Windows soutien sous la prévention de l'exécution des données nom (DEP) (ou la protection de l'exécution des données).[25]

Une autre technique de défense au niveau du système d'exploitation est le 'Adresse randomization aménagement de l'espace (ASLR) qui consiste à faire partiellement adresse aléatoire des fonctions de la bibliothèque et des zones les plus importantes de la mémoire; ce qui rend plus difficile (mais pas impossible) à l'exécution de code par des exploits parce qu'il oblige l'attaquant à rechercher l'adresse du code à exécuter par une série de tentatives est détectable par la victime, à la fois de tout SW de protection.[26]

notes

  1. ^ à b c William Stallings, Lawrie Brown, Sécurité informatique - Principes et pratiques, Pearson, 2015 ISBN 978-0-13-377392-7.
  2. ^ « Sécurité informatique Technologie de l'étude de la planification » - p 61. (PDF) csrc.nist.gov.
  3. ^ A l'intérieur du dépassement de mémoire tampon d'attaque: Mécanisme, méthode, prévention, sans.org.
  4. ^ Pourquoi l'exploitation de débordement de tampon a pris si longtemps à mûrir, sur rdist, 3 mai 2010. Récupéré le 5 Septembre 2016.
  5. ^ Thomas Lopatic, Bugtraq: Une vulnérabilité dans le NCSA httpd 1.3, sur seclists.org. Récupéré le 5 Septembre 2016.
  6. ^ Quel est le code Red Worm?, sans.org.
  7. ^ ver SQL Slammer, pen-testing.sans.org.
  8. ^ CWE - 2011 CWE / SANS Top 25 des erreurs de logiciel les plus dangereuses, sur cwe.mitre.org. Récupéré 17 Août, 2016.
  9. ^ (FR) CVE-2015-7547: glibc getaddrinfo débordement de mémoire tampon basée sur la pile, security.googleblog.com. Récupéré le 6 Septembre 2016.
  10. ^ sécurité critique Falla: débordement de pile dans la glibc getaddrinfo () (CVE-2015-7547) - Red Hat Portail client, sur access.redhat.com. Récupéré le 6 Septembre 2016.
  11. ^ Jon Erickson, Piratage - L'art de l'exploitation, No Starch Press, 2008 ISBN 978-1-59327-144-2.
  12. ^ Vulnérabilité Remarque VU # 363715 - Microsoft Internet Information Server (IIS) vulnérable à un débordement de tas au cours du traitement de conçu ".htr" sur demande "ISM.DLL" filtre ISAPI, sur www.kb.cert.org. Récupéré 19 Août, 2016.
  13. ^ Dépassements de tampon pour les nuls - SANS Institute, sans.org.
  14. ^ à b c RSA Laboratories - Mesures contre les attaques de dépassement de tampon, sur www.preserve-it-all.org. Récupéré le 31 Août, 2016.
  15. ^ 3.3. Dépassements de tampon, sur www.freebsd.org. Récupéré le 31 Août, 2016.
  16. ^ Libsafe - Répertoire des logiciels libres, sur directory.fsf.org. Récupéré le 4 Septembre 2016.
  17. ^ ITS4, seclab.cs.ucdavis.edu.
  18. ^ Rational Purify, www-01.ibm.com.
  19. ^ GCC anciennes extensions, ftp.tuwien.ac.at.
  20. ^ StackShield, angelfire.com.
  21. ^ StackGuard: Détection automatique adaptative et prévention des attaques par Buffer Overflow (PDF) usenix.org.
  22. ^ Page d'accueil de PaX, sur pax.grsecurity.net. Récupéré le 4 Septembre 2016.
  23. ^ "Exec Shield", nouvelle fonctionnalité de sécurité Linux [LWN.net], sur lwn.net. Récupéré le 4 Septembre 2016.
  24. ^ Openwall - Apporter la sécurité dans les environnements informatiques ouverts, sur www.openwall.com. Récupéré le 4 Septembre 2016.
  25. ^ McAfee Base de connaissances - programmes de prévention et de protection en cours d'exécution de dépassement de mémoire tampon, sur kc.mcafee.com. Récupéré le 4 Septembre 2016.
  26. ^ Adresse Randomisation Space Layout (PDF) symantec.com.

bibliographie

  • William Stallings, Lawrie Brown, Sécurité informatique - Principes et pratiques, Pearson, 2015, ISBN 978-0-133-77392-7
  • Jon Erickson, Piratage - L'art de l'exploitation, No Starch Press, 2008, ISBN 978-1-59327-144-2

Articles connexes

liens externes

autorités de contrôle GND: (DE4752450-9