# Heap spraying

En seguretat informàtica, l'heap spraying és una tècnica utilitzada en exploits per facilitar l'execució de codi arbitrari. La part del codi font d'un exploit que implementa aquesta tècnica s'anomena heap spray. En general, el codi que ruixa el munt intenta posar una determinada seqüència de bytes en una ubicació predeterminada a la memòria d'un procés objectiu fent-lo assignar blocs (grans) al munt del procés i omplir els bytes d'aquests blocs amb els valors adequats.

## Funcionament

En realitat, un spray de pila no explota cap problema de seguretat, però es pot utilitzar per fer que una vulnerabilitat sigui més fàcil d'explotar. No es pot utilitzar un esprai de pila per si mateix per trencar cap límit de seguretat: cal tractar-ho com un tema de seguretat separat.
Sovint és difícil explotar els problemes de seguretat perquè diversos factors poden influir en aquest procés. Les alineacions casuals de la memòria i el temps introdueixen molta aleatorietat (des del punt de vista de l'atacant). Es pot utilitzar un esprai de pila per introduir una gran quantitat d'ordre per compensar-ho i augmentar les possibilitats d'explotació reeixida. Els aerosols de pila aprofiten el fet que a la majoria d'arquitectures i sistemes operatius, la ubicació inicial de les grans assignacions de pila és previsible i les assignacions consecutives són aproximadament seqüencials. Això vol dir que el munt ruixat estarà aproximadament al mateix lloc cada vegada que s'executi el munt de polvorització.
Els exploits sovint utilitzen bytes específics per ruixar el munt, ja que les dades emmagatzemades al munt compleixen diverses funcions. Durant l'explotació d'un problema de seguretat, sovint es pot fer que el codi de l'aplicació llegeixi una adreça des d'una ubicació arbitrària de la memòria. El codi utilitza aquesta adreça com a adreça d'una funció a executar. Si l'explotació pot forçar l'aplicació a llegir aquesta adreça des del munt ruixat, pot controlar el flux d'execució quan el codi utilitza aquesta adreça com a punter de funció i la redirigeix a l'emmagatzematge emmagatzemat. Si l'explotació aconsegueix redirigir el flux de control a l'emmagatzematge dinàmic, els bytes s'executaran, permetent que l'explotació realitzi les accions que vulgui l'atacant. Per tant, els bytes de la pila estan restringits per representar adreces vàlides dins de l'esprai de pila, que contenen instruccions vàlides per a l'arquitectura de destinació, de manera que l'aplicació no es bloquejarà. Per tant, és comú ruixar amb un únic byte que es tradueix tant a una adreça vàlida com a una instrucció de tipus NOP o NOP a l'arquitectura de destinació. Això permet que l'esprai de pila funcioni com un trineu NOP molt gran (per exemple, 0x0c0c0c0c s'utilitza sovint com a NOP no canònic).

## Història

Els aerosols heap s'han utilitzat ocasionalment en exploits des d'almenys l'any 2001, però la tècnica va començar a tenir un ús generalitzat en exploits per a navegadors web a l'estiu de 2005 després del llançament de diverses d'aquestes explotacions que utilitzaven la tècnica contra un àmplia gamma d'errors a Internet Explorer. Els sprays de pila utilitzats en totes aquestes explotacions eren molt semblants, fet que demostrava la versatilitat de la tècnica i la seva facilitat d'ús, sense necessitat de grans modificacions entre exploits. Va resultar prou senzill d'entendre i utilitzar per permetre als pirates informàtics novells escriure ràpidament exploits fiables per a molts tipus de vulnerabilitats als navegadors web i complements del navegador web. Molts exploits del navegador web que utilitzen la polvorització de pila consisteixen només en un esprai de pila que s'enganxa d'un exploit anterior combinat amb un petit fragment d'script o HTML que desencadena la vulnerabilitat.

## Implementació
### JavaScript

Els aerosols de pila per a navegadors web s'implementen habitualment en JavaScript i ruixen l'munt mitjançant la creació de cadenes grans. La tècnica més comuna que s'utilitza és començar amb una cadena d'un caràcter i concatenar -la amb si mateixa una i altra vegada. D'aquesta manera, la longitud de la cadena pot créixer exponencialment fins a la longitud màxima permesa pel motor d'scripts. Depenent de com el navegador implementi les cadenes, es poden utilitzar caràcters ASCII o Unicode a la cadena. El codi de polvorització de pila fa còpies de la cadena llarga amb el codi d'intèrpret d'ordres i les emmagatzema en una matriu, fins al punt en què s'ha aplicat prou memòria per garantir que l'explotació funcioni.

### HTML5

El setembre de 2012, es va presentar una nova tècnica a EuSecWest 2012. Dos investigadors de CORE, Federico Muttis i Anibal Sacco, van demostrar que el munt es pot ruixar amb una granularitat d'assignació molt alta mitjançant l'ús de tecnologies introduïdes amb HTML5. Concretament, van utilitzar la interfície de mapa de bits de baix nivell que ofereix l'API canvas i els treballadors web per fer-ho més ràpidament.

## Detecció i prevenció

* El projecte Nozzle de Microsoft Research té com a objectiu detectar i prevenir la polvorització en pila.
* BuBBle és una altra contramesura que es podria considerar per detectar i prevenir un atac desencadenat després de ruixar el munt

## Referències

* ↑ corelanc0d3r. «Exploit writing tutorial part 11 : Heap Spraying Demystified» (en anglès). Corelan Team, December 31, 2011. Arxivat de l'original el 25 April 2015. [Consulta: 15 gener 2014].
* ↑ «FrSIRT - Microsoft Internet Explorer javaprxy.dll COM Object Vulnerability / Exploit (Security Advisories)» (en anglès). Arxivat de l'original el 2008-03-27. [Consulta: 25 març 2008].
* ↑ «FrSIRT - Microsoft Internet Explorer "Msdds.dll" Remote Code Execution / Exploit (Security Advisories)» (en anglès). Arxivat de l'original el 2007-12-19. [Consulta: 25 març 2008].
* ↑ HTML5 Heap Spray. EUSecWest 2012