Vous êtes sur la page 1sur 27

Buffer Overflow

Sécurité applicative – M2 -SSI


Buffer Overflow (Débordement de tampon)
• un tampon est une zone d'emplacements de mémoire adjacents alloués à
un programme ou à une application pour gérer ses données d'exécution
• le débordement ou le dépassement de la mémoire tampon est une
vulnérabilité courante dans une application ou un programme qui accepte
plus de données que la mémoire tampon allouée
• cette vulnérabilité permet à l'application de dépasser le tampon lors de
l'écriture de données dans le tampon et d'écraser les emplacements
mémoire voisins
• l'attaquant exploite cette vulnérabilité pour injecter du code malveillant
dans le tampon afin d’endommager les fichiers, modifier les données du
programme, accéder à des informations critiques, élever les privilèges,
accéder au shell, etc.
Pourquoi les applications et les
programmes sont vulnérables ?
• manque de vérification des • ne pas définir les principes
limites de filtrage et de validation
• utiliser les anciennes appropriés
versions du langage de • exécuter le code présent
programmation dans le segment de pile
• utiliser des fonctions • allocation de mémoire
dangereuses et vulnérables incorrecte
• manque de bonnes • assainissement insuffisant
pratiques de des entrées
programmation
Buffer overflow basé sur la pile
• une pile est utilisée pour l'allocation de
mémoire statique et stocke les éléments
vulnérables dans l'ordre « dernier entré,
premier sorti » (LIFO)
• Il existe deux types d’opérations dans la pile
– PUSH enregistre la donnée dans la pile
– POP retire la donnée de la pile
Buffer overflow basé pile

lorsqu'une fonction démarre l'exécution, une


trame de pile est empilée sur la pile dans le
registre ESP
Lors du function return, la trame de pile est
dépilée et l'exécution reprend à partir de
l'adresse de retour stockée dans le registre EIP
si une application est vulnérable au
débordement de tampon basé sur la pile, les
attaquants prennent le contrôle du registre EIP
pour remplacer l'adresse de retour de la
fonction par le code malveillant qui leur
permet d'accéder au shell du système cible
Buffer overflow basé pile
Heap based overflow
• Le heap memory est allouée dynamiquement au moment de l'exécution
pendant l'exécution du programme et stocke les données du programme
• Heap based overflow se produit lorsqu'un bloc de mémoire est alloué à un
heap et que les données sont écrites sans aucune vérification des limites
• cette vulnérabilité conduit à l'écrasement des pointeurs d'objets
dynamiques, des en-têtes de heap, des données basées sur les heap, des
tables de fonctions virtuelles, etc.
• Les attaquants, exploitent le heap based buffer overflow pour prendre le
contrôle de l'exécution du programme. contrairement aux stack based
overflow. les heap based buffer overflow sont incohérents et ont des
techniques d'exploitation différentes
Buffer overflow

EXPLOITATION DU BUFFER OVERFLOW


Étapes d’exploitation
1. Faire du spiking 5. Identifier les bad
2. Faire du fuzzing characters
3. Identifier l’offset 6. Identifier les droits des
4. Écraser le registre EIP modules
7. Générer les shellcode
8. Obtenir l’acces root
Exploitation – spiking
• le spiking permet aux attaquants d'envoyer des paquets TCP ou UDP
spécialement conçus au serveur vulnérable afin de le faire planter
• le spiking aide les attaquants à identifier les vulnérabilités dans les
applications cibles
Exploitation - Fuzzing
• L’attaquant utilise le fuzzing pour
envoyer une grande quantité
d’informations vers le serveur cible
afin de réaliser le buffer overflow
et l’écrasement du registre EIP
• Le fuzzing aide à identifier le
nombre d’octets nécessaires au
crash du serveur cible
• Cette information aide à identifier
l’emplacement exacte du registre
EIP, ce qui aide à l’injection du code
malicieux
Exploitation – identification de l’offset
• On peut utiliser les outils ruby pattern_create et patterne_offset de metasploit pour
identifier l’offset et la position exacte à partir de laquelle commence l’ecrasement d’EIP
Ecrasement du registre EIP
• L’ecrasement du registre EIP permet à l’attaquant de savoir si le registre EIP peut
être contrôlé et écrasé par un shellcode malicieux
Exploitation – identification des Bad Char
• Avant l’injection du Shellcode dans le registre EIP l’attaquant doit identifier
les bad char qui peuvent poser des problèmes dans le Shellcode
• Exp « \x00 »
Exploitation – identification des droits des
modules
• Lors de cette phase l’attaquant identifie les droit des modules du serveurs
vulnérable qui manquent de protection mémoire
• Sur immunity debugger on peut utiliser des des scripts tel que mona.py pour
identifier les modules vulnérables
• Les phases de génération de shell code et son
injection seront vues en détail en TP
Les outils de détection
• OllyDbg
– Debugger analyseur niveau assembleur. Il trace
dynamiquement les trames de pile et l'exécution
du programme, et il enregistre les arguments des
fonctions connues
• Veracode, Flawfinder, Kiuwan, Splint, BOVSTT
Se défendre contre le buffer overflow
• Développer des programmes en respectant les guides et bonnes pratique de
développement sécurisé
• Utilise la technique ASLR (adress space layout randomization)
• Valider les arguments et minimiser les codes nécessitant des privilèges root
• Faire des révisions de code via des analyses statiques et dynamiques du code
source
• Permettre aux compilateurs de borner les buffers
• Implémenter des contrôleurs de bornes automatiques
Se défendre contre le buffer overflow
• Toujours protéger le pointeur de retours dans la pile
• Interdire l’execution du code en dehors de l’espace alloué au code
• Patcher régulièrement l’OS et les applications
• Faire des inspections de code manuellement en utilisant des checklistes afin de
s’assurer que le code respecte certains critères
• Utiliser des DEP (Data execution prevention) pour marquer certaines zones
mémoires comme etant non executables
• implémenter la vérification de l'intégrité de l'exécution des données pour détecter
si un pointeur de code a été corrompu avant qu'il ne soit déréférencé
Les types de buffer overflow
• Stack overflow
– Il s'agit du type d'attaque le plus courant. Il implique le
débordement d'un tampon sur la pile d'appels
• Heap overflow
– Ce type d'attaque cible les données dans le pool de mémoire
ouvert connu sous le nom de heap
• Integer overflow
– Dans un débordement d'entier, une opération arithmétique
aboutit à un entier (nombre entier) trop grand pour le type entier
censé le stocker
• Unicode overflow
– il crée un débordement de tampon en insérant des caractères
Unicode dans une entrée qui attend des caractères ASCII.
Tout ça c’est de la théorie mais qu’en est il des
faits ?
Plateformes Techniques d’exploitation
Windows XP –SP1, SP2,… Buffer overflow simple
Windows Vista –SP…. SEH, SafeSEH
Windows 7, 8, 10 NX, DEP
Windows server 2003, 2008,… ASLR
Linux Stack Cookies
Mac OSX …..
Et plus récemment les OS mobiles avec leurs ……
chipset ARM

Vous aimerez peut-être aussi