Un desbordamiento del montón o un desbordamiento del montón es un tipo de desbordamiento del búfer que se produce en el área de datos del montón . Los desbordamientos de pila se pueden explotar de una manera diferente a la de los desbordamientos basados en pila . La memoria en el montón se asigna dinámicamente en tiempo de ejecución y normalmente contiene datos del programa. La explotación se realiza corrompiendo estos datos de formas específicas para hacer que la aplicación sobrescriba las estructuras internas, como los punteros de listas vinculadas . La técnica de desbordamiento de pila canónica sobrescribe el enlace de asignación de memoria dinámica (como metadatos) y usa el intercambio de puntero resultante para sobrescribir un programamalloc
puntero de función .
Por ejemplo, en versiones anteriores de Linux , dos búferes asignados uno al lado del otro en el montón podrían hacer que el primer búfer sobrescriba los metadatos del segundo. Al establecer el bit en uso a cero del segundo búfer y establecer la longitud a un pequeño valor negativo que permite copiar bytes nulos, cuando el programa llama free()
al primer búfer, intentará fusionar estos dos búferes en un solo búfer . Cuando esto sucede, se espera que el búfer que se supone que está liberado contenga dos punteros FD y BK en los primeros 8 bytes del búfer asignado anteriormente. BK se escribe en FD y se puede utilizar para sobrescribir un puntero.
Consecuencias
Un desbordamiento accidental puede provocar la corrupción de datos o un comportamiento inesperado por parte de cualquier proceso que acceda al área de memoria afectada. En sistemas operativos sin protección de memoria , esto podría ser cualquier proceso del sistema.
Por ejemplo, una vulnerabilidad de desbordamiento de búfer de Microsoft JPEG GDI + podría permitir la ejecución remota de código en la máquina afectada. [1]
El jailbreak de iOS a menudo usa desbordamientos de montón para obtener la ejecución de código arbitrario , generalmente para que los exploits del kernel logren la capacidad de reemplazar el kernel con el que proporciona el jailbreak.
Detección y prevención
Al igual que con los desbordamientos del búfer, existen principalmente tres formas de protegerse contra los desbordamientos del montón. Varios sistemas operativos modernos como Windows y Linux proporcionan alguna implementación de los tres.
- Evite la ejecución de la carga útil separando el código y los datos, generalmente con características de hardware como NX-bit
- Introduzca la aleatorización para que el montón no se encuentre en un desplazamiento fijo, por lo general con funciones del kernel como ASLR ( asignación al azar del diseño del espacio de direcciones )
- Introducir controles de cordura en el administrador de almacenamiento dinámico
Desde la versión 2.3.6, la libc de GNU incluye protecciones que pueden detectar desbordamientos de montón después del hecho, por ejemplo, verificando la consistencia del puntero al llamar unlink
. Sin embargo, se demostró casi de inmediato que esas protecciones contra exploits anteriores también eran explotables. [2] [3] Además, Linux ha incluido soporte para ASLR desde 2005, aunque PaX introdujo una mejor implementación años antes. Además, Linux ha incluido soporte para NX-bit desde 2004.
Microsoft ha incluido protecciones contra desbordamientos del búfer residente del montón desde abril de 2003 en Windows Server 2003 y agosto de 2004 en Windows XP con Service Pack 2 . Estas mitigaciones fueron las cookies de encabezado de entrada de montón y desvinculación segura. Las versiones posteriores de Windows como Vista , Server 2008 y Windows 7 incluyen: Eliminación de estructuras de datos comúnmente dirigidas, aleatorización de metadatos de entrada de montón, función ampliada de la cookie de encabezado de montón, dirección de base de montón aleatoria, codificación de puntero de función , terminación de corrupción de montón y variación de algoritmo . La Prevención de ejecución de datos normal (DEP) y ASLR también ayudan a mitigar este ataque. [4]
Ver también
Referencias
- ^ "Boletín de seguridad de Microsoft MS04-028, el desbordamiento del búfer en el procesamiento de JPEG (GDI +) podría permitir la ejecución de código (833987)" . 14 de septiembre de 2004 . Consultado el 29 de marzo de 2016 .
- ^ "El Malloc Maleficarum" . Octubre de 2005 . Consultado el 24 de abril de 2017 .
- ^ "MALLOC DES-MALEFICARUM" . 2009 . Consultado el 29 de marzo de 2016 .
- ^ "Prevención de la explotación de vulnerabilidades de corrupción de montón en modo de usuario" . Blog de Technet, Investigación y defensa de seguridad de Microsoft. 4 de agosto de 2009 . Consultado el 29 de marzo de 2016 .
enlaces externos
- Rompiendo el montón por diversión y ganancias
- Artículo sobre desbordamiento de pila en Heise Security
- Derrotar la protección de montón de Microsoft Windows XP SP2 y la omisión de DEP