360 likes | 526 Views
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)
E N D
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) • No entanto, os conceitos se aplicam a outros S.O.’s, arquiteturas e linguagens modernos
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
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
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? */
Introdução – Para Que Serve • Local • Escalação de privilégios • SUID • Remoto • Acesso (de preferência root)
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
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)
Stack Overflows (3) Figura tirada de: http://www.unixwiz.net
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);
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?
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!
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
Stack Overflows (9) • Quanto espaço um shellcode precisa? • Shell local ~ 24 bytes • Bindshell ~ 80 bytes • Normalmente, menos do que há disponível
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
Stack Overflows (11) • Contra-medidas • Non-execstack • ASLR(Address Space Layout Randomization) • Programação decente • Contra-contra-medidas • ret-into-libc
Heap Overflows • Heap = espaço para alocação de memória dinâmica • malloc() • calloc() • realloc() • free()
Heap Overflows (2) • Diferentes implementações do algoritmo de memory management (malloc): • Doug Lea • BSD Kingsley • BSD PHK • System V • Yorktown • RtlHeap
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...
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)
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
Heap Overflows (5) • Contra-medidas • XÅW • Ajuda de heap profilers no desenvolvimento • Programação decente
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
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 }
Integer Overflows (3) • Contra-medidas • Programação decente
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);
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
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);
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...
Format String Attacks (5) • Contra-medidas • Programação decente
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...
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
Referências • Phrack - http://www.phrack.org/ • sshutup-theo - http://packetstormsecurity.org/0207-exploits/sshutup-theo.tar.gz
Buffer Overflows Julio Auto - jam