Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouFernanda Imperial Alterado mais de 10 anos atrás
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.