Un desbordamiento de montón , desbordamiento de montón o destrucción de montón es un tipo de desbordamiento de búfer que ocurre en el área de datos del montón . Los desbordamientos de montón 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 estructuras internas como punteros de lista enlazada . La técnica de desbordamiento de montón canónico sobrescribe el enlace de asignación de memoria dinámica (como metadatos) y utiliza el intercambio de puntero resultante para sobrescribir un puntero de función del programa .malloc
Por ejemplo, en versiones anteriores de Linux , dos buffers asignados uno al lado del otro en el montón podrían dar como resultado que el primer buffer sobrescribiera los metadatos del segundo buffer. Al establecer el bit en uso en cero del segundo buffer y establecer la longitud en un valor negativo pequeño que permite copiar bytes nulos, cuando el programa llama free()
al primer buffer intentará fusionar estos dos buffers en un solo buffer. Cuando esto sucede, se espera que el buffer que se supone que se libera contenga dos punteros FD y BK en los primeros 8 bytes del buffer asignado anteriormente. BK se escribe en FD y se puede usar para sobrescribir un puntero.
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 ocurrir con cualquier proceso del sistema.
Por ejemplo, una vulnerabilidad de desbordamiento de búfer JPEG GDI+ de Microsoft podría permitir la ejecución remota de código en la máquina afectada. [1]
El jailbreak de iOS a menudo utiliza desbordamientos de montón para lograr la ejecución de código arbitrario .
Al igual que con los desbordamientos de búfer, existen principalmente tres formas de protegerse contra los desbordamientos de montón. Varios sistemas operativos modernos , como Windows y Linux, ofrecen alguna implementación de las tres.
Desde la versión 2.3.6, la GNU libc incluye protecciones que pueden detectar desbordamientos de pila después de que se produzcan, por ejemplo, comprobando la consistencia del puntero al llamar a unlink
. Sin embargo, casi inmediatamente se demostró 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. También Linux ha incluido soporte para NX-bit desde 2004.
Microsoft ha incluido protecciones contra desbordamientos de búfer residentes en el montón desde abril de 2003 en Windows Server 2003 y agosto de 2004 en Windows XP con Service Pack 2. Estas mitigaciones fueron la desvinculación segura y las cookies de encabezado de entrada del montón. Las versiones posteriores de Windows como Vista , Server 2008 y Windows 7 incluyen: eliminación de estructuras de datos comúnmente atacadas, aleatorización de metadatos de entrada del montón, función expandida de la cookie de encabezado del montón, dirección base del montón aleatoria, codificación de puntero de función , terminación de corrupción del 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]
El método de detección más común para desbordamientos de pila es el análisis dinámico en línea. Este método observa la ejecución de los programas en tiempo de ejecución para identificar vulnerabilidades mediante la detección de brechas de seguridad. [5]