« Attaque par Buffer Overflow » : différence entre les versions
Ligne 46 : | Ligne 46 : | ||
[[Fichier:EBP-ESP.PNG]] |
[[Fichier:EBP-ESP.PNG]] |
||
* ESP : pointeur du sommet de la pile. |
* ESP : pointeur du sommet de la pile. |
||
* EBP : (Extended Base Pointer) pointeur de la base de la pile |
* EBP : (Extended Base Pointer) pointeur de la base de la pile |
Version du 12 novembre 2018 à 23:38
Auteurs : Olivier STHIOUL et Ludovic MILLON
Introduction
L'attaque par Buffer Overflow (dépassement de tampon mémoire) est l'exploitation d'une faille de mémoire, durant laquelle l'écriture en mémoire du buffer dépasse son espace mémoire alloué. Le processus subit alors une modification des informations nécessaires au fonctionnement du programme. Ces attaques ciblent le plus souvent des sites web, des applications de bureau ou même le système d'exploitation du serveur qui héberge le site web.
La plupart des failles se trouvent (pour un site web), dans les modules installés sur le serveur comme mod_php ou mod_ssl. Il y a par exemple la possibilité de désactiver des fonctions php dans son fichier de configuration. Par défaut, certaines de ces fonctions sont désactivées car elles ont été reconnues comme comportant des failles de sécurités.
L'attaque a pour objectif de faire crasher le programme ou l'application et d'exploiter une faille, en remplaçant, par exemple, le code source du programme. Un de ses avantages est qu'il n'y a pas besoin d'avoir accès à la machine victime.
Ce type d'attaque nécessite des compétences pointilleuses en informatique et particulièrement en sécurité informatique, et en code assembleur.
Principe de l'attaque
Comme l'attaque Buffer Overflow se base principalement sur la mémoire, il est important d'avoir quelques notions sur la pile d'exécution et sur le code assembleur.
Rappels sur la pile d'exécution
On peut représenter un processus ainsi que sa pile d'exécution par les schémas suivants :
Les zones text et data contiennent respectivement le code source du programme et ses données statiques. Le tas est la zone dans laquelle sont stockées toutes les données allouées dynamiquement.
Dans ce schéma, les adresses sont classées de haut en bas mais les valeurs sont empilées en haut car il s’agit d’une pile. Les différentes zones (en partant du bas du schéma) sont détaillées ci-dessous :
- les paramètres supplémentaires sont ceux passés à la fonction en cours d’exécution : on parle de paramètres « supplémentaires » car les 6 premiers paramètres seront passés dans des registres ;
- l’adresse de retour est l’adresse de l’instruction suivant l’appel de la fonction en cours d’exécution dans la fonction appelante (i.e. c’est là qu’on revient quand on exécute return à la fin de la
fonction) ;
- le %rbp « précédent » est la sauvegarde du pointeur de base de la fonction appelante (on détaillera son rôle plus bas) ;
- les variables locales de la fonction en cours d’exécution sont localisées dans son cadre de pile, à des adresses fixes par rapport à %rbp ;
- on peut éventuellement utiliser de la place dans le cadre de pile pour sauvegarder des registres ou des valeurs temporaires si besoin ;
- les contextes d’exécution s’empilent les uns au dessus des autres lors des appels de fonctions, donc on retrouve la même structure en haut du schéma si la fonction appelée appelle elle-même une autre fonction.
La zone de la pile d'exécution est utilisée par les fonctions (stockage des variables locales et passage des paramètres). Elle se comporte comme une pile, c'est-à-dire dernier entré, premier sorti. Les variables et les paramètres d’une fonction sont empilés avant le début de la fonction et dépilés à la fin de la fonction.
Une fonction est une suite d'instructions. Les instructions d'une fonction peuvent être exécutées (en informatique, on dit que la fonction est appelée) à partir de n'importe quel endroit d'un programme. À la fin de l'exécution des instructions de la fonction, l'exécution doit se continuer à l'instruction du programme qui suit l'instruction qui a appelé la fonction.
Technique
D'un point de vue plus technique, la pile (stack en anglais) est une partie de la mémoire utilisée par l'application pour stocker ses variables locales. Nous allons utiliser l'exemple d'une architecture Intel (32 bits). Lors d'un appel à une sous-routine, le programme empile (push) le pointeur d'instruction (EIP) sur la pile (stack) et saute au code de la sous-routine pour l'exécuter. Après l'exécution, le programme dépile (pop) le pointer d'instruction et retourne juste après l'endroit où a été appelée la sous-routine, grâce à la valeur d'EIP. En effet, comme EIP pointe toujours vers l'instruction suivante, lors de l'appel de la sous-routine il pointait déjà vers l'instruction suivante, autrement dit l'instruction à exécuter après la sous-routine (= adresse de retour).
D'autre part, lors de l'appel de la sous-routine, celle-ci va dans la majorité des cas créer sa propre pile dans la pile (pour éviter de gérer des adresses compliquées). Pour cela elle va empiler la valeur de la base de la pile (EBP) et affecter la valeur du pointeur de pile (ESP) à celle de la base (EBP).
- ESP : pointeur du sommet de la pile.
- EBP : (Extended Base Pointer) pointeur de la base de la pile
- ESP : (Extended Stack Pointer) pointeur du sommet de la pile
Exemple d'attaque
Solutions pour éviter l'attaque
plusieurs solutions s'offrent au développeurs:
- utiliser des langages haut-niveau qui intègre une gestion complète de la mémoire. Ex: Java, Cyclone...
- utiliser des librairies et des fonctions sécurisés (fonction strncpy()..., librairie Libsafe)
- tester son code avec des logiciels spécialisé comme Qaudit ou Flawfinder
- Appliquer rapidement les correctifs
- CerberHost (https://www.youtube.com/watch?v=q1HODJaMY5M)
Sources
https://fr.wikipedia.org/wiki/D%C3%A9passement_de_tampon
https://www.securiteinfo.com/attaques/hacking/buff.shtml
http://www.student.montefiore.ulg.ac.be/~blaugraud/node2.html
https://www.nbs-system.com/blog/cerberhost-les-attaques-de-type-buffer-overflow/
https://zestedesavoir.com/articles/143/exploitez-votre-premier-stack-based-overflow/
https://web.maths.unsw.edu.au/~lafaye/CCM/attaques/buffer-overflow.htm
http://chamilo2.grenet.fr/inp/courses/ENSIMAG3MM1LDB/document/asm_fonctions.pdf
https://fr.wikibooks.org/wiki/Programmation_Assembleur/x86/Registres