34
Gerência de Redes de Computadores - Ataques Remotos- Buffer Overflow Prof. André Peres [email protected]

9 - segurança - ataques buffer-injection

Embed Size (px)

Citation preview

Gerência de Redes de Computadores

- Ataques Remotos-Buffer Overflow

Prof. André [email protected]

Sobre este material

• Vídeos da apresentação em:

https://youtu.be/8L5nKkd_rhw

Este trabalho está licenciado sob uma Licença Creative Commons Atribuição-NãoComercial-SemDerivações 4.0 Internacional. Para ver uma

cópia desta licença, visite http://creativecommons.org/licenses/by-nc-nd/4.0/.

Ataques de Buffer Overflow

• Buffer Overflow

• Estouro de buffer:

• atribuição de volume dados de tamanho superior ao espaço reservado em memória

• causa: falta de verificação no código dos programas

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

• pilha (stack): • cada processo possui uma pilha• estrutura FILO (first in last out)• bloco contínuo de memória junto ao processo• utilizada para:

• armazenamento de parâmetros de funções• variáveis locais de funções/proc• valores para retorno da função (endereços de

retorno)

ex: int exArray[10];

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

Código (RO)

Dados (RW)

Stack (RW)

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

Início do prog

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

código inicial

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

chama proc

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função cód após proc

& cód após procvoid proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após procinicia proc void proc1 () {

char buffer[10];…

}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após proc

cria var bufferde 10 bytes

buffer

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após proc

resto do procbuffer

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após proc

retornoPC <- & cód após proc

buffer

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

funçãocontinua de onde parou

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função segue o código

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

void proc1 () { char buffer[10];

…}

int main (void) { int i=0; proc1 ();

... exit(0);}

Overflow

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

Início do prog

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

código inicial

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

chama proc

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função cód após proc

& cód após procvoid proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após procinicia proc void proc1 () {

char buffer[10];…

}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após proc

cria var bufferde 10 bytes

buffer

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após proc

resto do procbuffer

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após proc

resto do procbuffer

buffer

Usuário entra com volume de dados

maior que 10 bytes

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após proc

resto do procbuffer

buffer

buffer

Invade a área da pilha e escreve sobre o endereço de retorno

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após proc

resto do procbuffer

*cód malicioso*

buffer

o conteúdo extra possui código malicioso

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após proc

resto do procbuffer

*cód malicioso*

& cod mal

e o novo endereço de retorno aponta para este código !!!!

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após proc

buffer

*cód malicioso*

& cod mal

retornoPC <- & cód malicioso

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

Processo:

principal

Dados (RW)

Stack (RW)

função

& cód após proc

buffer

*cód malicioso*

& cod malcód maliciosoexecutado

void proc1 () { char buffer[10];

…}

int main (void) {...

proc1 ();...

exit(0);}

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

• pilha (stack): • Estouro Acidental:

• erro no programa → programa finaliza• mensagem de estouro de buffer (SO)

• Estouro Malicioso• execução de código malicioso• privilégios do processo explorado

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

• Heap:• área de memória do sistema operacional• alocada dinamicamente pelos processos

• não é necessário reservar memória na compilação

• alocada explicitamente (new/malloc/calloc)

ex: int* exArray = new int[10];

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

• Heap:• a memória é alocada em blocos (chunks)• os blocos são interligados via ponteiros

• os ponteiros estão em um cabeçalho (header)• overflow de um bloco permite alterar o header

do próximo bloco (ex: ponteiros)• o atacante consegue incluir chunks controlados

por ele na estrutura alterando os ponteiros• o atacante consegue unir chunks provocando o

overflow na pilha ⇒ alteração do endereço de retorno

Ataques de Buffer Overflow

• Buffer Overflow → conceitos

• Heap:• Estouro Acidental:

• erro em qualquer processo que estiver usando a área da memória invadida (o SO deve proteger)

• Estouro Malicioso• execução de código malicioso• privilégios do processo explorado