A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Buffer Overflow ou Stack Overrun ou Stack Smashing.

Apresentações semelhantes


Apresentação em tema: "Buffer Overflow ou Stack Overrun ou Stack Smashing."— Transcrição da apresentação:

1 Buffer Overflow ou Stack Overrun ou Stack Smashing

2 Overflow: Rotina Vulnerável Exemplo de rotina vulnerável para executar um ShellCode void read_username (void) { char username[128]; char readbuf[256]; fgets(readbuf, 256, stdin); strcpy(username, readbuf); } exemplo3.c

3 Overflow: Correção 1 Correção do número de caracteres lidos void read_username (void) { char username[128]; char readbuf[256]; fgets(readbuf, 128, stdin); strcpy(username, readbuf); } exemplo3.c

4 Overflow: Correção 2 Uso da rotina strncopy void read_username (void) { char username[128]; char readbuf[256]; fgets(readbuf, 128, stdin); strncpy(username, readbuf, 128); } exemplo3.c

5 Overflow: Correção 3 Inversão da ordem de declaração das variáveis void read_username (void) { char readbuf[256]; char username[128]; fgets(readbuf, 128, stdin); strncpy(username, readbuf, 128); } exemplo3.c

6 Overflow: Correção 4 Uso de um valor canário void read_username (void) { int canary = 17; char readbuf[256]; char username[128]; fgets(readbuf, 128, stdin); strncpy(username, readbuf, 128); if (canary !=17) {exit(1)} } exemplo3.c

7 strcpy() Overflow: Tamanho do String Endereço de retorno na pilha deve receber um endereço (metade final do buffer) readbuf... 0x00 username username[128] 128 bytes... RET ShellCode NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP RET

8 strcpy() Overflow: Tamanho do String Envio de string muito curto - endereço de retorno não é alterado readbuf... 0x00 username username[128] 128 bytes... RET ShellCode NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP RET

