Un desbordamiento de montón , un desbordamiento de montón o un desbordamiento 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 la 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 maneras específicas para hacer que la aplicación sobrescriba estructuras internas como punteros de listas enlazadas . La técnica canónica de desbordamiento de montón sobrescribe el enlace de asignación dinámica de memoria (como metadatos) y usa el intercambio de punteros resultante para sobrescribir un puntero de función del programa .malloc
Por ejemplo, en versiones antiguas de Linux , dos búferes asignados uno al lado del otro en el montón podían provocar que el primer búfer sobrescribiera los metadatos del segundo. Al establecer el bit de uso del segundo búfer a cero y la longitud a un valor negativo pequeño que permite copiar bytes nulos, cuando el programa llama free()al primer búfer, intentará fusionar estos dos búferes en uno solo. Cuando esto sucede, se espera que el búfer que se supone liberado contenga dos punteros, FD y BK, en los primeros 8 bytes del búfer asignado anteriormente. BK se escribe en FD y puede usarse para sobrescribir un puntero.
Consecuencias
Un desbordamiento accidental puede provocar la corrupción de datos o un comportamiento inesperado en 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 jailbreaking de iOS a menudo utiliza desbordamientos de pila para obtener la ejecución de código arbitrario .
Detección y prevención
Al igual que con los desbordamientos de búfer, existen principalmente tres maneras de protegerse contra los desbordamientos de montón. Varios sistemas operativos modernos , como Windows y Linux, ofrecen alguna implementación de las tres.
- Impida la ejecución de la carga útil separando el código y los datos, normalmente con funciones de hardware como el bit NX.
- Introducir aleatorización para que el montón no se encuentre en un desplazamiento fijo, normalmente con características del kernel como ASLR ( Aleatorización del diseño del espacio de direcciones ).
- Introducir comprobaciones de cordura en el gestor de montón.
Desde la versión 2.3.6, la biblioteca GNU libc incluye protecciones que pueden detectar desbordamientos de montón a posteriori, por ejemplo, comprobando la consistencia de los punteros al llamar a 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. Asimismo, 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 medidas de mitigación consistían en 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 ampliada de la cookie de encabezado del montón, dirección base del montón aleatorizada , codificación de punteros de función , terminación de la corrupción del montón y variación de algoritmos. 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 montículo es el análisis dinámico en línea. Este método observa la ejecución de programas en tiempo de ejecución para identificar vulnerabilidades mediante la detección de fallos de seguridad. [ 5 ]
Véase también
Referencias
- ↑ "Boletín de seguridad de Microsoft MS04-028, Desbordamiento de búfer en el procesamiento de JPEG (GDI+) podría permitir la ejecución de código (833987)" . Microsoft . 14 de septiembre de 2004. Consultado el 29 de marzo de 2016 .
- ↑ "The 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 usuario" . Blog de Technet, Microsoft Security Research & Defense. 4 de agosto de 2009. Consultado el 29 de marzo de 2016 .
- ↑ USENIX Association, ed. (2005). Actas del Segundo Taller sobre Sistemas Distribuidos Reales a Gran Escala: 13 de diciembre de 2005, San Francisco, CA, EE. UU . USENIX Association. ISBN 978-1-931971-40-9.
Enlaces externos
- Trucos de Vudo malloc
- Artículo sobre desbordamiento de montículo en Heise Security
- Cómo eludir la protección de memoria dinámica (Heap Protection) y la omisión de DEP en Microsoft Windows XP SP2. Archivado el 1 de noviembre de 2013 en Wayback Machine.
- vulnerabilidades de seguridad informática
- Anomalías de software