
Laboratoire contrôlé d'injection de trames HTTP/2 NGINX pour la validation du correctif CVE-2026-42926 et la recherche défensive
Un laboratoire de cybersécurité contrôlé pour valider et comparer le comportement lié à CVE-2026-42926, un problème d'injection de trames HTTP/2 affectant des versions spécifiques de NGINX lorsqu'une configuration de proxy vulnérable est utilisée.
Ce dépôt est destiné uniquement à la recherche défensive, à la validation de correctifs, à l'audit de configuration et à la reproduction contrôlée en laboratoire.
Classification: injection de trames HTTP/2 Versions concernées : NGINX
1.29.4à1.30.0Versions corrigées : NGINX1.30.1+/1.31.0+
Utilisez ce projet uniquement dans un environnement de laboratoire isolé que vous possédez ou pour lequel vous êtes explicitement autorisé à tester.
N'exécutez pas cela contre des systèmes tiers, des infrastructures publiques, des environnements partagés ou des services de production sans autorisation écrite.
Isolement recommandé :
Le laboratoire vérifie si un binaire NGINX cible et sa configuration remplissent les conditions nécessaires pour reproduire le problème, envoie une requête conçue à l'emplacement de test et inspecte un enregistreur en amont contrôlé pour des preuves que des octets de type trame HTTP/2 injectés ont atteint le côté amont.
Le modèle de validation normal est :
Résultat attendu :
| Fichier | Description |
|---|---|
README.md | Documentation du projet. |
LICENSE | Licence MIT. |
Dockerfile | Construit une image de laboratoire autonome avec NGINX 1.29.4, PHP CLI/cURL, Python et les scripts du projet. |
docker-compose.yml | Démarre le service NGINX vulnérable, l'enregistreur de trames en amont et un exécuteur de validation optionnel. |
cve_2026_42926_lab.php | Script principal de validation du laboratoire. Il vérifie les préconditions de version/configuration, envoie la requête conçue, inspecte les journaux en amont et retourne un verdict. |
nginx_vulnerable.conf | Exemple de configuration NGINX contenant le motif de proxy vulnérable utilisé pour les exécutions de comparaison vulnérable et corrigée. |
docker/nginx_vulnerable.docker.conf | Configuration NGINX spécifique à Docker utilisant le même motif vulnérable et la découverte de service Compose. |
nginx_config_verify.sh | Utilitaire qui vérifie si une configuration NGINX cible contient le motif de proxy vulnérable requis. |
upstream_frame_logger.py | Enregistreur de trames HTTP/2 brutes contrôlé en amont utilisé pour capturer et inspecter les trames reçues de NGINX. |
run_lab_comparison.sh | Orchestre les exécutions de comparaison vulnérable vs corrigée. |
.dockerignore | Empêche les journaux générés et les métadonnées IDE d'entrer dans le contexte de construction Docker. |
bashpython3phpPour le flux de travail conteneurisé :
La configuration exemple écoute sur le port 80, ce qui nécessite généralement des privilèges root. Pour un laboratoire local sans privilèges, remplacez listen 80; dans nginx_vulnerable.conf par un port élevé disponible tel que 8080, puis utilisez l'URL cible correspondante dans la commande PHP.
Rendez les scripts shell exécutables :
chmod +x nginx_config_verify.sh run_lab_comparison.sh
Confirmez que PHP prend en charge cURL :
php -m | grep -i curl
Confirmez que chaque binaire NGINX peut afficher sa version :
/path/to/nginx -V
Le fichier nginx_vulnerable.conf fourni contient le motif de test requis :
location /exploit {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 2;
proxy_set_body $request_body;
proxy_set_header Host $host;
proxy_set_header Content-Length $content_length;
}
Détails importants :
proxy_http_version 2 active le proxy HTTP/2 vers l'enregistreur amont.proxy_set_body $request_body utilise un corps de requête contrôlé par le client.client_max_body_size 20m permet le corps de requête de 16 Mio conçu utilisé par le script de validation.127.0.0.1:8081 par défaut.La configuration spécifique à Docker dans docker/nginx_vulnerable.docker.conf conserve le même motif de proxy vulnérable mais écoute sur le port 8080 du conteneur et proxy vers le nom de service Compose upstream:8081.
Le Dockerfile construit NGINX 1.29.4 à partir des sources et installe les outils PHP/Python requis par le laboratoire. Compose exécute ensuite trois services à partir de la même image :
upstream : enregistreur de trames HTTP/2 brutesnginx : NGINX 1.29.4 vulnérable utilisant docker/nginx_vulnerable.docker.confrunner : commande de validation PHP uniqueConstruisez l'image du laboratoire :
docker compose build
Démarrez l'enregistreur amont et NGINX vulnérable :
docker compose up -d upstream nginx
Confirmez la version de NGINX intégrée :
docker compose exec nginx nginx -V
Exécutez le script de validation dans le réseau Compose :
docker compose --profile run run --rm runner
L'exécuteur utilise ces arguments dans le conteneur :
php /lab/cve_2026_42926_lab.php \
http://nginx:8080/exploit \
/lab/upstream_logs \
/lab/nginx_config_verify.sh \
/usr/local/nginx/sbin/nginx \
/lab/docker/nginx_vulnerable.docker.conf \
/exploit
Les journaux en amont générés sont écrits dans le répertoire hôte :
./upstream_logs/
Le service NGINX est également exposé sur l'hôte à :
http://localhost:8080/version
Arrêtez et supprimez les conteneurs du laboratoire :
docker compose down
Démarrez l'enregistreur amont contrôlé :
python3 upstream_frame_logger.py 8081 ./upstream_logs
Dans un autre terminal, démarrez NGINX avec la configuration exemple :
/path/to/nginx -c "$PWD/nginx_vulnerable.conf"
Exécutez le script de validation :
php cve_2026_42926_lab.php \
http://localhost/exploit \
./upstream_logs \
./nginx_config_verify.sh \
/path/to/nginx \
"$PWD/nginx_vulnerable.conf" \
/exploit
Arrêtez NGINX après l'exécution :
/path/to/nginx -s stop
Si vous avez changé NGINX pour écouter sur un autre port, mettez à jour le premier argument. Par exemple :
php cve_2026_42926_lab.php http://localhost:8080/exploit ./upstream_logs ./nginx_config_verify.sh /path/to/nginx "$PWD/nginx_vulnerable.conf" /exploit
Définissez les chemins vers les deux binaires NGINX et exécutez le harnais de comparaison :
VULNERABLE_NGINX=/usr/local/nginx_1.29.4/sbin/nginx \
PATCHED_NGINX=/usr/local/nginx_1.30.1/sbin/nginx \
bash run_lab_comparison.sh
Remplacements de configuration optionnels :
VULNERABLE_NGINX=/path/to/vulnerable/nginx \
PATCHED_NGINX=/path/to/patched/nginx \
VULNERABLE_CONFIG="$PWD/nginx_vulnerable.conf" \
PATCHED_CONFIG="$PWD/nginx_vulnerable.conf" \
bash run_lab_comparison.sh
Le script de comparaison écrit :