Heap Functions Security Checks

Apoya a HackTricks

Para más información, revisa:

Esta es un resumen de las verificaciones realizadas:

  • Verificar si el tamaño indicado del chunk es el mismo que el prev_size indicado en el siguiente chunk

  • Mensaje de error: corrupted size vs. prev_size

  • Verificar también que P->fd->bk == P y P->bk->fw == P

  • Mensaje de error: corrupted double-linked list

  • Si el chunk no es pequeño, verificar que P->fd_nextsize->bk_nextsize == P y P->bk_nextsize->fd_nextsize == P

  • Mensaje de error: corrupted double-linked list (not small)

_int_malloc

Para más información, revisa:

  • Verificaciones durante la búsqueda en fast bin:

  • Si el chunk está desalineado:

  • Mensaje de error: malloc(): unaligned fastbin chunk detected 2

  • Si el chunk siguiente está desalineado:

  • Mensaje de error: malloc(): unaligned fastbin chunk detected

  • Si el chunk devuelto tiene un tamaño incorrecto debido a su índice en el fast bin:

  • Mensaje de error: malloc(): memory corruption (fast)

  • Si algún chunk utilizado para llenar el tcache está desalineado:

  • Mensaje de error: malloc(): unaligned fastbin chunk detected 3

  • Verificaciones durante la búsqueda en small bin:

  • Si victim->bk->fd != victim:

  • Mensaje de error: malloc(): smallbin double linked list corrupted

  • Verificaciones durante la consolidación realizadas para cada chunk en fast bin:

  • Si el chunk está desalineado:

  • Mensaje de error: malloc_consolidate(): unaligned fastbin chunk detected

  • Si el chunk tiene un tamaño diferente al que debería debido a su índice:

  • Mensaje de error: malloc_consolidate(): invalid chunk size

  • Si el chunk anterior no está en uso y tiene un tamaño diferente al indicado por prev_chunk:

  • Mensaje de error: corrupted size vs. prev_size in fastbins

  • Verificaciones durante la búsqueda en unsorted bin:

  • Si el tamaño del chunk es extraño (demasiado pequeño o demasiado grande):

  • Mensaje de error: malloc(): invalid size (unsorted)

  • Si el tamaño del chunk siguiente es extraño (demasiado pequeño o demasiado grande):

  • Mensaje de error: malloc(): invalid next size (unsorted)

  • Si el tamaño previo indicado por el chunk siguiente difiere del tamaño del chunk:

  • Mensaje de error: malloc(): mismatching next->prev_size (unsorted)

  • Si no victim->bck->fd == victim o no victim->fd == av (arena):

  • Mensaje de error: malloc(): unsorted double linked list corrupted

  • Como siempre estamos verificando el último, su fd debería apuntar siempre a la estructura de arena.

  • Si el chunk siguiente no indica que el anterior está en uso:

  • Mensaje de error: malloc(): invalid next->prev_inuse (unsorted)

  • Si fwd->bk_nextsize->fd_nextsize != fwd:

  • Mensaje de error: malloc(): largebin double linked list corrupted (nextsize)

  • Si fwd->bk->fd != fwd:

  • Mensaje de error: malloc(): largebin double linked list corrupted (bk)

  • Verificaciones durante la búsqueda en large bin (por índice):

  • bck->fd-> bk != bck:

  • Mensaje de error: malloc(): corrupted unsorted chunks

  • Verificaciones durante la búsqueda en large bin (siguiente más grande):

  • bck->fd-> bk != bck:

  • Mensaje de error: malloc(): corrupted unsorted chunks2

  • Verificaciones durante el uso del Top chunk:

  • chunksize(av->top) > av->system_mem:

  • Mensaje de error: malloc(): corrupted top size

tcache_get_n

  • Verificaciones en tcache_get_n:

  • Si el chunk está desalineado:

  • Mensaje de error: malloc(): unaligned tcache chunk detected

tcache_thread_shutdown

  • Verificaciones en tcache_thread_shutdown:

  • Si el chunk está desalineado:

  • Mensaje de error: tcache_thread_shutdown(): unaligned tcache chunk detected

__libc_realloc

  • Verificaciones en __libc_realloc:

  • Si el puntero antiguo está desalineado o el tamaño era incorrecto:

  • Mensaje de error: realloc(): invalid pointer

_int_free

Para más información, revisa:

  • Verificaciones al inicio de _int_free:

  • El puntero está alineado:

  • Mensaje de error: free(): invalid pointer

  • Tamaño mayor que MINSIZE y tamaño también alineado:

  • Mensaje de error: free(): invalid size

  • Verificaciones en _int_free tcache:

  • Si hay más entradas que mp_.tcache_count:

  • Mensaje de error: free(): too many chunks detected in tcache

  • Si la entrada no está alineada:

  • Mensaje de error: free(): unaligned chunk detected in tcache 2

  • Si el chunk liberado ya fue liberado previamente y está presente como chunk en el tcache:

  • Mensaje de error: free(): double free detected in tcache 2

  • Verificaciones en _int_free fast bin:

  • Si el tamaño del chunk es inválido (demasiado grande o pequeño) desencadenar:

  • Mensaje de error: free(): invalid next size (fast)

  • Si el chunk añadido ya estaba en la parte superior del fast bin:

  • Mensaje de error: double free or corruption (fasttop)

  • Si el tamaño del chunk en la parte superior tiene un tamaño diferente al chunk que estamos añadiendo:

  • Mensaje de error: invalid fastbin entry (free)

_int_free_merge_chunk

  • Verificaciones en _int_free_merge_chunk:

  • Si el fragmento es el fragmento superior:

  • Mensaje de error: doble liberación o corrupción (top)

  • Si el siguiente fragmento está fuera de los límites del área de memoria:

  • Mensaje de error: doble liberación o corrupción (out)

  • Si el fragmento no está marcado como usado (en el prev_inuse del fragmento siguiente):

  • Mensaje de error: doble liberación o corrupción (!prev)

  • Si el siguiente fragmento tiene un tamaño demasiado pequeño o demasiado grande:

  • Mensaje de error: free(): tamaño siguiente no válido (normal)

  • Si el fragmento anterior no está en uso, intentará consolidar. Pero, si el prev_size difiere del tamaño indicado en el fragmento anterior:

  • Mensaje de error: tamaño corrupto vs. prev_size al consolidar

_int_free_create_chunk

  • Verificaciones en _int_free_create_chunk:

  • Al agregar un fragmento al contenedor no ordenado, verificar si unsorted_chunks(av)->fd->bk == unsorted_chunks(av):

  • Mensaje de error: free(): fragmentos no ordenados corruptos

do_check_malloc_state

  • Verificaciones en do_check_malloc_state:

  • Si el fragmento del contenedor rápido está desalineado:

  • Mensaje de error: do_check_malloc_state(): detectado fragmento rápido desalineado

malloc_consolidate

  • Verificaciones en malloc_consolidate:

  • Si el fragmento del contenedor rápido está desalineado:

  • Mensaje de error: malloc_consolidate(): detectado fragmento rápido desalineado

  • Si el tamaño del fragmento del contenedor rápido es incorrecto:

  • Mensaje de error: malloc_consolidate(): tamaño de fragmento no válido

_int_realloc

  • Verificaciones en _int_realloc:

  • El tamaño es demasiado grande o demasiado pequeño:

  • Mensaje de error: realloc(): tamaño antiguo no válido

  • El tamaño del siguiente fragmento es demasiado grande o demasiado pequeño:

  • Mensaje de error: realloc(): tamaño siguiente no válido

Last updated