Heap Spray
hackingDéfinition
Le heap spraying est une technique d'exploitation qui consiste à remplir le tas (heap) d'un processus avec de grandes quantités de données contrôlées, généralement un shellcode précédé d'un long NOP sled, afin d'augmenter la probabilité que l'exécution atterrisse dans la zone contrôlée lors d'une exploitation dont l'adresse cible n'est pas précisément connue. Cette technique est particulièrement efficace contre les vulnérabilités où l'attaquant peut déclencher une exécution vers une adresse approximative mais pas exacte. Le principe du NOP sled (glissade NOP) est central au heap spraying : en plaçant des centaines ou milliers d'octets 0x90 (NOP - No Operation) avant le shellcode réel, tout saut atterrissant dans cette zone glisse vers le shellcode à la fin. Avec un heap spray remplissant des centaines de mégaoctets de mémoire avec ces NOP+shellcode répétés, la densité de zones contrôlées est suffisamment élevée pour que même une adresse approximative ait de bonnes chances d'atteindre un NOP sled. Dans les navigateurs web, le heap spraying est réalisé en JavaScript en allouant des milliers de chaînes ou de tableaux de données : une boucle créant 200 chaînes de 1 MB chacune (200 MB au total) remplissant l'heap avec le payload, puis l'exploitation d'une UAF ou autre vulnérabilité mémoire qui redirige l'exécution vers ~0x0c0c0c0c ou une autre adresse dense dans le spray. Des variantes avancées incluent le heap feng shui (arrangement précis des allocations pour créer des structures heap spécifiques favorables à l'exploitation), le TypedArray spraying (utiliser des ArrayBuffers JavaScript pour un contrôle plus précis du contenu mémoire sans overhead de strings), et le JIT spraying (exploiter les compilateurs JIT qui génèrent du code à des adresses partiellement prévisibles). Les mitigations du heap spraying incluent : NX/DEP qui empêche l'exécution de code dans les zones de données (rendant le shellcode classique inutilisable), ASLR qui randomise les adresses heap, et les allocateurs sécurisés qui rendent les adresses heap moins prévisibles.
Fonctionnement
En JavaScript : var nop = unescape('%u9090%u9090'); while(nop.length < 0x100000) nop += nop; var shellcode = nop + payload; var spray = []; for(var i=0; i<500; i++) spray[i] = shellcode; alloue 500 MB contenant le shellcode à intervalles réguliers. La cible d'exploitation (adresse dans une UAF, pointeur corrompu) est choisie dans une plage dense du spray où la probabilité de succès est élevée (typiquement 0x0c0c0c0c sur 32-bit).
Exploitation offensive
Le heap spraying est souvent combiné avec une vulnérabilité de corruption mémoire imprécise (UAF avec allocation non déterministe) ou pour augmenter la fiabilité d'un exploit précis. Dans les exploitations de navigateurs sans ASLR, c'était la technique dominante. Avec ASLR + NX, des techniques de spraying plus sophistiquées combinées avec des leaks d'adresses sont nécessaires.
Détection et mitigation
Les allocations massives de mémoire depuis JavaScript (>50 MB de chaînes identiques) sont détectables comportementalement. Les navigateurs modernes (Chrome avec PartitionAlloc, Firefox avec jemalloc) utilisent des allocateurs qui rendent le heap spray moins prévisible. NX/DEP rend le shellcode classique inutilisable, forçant l'utilisation de ROP même lors d'un spray réussi.
Articles liés
Expert en cybersécurité offensive et intelligence artificielle. Pentest, audit et développement IA sur-mesure.
Services
- Audit Infrastructure
- Audit Kubernetes
- Audit Microsoft 365
- Audit Sécurité Réseau
- Analyse de Risques
- Audit Active Directory
- Audit Application Web
- Audit Cloud (AWS/Azure/GCP)
- Audit Messagerie
- Audit API (OWASP Top 10)
- Audit DevSecOps & CI/CD
- Audit Code Source (SAST)
- Audit Postes de Travail
- Audit Sauvegarde & Résilience
- Audit OT/SCADA (IEC 62443)
- Développement IA
- Formations
Ressources
Projets & Outils
© 2026 Ayi NEDJIMI Consultants. Tous droits réservés. 2.1.7
Un projet cybersécurité ?
Expert dispo · Réponse 24h