« Attaque par Buffer Overflow » : différence entre les versions
Ligne 24 : | Ligne 24 : | ||
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 : |
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 |
* 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 ; |
||
⚫ | |||
paramètres « supplémentaires » car les 6 premiers paramètres seront passés dans des registres ; |
|||
⚫ | |||
dans la fonction appelante (i.e. c’est là qu’on revient quand on exécute return à la fin de la |
|||
fonction) ; |
fonction) ; |
||
* le %rbp « précédent » est la sauvegarde du pointeur de base de la fonction appelante (on détaillera |
* le %rbp « précédent » est la sauvegarde du pointeur de base de la fonction appelante (on détaillera son rôle plus bas) ; |
||
⚫ | |||
son rôle plus bas) ; |
|||
⚫ | |||
⚫ | |||
⚫ | |||
des adresses fixes par rapport à %rbp ; |
|||
⚫ | |||
des valeurs temporaires si besoin ; |
|||
⚫ | |||
on retrouve la même structure en haut du schéma si la fonction appelée appelle elle-même une |
|||
autre fonction. |
|||
== Technique == |
== Technique == |
Version du 12 novembre 2018 à 23:13
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
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.
Technique
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