mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
164 lines
7.0 KiB
Markdown
164 lines
7.0 KiB
Markdown
# Heap Functions Security Checks
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|
|
|
|
## unlink
|
|
|
|
Para más información, consulta:
|
|
|
|
{{#ref}}
|
|
unlink.md
|
|
{{#endref}}
|
|
|
|
Este es un resumen de las comprobaciones 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, consulta:
|
|
|
|
{{#ref}}
|
|
malloc-and-sysmalloc.md
|
|
{{#endref}}
|
|
|
|
- **Comprobaciones durante la búsqueda en fast bin:**
|
|
- Si el chunk está desalineado:
|
|
- Mensaje de error: `malloc(): unaligned fastbin chunk detected 2`
|
|
- Si el chunk hacia adelante está desalineado:
|
|
- Mensaje de error: `malloc(): unaligned fastbin chunk detected`
|
|
- Si el chunk devuelto tiene un tamaño que no es correcto 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`
|
|
- **Comprobaciones durante la búsqueda en small bin:**
|
|
- Si `victim->bk->fd != victim`:
|
|
- Mensaje de error: `malloc(): smallbin double linked list corrupted`
|
|
- **Comprobaciones durante la consolidación** realizadas para cada chunk de fast bin:
|
|
- Si el chunk está desalineado, activar:
|
|
- Mensaje de error: `malloc_consolidate(): unaligned fastbin chunk detected`
|
|
- Si el chunk tiene un tamaño diferente al que debería debido al índice en el que se encuentra:
|
|
- Mensaje de error: `malloc_consolidate(): invalid chunk size`
|
|
- Si el chunk anterior no está en uso y el chunk anterior tiene un tamaño diferente al indicado por prev_chunk:
|
|
- Mensaje de error: `corrupted size vs. prev_size in fastbins`
|
|
- **Comprobaciones 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 siguiente chunk es extraño (demasiado pequeño o demasiado grande):
|
|
- Mensaje de error: `malloc(): invalid next size (unsorted)`
|
|
- Si el tamaño anterior indicado por el siguiente chunk 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 estar apuntando siempre a la estructura de arena.
|
|
- Si el siguiente chunk 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)`
|
|
- **Comprobaciones durante la búsqueda en large bin (por índice):**
|
|
- `bck->fd-> bk != bck`:
|
|
- Mensaje de error: `malloc(): corrupted unsorted chunks`
|
|
- **Comprobaciones durante la búsqueda en large bin (siguiente más grande):**
|
|
- `bck->fd-> bk != bck`:
|
|
- Mensaje de error: `malloc(): corrupted unsorted chunks2`
|
|
- **Comprobaciones durante el uso del Top chunk:**
|
|
- `chunksize(av->top) > av->system_mem`:
|
|
- Mensaje de error: `malloc(): corrupted top size`
|
|
|
|
## `tcache_get_n`
|
|
|
|
- **Comprobaciones en `tcache_get_n`:**
|
|
- Si el chunk está desalineado:
|
|
- Mensaje de error: `malloc(): unaligned tcache chunk detected`
|
|
|
|
## `tcache_thread_shutdown`
|
|
|
|
- **Comprobaciones en `tcache_thread_shutdown`:**
|
|
- Si el chunk está desalineado:
|
|
- Mensaje de error: `tcache_thread_shutdown(): unaligned tcache chunk detected`
|
|
|
|
## `__libc_realloc`
|
|
|
|
- **Comprobaciones 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, consulta:
|
|
|
|
{{#ref}}
|
|
free.md
|
|
{{#endref}}
|
|
|
|
- **Comprobaciones 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`
|
|
- **Comprobaciones 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 y está presente como chunk en el tcache:
|
|
- Mensaje de error: `free(): double free detected in tcache 2`
|
|
- **Comprobaciones en `_int_free` fast bin:**
|
|
- Si el tamaño del chunk es inválido (demasiado grande o pequeño) activar:
|
|
- Mensaje de error: `free(): invalid next size (fast)`
|
|
- Si el chunk agregado ya era el top 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 del chunk que estamos agregando:
|
|
- Mensaje de error: `invalid fastbin entry (free)`
|
|
|
|
## **`_int_free_merge_chunk`**
|
|
|
|
- **Comprobaciones en `_int_free_merge_chunk`:**
|
|
- Si el chunk es el top chunk:
|
|
- Mensaje de error: `double free or corruption (top)`
|
|
- Si el siguiente chunk está fuera de los límites de la arena:
|
|
- Mensaje de error: `double free or corruption (out)`
|
|
- Si el chunk no está marcado como usado (en el prev_inuse del siguiente chunk):
|
|
- Mensaje de error: `double free or corruption (!prev)`
|
|
- Si el siguiente chunk tiene un tamaño demasiado pequeño o demasiado grande:
|
|
- Mensaje de error: `free(): invalid next size (normal)`
|
|
- Si el chunk anterior no está en uso, intentará consolidar. Pero, si el `prev_size` difiere del tamaño indicado en el chunk anterior:
|
|
- Mensaje de error: `corrupted size vs. prev_size while consolidating`
|
|
|
|
## **`_int_free_create_chunk`**
|
|
|
|
- **Comprobaciones en `_int_free_create_chunk`:**
|
|
- Al agregar un chunk en el unsorted bin, verificar si `unsorted_chunks(av)->fd->bk == unsorted_chunks(av)`:
|
|
- Mensaje de error: `free(): corrupted unsorted chunks`
|
|
|
|
## `do_check_malloc_state`
|
|
|
|
- **Comprobaciones en `do_check_malloc_state`:**
|
|
- Si el chunk de fast bin está desalineado:
|
|
- Mensaje de error: `do_check_malloc_state(): unaligned fastbin chunk detected`
|
|
|
|
## `malloc_consolidate`
|
|
|
|
- **Comprobaciones en `malloc_consolidate`:**
|
|
- Si el chunk de fast bin está desalineado:
|
|
- Mensaje de error: `malloc_consolidate(): unaligned fastbin chunk detected`
|
|
- Si el tamaño del chunk de fast bin es incorrecto:
|
|
- Mensaje de error: `malloc_consolidate(): invalid chunk size`
|
|
|
|
## `_int_realloc`
|
|
|
|
- **Comprobaciones en `_int_realloc`:**
|
|
- El tamaño es demasiado grande o demasiado pequeño:
|
|
- Mensaje de error: `realloc(): invalid old size`
|
|
- El tamaño del siguiente chunk es demasiado grande o demasiado pequeño:
|
|
- Mensaje de error: `realloc(): invalid next size`
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|