1 / 36

Buffer Overflows

Buffer Overflows. Julio Auto - jam. Roteiro. Introdução Stack Overflows Heap Overflows Integer Overflows Format String Attacks Conclusões Referências. Introdução - Prólogo. Fudamentos sobre Intel x86 Ambiente Linux/UNIX Pré-requisito: programação C (ou linguagem de sintaxe similar)

argyle
Télécharger la présentation

Buffer Overflows

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 Overflows Julio Auto - jam

  2. Roteiro • Introdução • Stack Overflows • Heap Overflows • Integer Overflows • Format String Attacks • Conclusões • Referências

  3. Introdução - Prólogo • Fudamentos sobre Intel x86 • Ambiente Linux/UNIX • Pré-requisito: programação C (ou linguagem de sintaxe similar) • No entanto, os conceitos se aplicam a outros S.O.’s, arquiteturas e linguagens modernos

  4. Introdução - Histórico • 1970: Criação da Linguagem C, K&R • 1988: Worm de Robert T. Morris Jr. • 1996: Phrack publica “Smashing The Stack For Fun And Profit”, de AlephOne • 2001: “Exploiting Format String Vulnerabilities”, de scut • 2001: Phrack 57

  5. Introdução – O Que É • Estouro da memória de um buffer • Stack/Heap overflows • Sobrescrita de dados • Comportamento inesperado • Denial of Service • Execução de código arbitrário

  6. Introdução – O Que É (2) /* buf é um array com capacidade para 8 int’s */ for (i = 0; i <= 8; i++) buf[i] = 0; /* o que acontece? */

  7. Introdução – Para Que Serve • Local • Escalação de privilégios • SUID • Remoto • Acesso (de preferência root)

  8. Stack Overflows • A Stack é uma área do espaço de endereçamento de cada processo • LIFO (Push/Pop) • Manipulação indireta do ESP • “Empilha” (para baixo) chamadas às funções • Guarda parâmetros das funções • Guarda variáveis locais às funções

  9. Stack Overflows (2) • Cada função chamada cria um novo frame • Armazenamento do endereço de retorno (call) • Armazenamento do EBP • Ao término da função, o frame é destruído • EBP restaurado • Controle dado para a instrução apontada pelo endereço de retorno (ret)

  10. Stack Overflows (3) Figura tirada de: http://www.unixwiz.net

  11. Stack Overflows (4) • Imagine que “local var #2” é um array de 4 char’s • O que acontece quando executamos a seguinte linha de código passando uma string “evil” maior do que 3 caracteres? strcpy (localvar2, evil);

  12. Stack Overflows (5)

  13. Stack Overflows (6) • Sobrescrita de memória indevida • Qual a importância dos valores na memória sobrescrita? • Quão importante são para o fluxo do programa? • Podemos controlar esses valores?

  14. Stack Overflows (7) • Variáveis locais = (possivelmente) não tão importantes • EBP e EIP = problemas maiores • Controle do EIP = controle do fluxo • Mas controlar para onde? • Shellcode!

  15. Stack Overflows (8) • Shellcode • Código a ser executado pelo programa comprometido • Pode ser armazenado no próprio buffer • Afinal de contas, código é apenas uma sequência de bytes

  16. Stack Overflows (9) • Quanto espaço um shellcode precisa? • Shell local ~ 24 bytes • Bindshell ~ 80 bytes • Normalmente, menos do que há disponível

  17. Stack Overflows (10) • Como saber o endereço do shellcode? • Normalmente, a stack está sempre na mesma posição quando o bug ocorre • Brute-Force • Algumas melhorias • NOPs • Variáveis de Ambiente

  18. Stack Overflows (11) • Contra-medidas • Non-execstack • ASLR(Address Space Layout Randomization) • Programação decente  • Contra-contra-medidas • ret-into-libc

  19. Heap Overflows • Heap = espaço para alocação de memória dinâmica • malloc() • calloc() • realloc() • free()

  20. Heap Overflows (2) • Diferentes implementações do algoritmo de memory management (malloc): • Doug Lea • BSD Kingsley • BSD PHK • System V • Yorktown • RtlHeap

  21. Heap Overflows (3) • Heap Overflows mais complicados de explicar que Stack Overflows • Dependem da implementação do malloc • ‘Chunks’ de malloc contêm headers: • Tamanho do chunk, • Tamanho do chunk anterior, • Flags...

  22. Heap Overflows (4) • O interessante agora é sobrescrever os valores desses headers • O algoritmo pode fazer algo indevido se os valores nos headers foram corrompidos • Durante um free(), o algoritmo de Doug Lea pode escrever o endereço de nosso buffer em outro endereço (arbitrário)

  23. Heap Overflows (5) • Sobrescrita do endereço de retorno com o endereço do buffer • Buffer = Shellcode • Double-free’s • Dois free()’s de um mesmo ponteiro também corrompem as estruturas do malloc • Depois disso, dois malloc()’s consecutivos podem retornar o mesmo ponteiro

  24. Heap Overflows (5) • Contra-medidas • XÅW • Ajuda de heap profilers no desenvolvimento • Programação decente 

  25. Integer Overflows • Estouro dos limites de um inteiro • ie., um número muito grande para caber em um int é “truncado” • Como bug, sozinho não é tão perigoso • Mas pode ser usado como vetor para o disparo de outros bugs

  26. Integer Overflows (2) • Antiga vulnerabilidade no OpenSSH: input_userauth_info_response() em auth2-chall.c: 258 nresp = packet_get_int(); 259 if (nresp > 0) { 260 response = xmalloc(nresp * sizeof(char*)); 261 for (i = 0; i < nresp; i++) 262 response[i] = packet_get_string(NULL); 263 }

  27. Integer Overflows (3) • Contra-medidas • Programação decente 

  28. Format String Attacks • Format Strings são strings usadas para formatar um número arbitrário de parâmetros de tipo arbitrário em uma única string, eg.: /* sprintf (char *buffer, const char *format [, argument, ...]); */ sprintf(output, “Nome: %s\nNumero: %d\n”, nome, numero); printf(“Dados:\n%s”, output);

  29. Format String Attacks (2) • E se uma format string recebe mais argumentos do que os que foram passados para a função? • Ela vai ler (ou escrever) o que estiver na stack

  30. Format String Attacks (3) • O problema está quando o programa nos deixa controlar a format string: • Poderia ser feito diferente? /* fprintf (FILE *stream, const char *format [, argument, ...]); */ fprintf(file, string); /* fprintf (FILE *stream, const char *format [, argument, ...]); */ fprintf(file, “%s”, string);

  31. Format String Attacks (4) • Format Strings maliciosas podem: • Ler o conteúdo de qualquer lugar na memória • Escrever qualquer valor em qualquer lugar da memória • O resto não é novidade: • Injeção do shellcode, • Sobrescrita do endereço de retorno...

  32. Format String Attacks (5) • Contra-medidas • Programação decente 

  33. Conclusões • Buffer Overflow é um dos tipos de bug mais comuns e mais perigosos • A exploração de um buffer overflow pode invalidar várias medidas de segurança: • Firewalls, • Criptografia...

  34. Conclusões (2) • O mundo procura por soluções: • Linguagens “seguras”, • Softwares de bug-hunting, • Proteções em memory-level... • Até lá, somente uma medida se mostra infalível: • Programação decente 

  35. Referências • Phrack - http://www.phrack.org/ • sshutup-theo - http://packetstormsecurity.org/0207-exploits/sshutup-theo.tar.gz

  36. Buffer Overflows Julio Auto - jam

More Related