9 strcpy() Overflow: Tamanho do String String muito longo - shellcode (ou nop's) substituem o endereço de retorno readbuf... 0x00 username username[128] 128 bytes... RET ShellCode NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP RET NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP

10 Red Hat / Fedora e a pilha Normalmente atacante usa o valor do Stack Pointer da própria máquina como referência –Os valores iniciais do SP tendem a ser próximos entre máquinas semelhantes (arquitetura e sistema operacional) offset... ret... ret... servidor ESP antes da execução ESP atacante username[128] outras variáveis ESP 0x00 outras variáveis

11 Randomização da pilha Para cada processo criado, o Stack Pointer varia randomicamente /proc/sys/kernel/exec-shield /proc/sys/kernel/exec-shield-randomize Offset variável... ret... ret... servidor ESP antes da execução ESP atacante username[128] outras variáveis ESP 0x00 outras variáveis Área vazia de tamanho variável e aleatório

12 Evitando Detectores de Intrusão Camuflando a sequência de NOPs (0x90) –Utilizar outras instruções de 1 byte inc eax0x40 @ inc ebx 0x43 C inc ecx 0x41 A inc edx 0x42 B dec eax 0x48 H dec ebx 0x4B K dec ecx 0x49 I dec edx 0x4A J –Registradores são alterados; mas shellcode recarrega.... RET ShellCode NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP NOPNOP

13 Evitando o Ataque Arquitetura: Segmento de Pilha não executável (NX) Compilador: inserção de valor randômico na pilha (canário) e verificação antes do retorno (stack guard) Sistema Operacional: alocação de espaço randômico na pilha (Red Hat: Exec Shield) Programador: uso de bibliotecas mais seguras (ex.: strncpy) e boas práticas

14 Overflow: Rotina Vulnerável gcc: flag fstack-protector fno-stack-protector : push %ebp : mov %esp,%ebp : sub $0x10,%esp : lea 0xfffffff2(%ebp),%eax : mov %eax,0xfffffffc(%ebp) :leave :ret Rotina teste do exemplo1.c fstack-protector : push %ebp : mov %esp,%ebp : sub $0x28,%esp : mov %gs:0x14,%eax :mov %eax,0xfffffffc(%ebp) :xor %eax,%eax :lea 0xfffffff2(%ebp),%eax :mov %eax,0xffffffec(%ebp) :mov 0xfffffffc(%ebp),%eax :xor %gs:0x14,%eax :je :call :leave :ret

15 Outros Overflows

16 Heap Overflow Explora implementações específicas para malloc() e free() Permite a escrita de dados quaisquer para endereços quaisquer Documentado na Phrack 57 Cada compilador tem algoritmos distintos para gerencia do heap Sistemas operacionais fornecem algoritmos de gerência para os aplicativos utilizarem

17 Heap Overflow: Win2k Depois da alocação de dois blocos de 32 bytes a memória fica com a seguinte organização +0 +32 +64 Block A control data Block B control data Memory Block A Memory Block B Uninteresting memory

18 Heap Overflow: Win2k Fazendo um overflow no primeiro bloco, pode-se sobre-escrever o segundo bloco de controle +0 +32 +64 Block A control data Block B control data Memory Block A Memory Block B Uninteresting memory

19 Heap Overflow: Win2k Quando o segundo bloco for liberado, o atacante forneceu o seu bloco de controle Alterando convenientemente os campos do bloco de controle B, dados para atualização da memória serão lidos do bloco de memória A +0 +32 Block A control data Block B control data Memory Block A Memory Block B

20 Overflow de pilha por-um Off-by-one: escreve um byte além do tamanho do buffer Motivação: strncopy limita o tamanho da cópia, mas não garante a terminação do string Programador "desleixado" pensa que buffer vai de 1 a n (quando na realidade vai de 0 a n-1) Colocar um zero em buffer[size_buffer] coloca um zero além do buffer!

21 Overflow por-um Buffer totalmente preenchido saved_EBP saved_EIP byte inferior de saved_EBP é zerado (arquitetura little endian) Retorno da rotinamovesp, ebp pop ebp ret ebp

22 Overflow por-um saved_EBP saved_EIP Retorno da rotinamovesp, ebp pop ebp ret byte inferior de EBP é zerado ebp saved_EBP esp

23 Overflow por-um Retorno da rotinamovesp, ebp pop ebp ret saved_EIP O valor em EBP (o ponteiro base do stack frame é agora o valor modificado ! esp ip saved_EIP (retorno normal)

24 Overflow por-um Dados (fornecidos pelo usuário) saved_EBP saved_EIP Retorno da próxima função:mov esp, ebp ESP desliza na memória (seu byte inferior foi zerado) para a área de dados. Pode-se então fornecer um novo endereço de retorno (saved_EIP) ESP deveria apontar para cá..... mas aponta para cá...

25 Bugs em strings de formatação Tipo de bug surgido em 2000 Afeta a função printf() Facílimo de detectar (análise do código fonte) Permite leitura e escrita de posições quaisquer de memória Não sobre-escreve registradores da CPU Praticamente "extinto"

26 Bugs em strings de formatação Função printf printf("Mary has %d cats", cats); Printf mescla dois "fluxos" –String de formatação –Lista de variáveis (parâmetros) - que estão na pilha! –Nada garante que os dois fluxos estão sincronizados Exemplos: printf("Mary has %d cats and %d dogs"); printf("%08x"); Imprimem dados da pilha (onde os parâmetros deveriam estar…)

27 Bugs em strings de formatação E para escrever valores? Uso de %n : fornece o número de caracteres impressos até agora na variável especificada como parâmetro Exemplo: ver artigo de Tim Newsham em http://www.securityfocus.com/archive/1/81565 e artigo de David Lichfield em http://www.nextgenss.com/papers/win32format.doc

28 Bugs em strings de formatação Falha básica: int main (int argc, char *argv[]) { printf(argv[1]); exit(0); } Usuário controla a impressão! Melhor seria prinft("%s",argv[1]);

29 Bugs em strings de formatação Estrutura da pilha durante uma chamada normal para printf() : printf(%lx---%s----%d, v1, puf, var2); Dados locais Endereço de retorno Ponteiro para string de formato

30 Bugs em strings de formatação Dados maliciosos fornecidos pelo atacante Endereço de retorno Ponteiro para string de formato Estrutura da pilha durante uma chamada maliciosa de printf() : printf(stuff); // Stuff é ajustado para conter // %.200lx%n%.40lx%n


Carregar ppt "Buffer Overflow ou Stack Overrun ou Stack Smashing."

Apresentações semelhantes


Anúncios Google