Passer au contenu principal

NGINX Rift (CVE-2026-42945) : une faille vieille de 18 ans permet le RCE sur un tiers du Web

Romain Grosos

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 rewrite avec une capture non nommée ($1, $2) et un point d'interrogation dans la chaîne de remplacement,
  • suivie d'une directive rewrite, if ou set dans 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é

ProduitVersions vulnérablesVersion corrigée
NGINX Open Source0.6.27 à 1.30.01.31.0 ou 1.30.1
NGINX PlusR32 à R36R36 P4, R32 P6
NGINX Instance Manager2.16.0 à 2.21.1Migrer vers une branche corrigée
NGINX App Protect WAF4.9.0-4.16.0, 5.1.0-5.8.0Migrer vers une branche corrigée
NGINX Gateway Fabric1.3.0-1.6.2, 2.0.0-2.5.1Migrer vers une branche corrigée
NGINX Ingress Controller3.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_module et ngx_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 lorsque ssl_verify_client est défini à on ou optional et ssl_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 directives charset, source_charset, charset_map et proxy_pass avec 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 install

Contournement 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

NGINX Rift
An 18 year old memory corruption flaw in NGINX Plus and NGINX Open Source lets an unauthenticated attacker crash worker processes or execute remote code with crafted HTTP requests.
myF5
GitHub - DepthFirstDisclosures/Nginx-Rift: exploit for CVE-2026-42945
exploit for CVE-2026-42945. Contribute to DepthFirstDisclosures/Nginx-Rift development by creating an account on GitHub.
18-Year-Old NGINX Rewrite Module Flaw Enables Unauthenticated RCE
NGINX Rift CVE-2026-42945 scores 9.2 after 18 years, enabling unauthenticated RCE or DoS via crafted HTTP requests.
NGINX Rift: CVE-2026-42945 Critical Heap Buffer Overflow Vulnerability Explained
NGINX-Rift (CVE-2026-42945) is a critical NGINX vulnerability enabling unauthenticated remote code execution. Learn how the exploit works, affected products, and mitigation steps.
NGINX Rift CVE-2026-42945: Critical 18-Year-Old Flaw
NGINX Rift, CVE-2026-42945, exposes NGINX Plus and Open Source to RCE or crashes. Learn which versions to patch now.
NGINX Rift: an 18-year-old flaw in the world’s most deployed web server just came to light
Researchers found a critical 18-year-old buffer overflow flaw in NGINX, tracked as CVE-2026-42945 and named NGINX Rift.