(Buffer Overflow…) Tópicos de Engenharia de Computação B Professor: Edmar Rezende Alunos: Artur Praseres Varejão Everton Segato Zanon Guilherme Hayashi Raphael Ricciotti RA: 04142030 RA: 04251559 RA: 04122529 RA: 04148235 Agenda • Introdução • Visão Geral • Ataques • Buffer Overflow Baseado em Pilha • Buffer Overflow Baseado em Heapy • Buffer Overflow de Retorno a Libc • • • • Códigos Prevenção Demonstração Perguntas Introdução • O que é? • É uma falha de segurança cometida por falha do programador durante o período de desenvolvimento de um software. • Quando ocorre ? • Ocorre quando o tamanho do buffer ultrapassa sua capacidade máxima de armazenamento. • Vulnerabilidade • O envio de dados maliciosos à um programa por meio de um buffer de dados não dimensionado, podendo corromper dados, quebrar o programa ou executar código malicioso Visão Geral • Exemplo: • A: • B: • CONSEQUENCIAS: – FUNCIONAMENTO ERRADO – FALHA DE SEGMENTAÇÃO – HORAS DE DESENVOLVIMENTO PERDIDO – TEMPO ELEVADO PARA ENCONTRAR O ERRO Estruturas adjacentes: A – cadeia de caracteres B – número -> Inserir a palavra transbordar na estrutura A o que vai acontecer? Ataques • Como é explorada esta Vulnerabilidade? • Explorando-se esta vulnerabilidade pode-se deixar que informações contidas em memória sejam sobrescritas por dados inconsistentes como a área de memória onde se encontra, valor de variáveis locais, parâmetros e/ou endereço de retorno de uma função. Os dados maliciosos podem substituir o endereço de retorno da função, transferindo assim os dados para o controle do atacante. • Tipos de Ataque • Buffer Overflow Baseado em Pilha • Buffer Overflow Baseado em Heapy • Buffer Overflow de Retorno a Libic Buffer Overflow Baseado em Pilha • Como Funciona? • A técnica de exploração mais simples e comum, atua pela alteração do estado da pilha durante a execução do programa para direcionar a execução para o código malicioso contido no buffer estourado • Formato Buffer Overflow Baseado em Heap • Como Funciona? • Bem mais difícil de explorar, por causa da disciplina de acesso à heap (blocos não contíguos, fragmentação interna). Deve-se estourar o buffer armazenado na área da heap em direção ao endereço de retorno na pilha, para direcionar a execução para o código malicioso que se encontra no buffer estourado • Formato Buffer Overflow de Retorno a Libc • Como Funciona? • Alteram o fluxo de execução pelo estouro de algum buffer na pilha ou heap, para algum trecho de código armazenado no segmento de texto do programa. Tipicamente este trecho de código é alguma chamada de função comumente utilizada da biblioteca padrão libc, como as chamadas de execução arbitrária de comandos (funções da família exec(3)).. • Formato Exemplos com códigos void processaParam ( char * arg ) { char buffer[10]; strcpy(buffer, arg); /* PROBLEMA: se a string arg tiver mais que 10 caracteres então ela irá exceder o tamanho de buffer provocando um buffer overflow */ printf(buffer); } void main ( int argc, char *argv[] ) { if(arg > 1) { printf(“param: %s\n”, argv[1]); processaParam(argv[1]); } } Prevenção • Como evitar • Boas Práticas de programação para evitar ataques de Buffer Overflow mostram que o ideal é evitar funções que não especifiquem o número máximo de caracteres a serem copiados entre strings. • Tabela de risco de funções: US-Cert – Falha de BO no Winamp Demonstração Perguntas