En seguridad informática , el heap spraying es una técnica utilizada en exploits para facilitar la ejecución de código arbitrario . La parte del código fuente de un exploit que implementa esta técnica se denomina heap spray . [1] En general, el código que rocía el heap intenta colocar una determinada secuencia de bytes en una ubicación predeterminada en la memoria de un proceso de destino haciendo que asigne bloques (grandes) en el heap del proceso y rellene los bytes de estos bloques con los valores correctos.
En realidad, un Heap Spray no explota ningún problema de seguridad, pero puede utilizarse para que una vulnerabilidad sea más fácil de explotar. Un Heap Spray por sí solo no puede utilizarse para romper ningún límite de seguridad: se necesita un problema de seguridad independiente.
A menudo, explotar problemas de seguridad es difícil porque varios factores pueden influir en este proceso. Las alineaciones aleatorias de memoria y tiempo introducen mucha aleatoriedad (desde el punto de vista del atacante). Se puede utilizar un rociado de montón para introducir una gran cantidad de orden para compensar esto y aumentar las posibilidades de una explotación exitosa. Los rociados de montón aprovechan el hecho de que en la mayoría de las arquitecturas y sistemas operativos, la ubicación de inicio de grandes asignaciones de montón es predecible y las asignaciones consecutivas son aproximadamente secuenciales. Esto significa que el montón rociado estará aproximadamente en la misma ubicación cada vez que se ejecute el rociado de montón.
Los exploits suelen utilizar bytes específicos para rociar el montón, ya que los datos almacenados en el montón cumplen múltiples funciones. Durante la explotación de un problema de seguridad, a menudo se puede hacer que el código de la aplicación lea una dirección desde una ubicación arbitraria en la memoria. Luego, el código utiliza esta dirección como la dirección de una función para ejecutar. Si el exploit puede obligar a la aplicación a leer esta dirección desde el montón rociado, puede controlar el flujo de ejecución cuando el código utiliza esa dirección como un puntero de función y lo redirige al montón rociado. Si el exploit tiene éxito en redirigir el flujo de control al montón rociado, se ejecutarán los bytes allí, lo que permite que el exploit realice cualquier acción que desee el atacante. Por lo tanto, los bytes en el montón están restringidos a representar direcciones válidas dentro del propio rociado del montón, que contienen instrucciones válidas para la arquitectura de destino, por lo que la aplicación no se bloqueará. Por lo tanto, es común rociar con un solo byte que se traduce tanto en una dirección válida como en una instrucción NOP o similar a NOP en la arquitectura de destino. Esto permite que el heap spray funcione como un trineo NOP muy grande (por ejemplo, 0x0c0c0c0c se utiliza a menudo como NOP no canónico [2] ).
Los heap sprays se han utilizado ocasionalmente en exploits desde al menos 2001, [3] [4] pero la técnica comenzó a verse ampliamente utilizada en exploits para navegadores web en el verano de 2005 después del lanzamiento de varios de estos exploits que usaban la técnica contra una amplia gama de errores en Internet Explorer . [5] [6] [7] [8] [9] Los heap sprays utilizados en todos estos exploits eran muy similares, lo que mostraba la versatilidad de la técnica y su facilidad de uso, sin necesidad de modificaciones importantes entre exploits. Resultó lo suficientemente simple de entender y usar para permitir a los hackers novatos escribir rápidamente exploits confiables para muchos tipos de vulnerabilidades en navegadores web y complementos de navegadores web . Muchos exploits de navegadores web que utilizan heap spraying consisten solo en un heap spray que se copia y pega de un exploit anterior combinado con un pequeño fragmento de script o HTML que activa la vulnerabilidad.
Los heap sprays para navegadores web se implementan comúnmente en JavaScript y rocían el heap creando cadenas grandes . La técnica más común utilizada es comenzar con una cadena de un carácter y concatenarla consigo misma una y otra vez. De esta manera, la longitud de la cadena puede crecer exponencialmente hasta la longitud máxima permitida por el motor de scripting . Dependiendo de cómo implemente el navegador las cadenas, se pueden usar caracteres ASCII o Unicode en la cadena. El código de heap spraying hace copias de la cadena larga con shellcode y las almacena en una matriz, hasta el punto en que se ha rociado suficiente memoria para garantizar que el exploit funcione.
Ocasionalmente, VBScript se utiliza en Internet Explorer para crear cadenas mediante la función String .
En julio de 2009, se descubrió que los exploits utilizaban ActionScript para difundir el heap en Adobe Flash . [10] [11]
Aunque se ha demostrado que la pulverización de heap se puede realizar a través de otros medios, por ejemplo, cargando archivos de imágenes en el proceso, [12] esto no ha tenido un uso generalizado (a agosto de 2008). [ necesita actualización ]
En septiembre de 2012, se presentó una nueva técnica en EuSecWest 2012. [13] Dos investigadores de CORE, Federico Muttis y Anibal Sacco, demostraron que el heap se puede rociar con una granularidad de asignación muy alta mediante el uso de tecnologías introducidas con HTML5 . En concreto, utilizaron la interfaz de mapa de bits de bajo nivel que ofrece la API canvas y trabajadores web para hacerlo más rápidamente.
{{cite web}}
: CS1 maint: nombres numéricos: lista de autores ( enlace )