Attaques par débordement de tampon
Attaques par débordement de tampon
-
Objectifs
- Connaitre les attaques par débordement de tampon
-
Présentation
- Un buffer (tampon) est un espace de mémoire de stockage physique utilisé pour stocker des données temporaires tout en se déplaçant d’un endroit à un autre. Ces tampons résident généralement dans la RAM.
- Les tampons sont des régions de stockage de mémoire qui contiennent temporairement des données pendant leur transfert d’un emplacement à un autre. Un buffer overflow (ou buffer overrun) se produit lorsque le volume de données dépasse la capacité de stockage de la mémoire tampon. En conséquence, le programme tentant d’écrire les données dans la mémoire tampon écrase les emplacements de mémoire adjacents.
- Les ordinateurs utilisent souvent des tampons pour améliorer les performances ; la plupart des disques durs modernes utilisent les avantages de la mise en mémoire tampon pour accéder efficacement aux données, et de nombreux services d’application en ligne utilisent également des mémoires tampons.
- Par exemple, un tampon pour les identifiants de connexion peut être conçu pour s’attendre à des entrées de nom d’utilisateur et de mot de passe de 8 octets, donc si une transaction implique une entrée de 10 octets (c’est-à-dire 2 octets de plus que prévu), le programme peut écrire l’excédent données au-delà de la limite du tampon.
- Les attaques par débordement de tampon (buffer overflow, parfois également appelées dépassement de tampon) ont pour principe l’exécution de code arbitraire par un programme en lui envoyant plus de données qu’il n’est censé en recevoir.
- Les programmes acceptant des données en entrée, passées en paramètre, les stockent temporairement dans une zone de la mémoire appelée tampon (buffer). Or, certaines fonctions de lecture, telles que les fonctions strcpy() du langage C, ne gèrent pas ce type de débordement et provoquent un plantage de l’application pouvant aboutir à l’exécution du code arbitraire et ainsi donner un accès au système.
- La mise en œuvre de ce type d’attaque est très compliquée car elle demande une connaissance fine de l’architecture des programmes et des processeurs. Néanmoins, il existe de nombreux exploits capables d’automatiser ce type d’attaque et la rendant à la portée de quasi néophytes.
- Il est ainsi possible d’inclure dans le tampon des instructions ouvrant un interpréteur de commande (shell) et permettant au pirate de prendre la main sur le système. Ce code arbitraire permettant d’exécuter l’interpréteur de commande est appelé shellcode.
-
Principe de fonctionnement
- Le principe de fonctionnement d’un débordement de tampon est fortement lié à l’architecture du processeur sur lequel l’application vulnérable est exécutée.
- Les données saisies dans une application sont stockées en mémoire vive dans une zone appelée tampon. Un programme correctement conçu doit prévoir une taille maximale pour les données en entrées et vérifier que les données saisies ne dépassent pas cette valeur.
- Les instructions et les données d’un programme en cours d’exécution sont provisoirement stockées en mémoire de manière contiguë dans une zone appelée pile (stack).
- Les données situées après le tampon contiennent ainsi une adresse de retour (appelée pointeur d’instruction) permettant au programme de continuer son exécution. Si la taille des données est supérieure à la taille du tampon, l’adresse de retour est alors écrasée et le programme lira une adresse mémoire invalide provoquant une faute de segmentation (segmentation fault) de l’application.
- Un pirate ayant de bonnes connaissances techniques peut s’assurer que l’adresse mémoire écrasée correspond à une adresse réelle, par exemple située dans le tampon lui-même. Ainsi, en écrivant des instructions dans le tampon (code arbitraire), il lui est simple de l’exécuter.
-
Types d’attaque par débordement de tampon
- De nombreuses attaques par débordement de tampon utilisent différentes stratégies et ciblent différents morceaux de code. Vous trouverez ci-dessous les attaques par débordement de tampon les plus connues :
-
Attaque par débordement de pile
- Il s’agit du type d’attaque de débordement de tampon le plus courant et implique un débordement de tampon dans la pile d’appels.
-
Attaque par débordement de tas
- Ce type d’attaque cible les données dans le pool de mémoire ouvert connu sous le nom de tas.
-
Attaque par débordement d’entier
- Lorsqu’un entier déborde, une opération arithmétique entraîne un entier (entier) trop grand pour stocker le type d’entier ; cela peut entraîner un débordement de la mémoire tampon.
-
Débordement Unicode
- Le débordement Unicode crée un débordement de tampon en insérant des caractères Unicode dans l’entrée attendue de caractères ASCII. (Normes de codage ASCII et Unicode qui permettent aux ordinateurs d’afficher du texte.
- Par exemple, le nombre ASCII 97 correspond à la lettre « a ». Bien que les codes ASCII ne couvrent que les caractères des langues occidentales, Unicode est le monde dans lequel les caractères peuvent être créés. n’importe quelle langue écrite. Si davantage d’autres caractères sont disponibles en Unicode, de nombreux caractères Unicode sont plus gros que la plupart des caractères ASCII.
-
Comment les attaquants exploitent-ils les débordements de tampon ?
- Un pirate peut charger avec précaution une entrée personnalisée dans un programme, initiant l’application pour essayer de stocker l’entrée dans un tampon qui n’est pas assez grand et écraser les parties associées de la mémoire. Si la mémoire tampon du programme est définie, un pirate peut sciemment écraser des espaces identifiés pour contenir du code exécutable.
- Un attaquant pourrait alors modifier ce morceau de code avec son morceau de code exécutable, ce qui pourrait modifier considérablement le fonctionnement du programme.
- Par exemple, si la partie réécrite de la mémoire contient un pointeur (un objet pointant vers un autre emplacement de la mémoire), le code de l’attaquant pourrait remplacer le code pointant vers la charge utile. Cela peut déplacer le contrôle de l’ensemble du programme vers le code de l’attaquant.
- Un débordement de la mémoire tampon peut se produire dans les services de serveur d’applications Web fournissant des structures Web statiques et dynamiques, ou dans l’application elle-même. Les utilisateurs de ces produits sont considérés comme étant à haut risque en raison de leur connaissance approfondie des débordements de mémoire tampon dans les produits souvent serveurs. L’utilisation d’archives dans diverses applications Web, telles que des graphiques, pour générer des images augmente le risque potentiel de débordement des tampons.
- Un débordement de tampon peut être créé dans le code d’applications Web individuelles, et d’autres sont attendus car l’analyse des applications Web n’est pas normale. Les erreurs de débordement de la mémoire tampon sont moins courantes dans certaines applications Web, car beaucoup moins d’acteurs malveillants tentent de capturer et d’exploiter ces erreurs dans une application particulière. Lorsqu’une application particulière la détecte, la possibilité d’exploiter l’erreur est considérablement réduite car le code source de l’application et ses messages d’erreur ne sont généralement pas disponibles pour le pirate informatique.
-
Se protéger d’un Buffer overflow
- Pour se protéger de ce type d’attaque, il est nécessaire de développer des applications à l’aide de langages de programmation évolués, assurant une gestion fine de la mémoire allouée ou bien à l’aide de langage de bas niveau en utilisant des bibliothèques de fonctions sécurisées (par exemple les fonctions strncpy()).
- Des bulletins d’alerte sont régulièrement publiés, annonçant la vulnérabilité de certaines applications à des attaques par débordement de tampon. Suite à ces bulletins d’alerte, les éditeurs des logiciels touchés par la vulnérabilité publient généralement des correctifs (patchs) permettant de corriger la faille. Tout administrateur système et réseau se doit de se tenir informé des alertes de sécurité et d’appliquer le plus rapidement possible les correctifs.
- Les développeurs doivent assurer la sécurité de leur code. Ils doivent utiliser des langages tels que PERL, Java, JavaScript et C#, qui utilisent des mécanismes de sécurité intégrés qui minimisent le risque de débordement de la mémoire tampon.
- Pour qu’une attaque par débordement de tampon se produise, un attaquant doit connaître l’adresse du code exécutable. La randomisation de l’espace d’adressage (ASLR) randomise les espaces d’adressage pour empêcher un attaquant de trouver la localité du code.
- Le mécanisme de prévention de l’exécution des données peut empêcher un attaquant d’exécuter des codes dans une région non exécutable.
- La protection contre l’écrasement du gestionnaire d’exceptions structuré (SEHOP) aide à empêcher le code malveillant d’attaquer la gestion des exceptions structurées (SEH) .
Source: Tout sur la sécurité informatique