Large Bin Attack
Información Básica
Para más información sobre qué es un large bin, consulta esta página:
Bins & Memory AllocationsEs posible encontrar un gran ejemplo en how2heap - large bin attack.
Básicamente aquí puedes ver cómo, en la última versión "actual" de glibc (2.35), no se verifica: P->bk_nextsize
permitiendo modificar una dirección arbitraria con el valor de un chunk de large bin si se cumplen ciertas condiciones.
En ese ejemplo puedes encontrar las siguientes condiciones:
Se asigna un chunk grande
Se asigna un chunk grande más pequeño que el primero pero en el mismo índice
Debe ser más pequeño para que vaya primero en el bin
(Se crea un chunk para evitar la fusión con el chunk superior)
Luego, se libera el primer chunk grande y se asigna un nuevo chunk más grande que él -> Chunk1 va al large bin
Luego, se libera el segundo chunk grande
Ahora, la vulnerabilidad: El atacante puede modificar
chunk1->bk_nextsize
a[target-0x20]
Luego, se asigna un chunk más grande que el chunk 2, por lo que el chunk2 se inserta en el large bin sobrescribiendo la dirección
chunk1->bk_nextsize->fd_nextsize
con la dirección de chunk2
Existen otros escenarios potenciales, la idea es agregar al large bin un chunk que sea más pequeño que un chunk X actual en el bin, por lo que debe ser insertado justo antes en el bin, y necesitamos poder modificar bk_nextsize
de X ya que ahí se escribirá la dirección del chunk más pequeño.
Este es el código relevante de malloc. Se han añadido comentarios para entender mejor cómo se sobrescribió la dirección:
Esto podría ser utilizado para sobrescribir la variable global global_max_fast
de libc y luego explotar un ataque de fast bin con fragmentos más grandes.
Puedes encontrar otra excelente explicación de este ataque en guyinatuxedo.
Otros ejemplos
Ataque de large bin en la misma situación que aparece en how2heap.
La primitiva de escritura es más compleja, porque
global_max_fast
es inútil aquí.Se necesita FSOP para finalizar el exploit.
Last updated