segunda-feira, 25 de agosto de 2014

Da Série: Melhor prevenir do que remediar - Heap Overflow

Dando continuação a série, mostrando algumas dicas de como se proteger de ataques de buffer overflow. Desta vez iremos falar de Heap Overflow.

Estouros de Heap são problemáticos pelo fato de que não são necessariamente protegidos pro CPU capazes de usar pilhas não-executáveis. Um Heap é uma área da memória alocada pela aplicação em tempo de execução para armazenar dados. O seguinte exemplo, em C, mostra um exploração de Heap overflow.

 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>

 #define BSIZE 16
 #define OVERSIZE 8 /* overflow buf2 by OVERSIZE bytes */

 void main(void) {
    u_long b_diff;
    char *buf0 = (char*)malloc(BSIZE);  // create two buffers
    char *buf1 = (char*)malloc(BSIZE);

    b_diff = (u_long)buf1 - (u_long)buf0; // difference between locations
    printf("Initial values:  ");
    printf("buf0=%p, buf1=%p, b_diff=0x%x bytes\n", buf0, buf1, b_diff);

    memset(buf1, 'A', BUFSIZE-1), buf1[BUFSIZE-1] = '\0';
    printf("Before overflow: buf1=%s\n", buf1);

    memset(buf0, 'B', (u_int)(diff + OVERSIZE));
    printf("After overflow:  buf1=%s\n", buf1);
}

[root /tmp]# ./heaptest

Initial values:  buf0=0x9322008, buf1=0x9322020, diff=0xff0 bytes
Before overflow: buf1=AAAAAAAAAAAAAAA
After overflow:  buf1=BBBBBBBBAAAAAAA

Este simples programa acima, mostra dois buffers sendo alocados no heap.
  • O primeiro buffer é "estourado" para sobrescrever o conteúdo do segundo buffer.
Como determinar se você é vulnerável e como se proteger:

É preciso utilizar das mesmas dicas de como se proteger de Stack Overflow, veja o post anterior.

Fonte:
https://www.owasp.org/index.php/Buffer_Overflows#Heap_Overflow

Nenhum comentário:

Postar um comentário