NGINX Rift (CVE-2026-42945) : une faille vieille de 18 ans permet le RCE sur un tiers du Web
Le 13 mai 2026, F5 et la firme de recherche depthfirst ont divulgué CVE-2026-42945, un heap buffer overflow dans le module ngx_http_rewrite_module de NGINX. Baptisée NGINX Rift, la vulnérabilité affecte toutes les versions de NGINX Open Source depuis 0.6.27 (introduite en 2008) jusqu'à 1.30.0 incluse, ainsi que NGINX Plus R32 à R36. Son score CVSS v4 est de 9.2 (critique). Un proof-of-concept public est disponible sur GitHub depuis le jour de la divulgation.
NGINX alimente approximativement un tiers des serveurs web mondiaux. Le périmètre exposé est donc considérable.
Anatomie du bug
Le moteur de script en deux passes
Le module ngx_http_rewrite_module traite les directives rewrite, if et set en deux temps : une première passe calcule la taille de buffer nécessaire, une seconde écrit les données effectives. Ce mécanisme à double passe est une optimisation courante en C pour éviter des allocations dynamiques coûteuses.
Le problème réside dans la propagation d'un flag interne, is_args, positionné à 1 par la fonction ngx_http_script_start_args_code lorsque la chaîne de remplacement d'un rewrite contient un point d'interrogation. Ce flag n'est jamais remis à zéro sur le moteur principal.
La corruption
Lors de la passe de calcul de taille, un sous-moteur fraîchement initialisé (donc is_args = 0) mesure la capture comme de l'octet brut. Lors de la passe d'écriture, le moteur principal (toujours is_args = 1) réenchappe les données via ngx_escape_uri en mode NGX_ESCAPE_ARGS : chaque caractère encodable (+, %, &) passe d'un octet à trois. Le buffer alloué pour la taille brute est dépassé par les données réécrites. Le surplus est contrôlé par l'URI de l'attaquant.
La faille est déterministe : à URI constante, le dépassement est reproductible octet pour octet.
Conditions d'exploitation
L'exploitation requiert une configuration NGINX contenant simultanément :
- une directive
rewriteavec une capture non nommée ($1,$2) et un point d'interrogation dans la chaîne de remplacement, - suivie d'une directive
rewrite,ifousetdans le même scope.
Ce pattern est courant dans les configurations de reverse proxy et d'application web. Aucune authentification n'est nécessaire : un attaquant peut envoyer une requête HTTP forgée depuis internet sans session préalable.
Déni de service (DoS) : garanti sur toute version affectée. Le worker NGINX crashe, le master en respawn un nouveau avec une disposition mémoire identique. L'attaquant peut maintenir le crash loop indéfiniment.
RCE (Remote Code Execution) : démontré sur les systèmes où ASLR est désactivé. Depthfirst décrit également une technique théorique de contournement d'ASLR par corruption progressive de pointeurs sur des requêtes répétées, exploitant précisément le fait que le master respawn un worker avec une heap layout identique à chaque tentative.
La technique d'exploitation concrète repose sur du heap feng shui entre requêtes : le dépassement cible une structure ngx_pool_t adjacente via des POST bodies (les octets URI ne pouvant pas contenir de null bytes), ce qui permet de rediriger un pointeur de cleanup vers un appel à system() au moment de la destruction du pool.
Périmètre affecté
| Produit | Versions vulnérables | Version corrigée |
|---|---|---|
| NGINX Open Source | 0.6.27 à 1.30.0 | 1.31.0 ou 1.30.1 |
| NGINX Plus | R32 à R36 | R36 P4, R32 P6 |
| NGINX Instance Manager | 2.16.0 à 2.21.1 | Migrer vers une branche corrigée |
| NGINX App Protect WAF | 4.9.0-4.16.0, 5.1.0-5.8.0 | Migrer vers une branche corrigée |
| NGINX Gateway Fabric | 1.3.0-1.6.2, 2.0.0-2.5.1 | Migrer vers une branche corrigée |
| NGINX Ingress Controller | 3.5.0 à 5.4.1 (plusieurs branches) | Migrer vers une branche corrigée |
F5 BIG-IP, BIG-IQ, Distributed Cloud et Silverline ne sont pas concernés. Les versions NGINX Open Source antérieures à 1.0.0 (branche 0.6.27-0.9.7) ne recevront aucun correctif : une migration vers 1.30.1 ou 1.31.0 est impérative.
Trois autres vulnérabilités corrigées en parallèle
La divulgation couvre quatre CVE au total, toutes découvertes par le même scan automatisé sur le code NGINX.
- CVE-2026-42946 (CVSS 8.3) : désalignement d'état dans les modules
ngx_http_scgi_moduleetngx_http_uwsgi_module. Une soustraction de pointeurs inter-buffers produit une taille de clé d'environ 1 To, crashant le worker. Requiert un attaquant positionné en man-in-the-middle pour contrôler les réponses de l'upstream. - CVE-2026-40701 (CVSS 6.3) : use-after-free dans
ngx_http_ssl_module. Actif uniquement lorsquessl_verify_clientest défini àonouoptionaletssl_ocspàon. Permet une modification limitée de données ou un crash du worker. - CVE-2026-42934 (CVSS 6.3) : lecture hors bornes dans
ngx_http_charset_module. Conduit à une fuite mémoire ou un crash du worker lorsque les directivescharset,source_charset,charset_mapetproxy_passavec buffering désactivé sont utilisées conjointement.
Corriger ou contourner
Mise à jour
La mise à jour reste la seule réponse complète. Redémarrer NGINX après l'upgrade est indispensable pour que les workers rechargent le binaire corrigé.
# Vérifier la version installée
nginx -v
# Debian/Ubuntu (depuis le dépôt officiel NGINX)
apt update && apt install nginx
# Ou depuis les sources
./configure && make && make installContournement sans mise à jour
Si la mise à jour immédiate est impossible, remplacer toutes les captures non nommées par des captures nommées dans les directives rewrite concernées. Les captures nommées ne passent pas par le chemin de code vulnérable.
# Vulnérable
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;
# Non vulnérable
rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;Pour identifier les configurations exposées :
grep -rn 'rewrite.*\$[0-9].*?' /etc/nginx/Ce grep liste les directives rewrite qui combinent une capture non nommée et un point d'interrogation dans la chaîne de remplacement.
Détectée par une machine en six heures
Le fait que cette vulnérabilité ait traversé 18 ans d'audits humains, de revues de code et de fuzzing pour être finalement identifiée en six heures par un système automatisé mérite d'être relevé.
Depthfirst est une plateforme d'analyse de sécurité autonome basée sur l'analyse statique avancée et la recherche de primitives de corruption mémoire. Le bug n'est pas trivial à trouver manuellement : il repose sur une interaction subtile entre deux passes d'exécution de scripts, dans un module dont la logique interne est dense et peu documentée. Le comportement divergent de is_args entre le sous-moteur et le moteur principal n'est visible qu'en traçant l'état complet à travers une séquence de directives non triviale.
Ce n'est pas la première fois qu'un outil d'analyse automatisée découvre en quelques heures une vulnérabilité ancienne dans un composant très audité. La tendance s'accélère avec la maturité des outils d'analyse symbolique et des moteurs de fuzzing guidés par couverture. Pour les équipes sysops, cela implique d'intégrer ce type d'analyse dans les pipelines de veille, et de ne pas supposer qu'un logiciel audité par des milliers de contributeurs est exempt de bugs de mémoire bas niveau.
Sources








