🔍 Contexte

Publié le 13 mai 2026 par Zhenpeng (Leo) Lin, chercheur chez DepthFirst AI, cet article présente les résultats d’une analyse autonome du code source de NGINX ayant conduit à la découverte de 4 vulnérabilités de corruption mémoire, dont une critique permettant une RCE non authentifiée.

🐛 Vulnérabilité principale : CVE-2026-42945

  • Type : Heap buffer overflow dans ngx_http_rewrite_module
  • CVSS : 9.2 (Critique)
  • Introduite en : 2008 (NGINX 0.6.27)
  • Versions affectées : NGINX Open Source 0.6.27 à 1.30.0, NGINX Plus R32-R36, NGINX Instance Manager, F5 WAF, NGINX App Protect WAF, NGINX Gateway Fabric, NGINX Ingress Controller
  • Condition de déclenchement : Utilisation conjointe des directives rewrite (avec ?) et set dans la configuration NGINX

⚙️ Cause racine

Le moteur de script NGINX utilise un processus en deux passes (calcul de longueur puis copie). Le flag e->is_args est positionné à 1 lors du traitement d’une directive rewrite contenant un ?, mais n’est jamais réinitialisé. Lors de la passe de calcul de longueur pour une directive set suivante, un sous-moteur le initialisé à zéro ignore l’échappement URI. Lors de la passe de copie, le moteur principal avec is_args=1 applique ngx_escape_uri, expandant chaque caractère spécial de 1 à 3 octets, dépassant le buffer alloué.

💥 Exploitation

L’exploitation repose sur plusieurs techniques :

  1. Heap feng shui cross-requêtes : contrôle de l’ordre des connexions pour placer un pool victime adjacent au pool source du débordement
  2. Spray de faux ngx_pool_cleanup_s via des corps POST (données binaires arbitraires incluant des null bytes)
  3. Écrasement du pointeur cleanup du pool victime avec une adresse URI-safe pointant vers la fausse structure
  4. Fermeture du socket victime déclenchant ngx_destroy_pool → exécution du handler system() avec commande injectée

Un PoC fonctionnel démontrant une RCE (avec ASLR désactivé) a été développé et partagé avec NGINX.

📋 Autres CVE confirmées

  • CVE-2026-42946 (CVSS 8.3) : Allocation mémoire excessive dans ngx_http_scgi_module / ngx_http_uwsgi_module → crash worker
  • CVE-2026-40701 (CVSS 6.3) : Use-after-free dans ngx_http_ssl_module via résolution DNS OCSP asynchrone
  • CVE-2026-42934 (CVSS 6.3) : Out-of-bounds read dans ngx_http_charset_module via séquences UTF-8 incomplètes

📅 Timeline

  • 18/04/2026 : Analyse autonome → 5 issues détectées
  • 21/04/2026 : Signalement à NGINX via GitHub Security Advisory
  • 24/04/2026 : 4 issues confirmées
  • 28/04/2026 : PoC RCE développé, NGINX informé
  • 05/05/2026 : PoC partagé avec NGINX
  • 13/05/2026 : Advisory F5 publié + publication du blog

📌 Type d’article

Publication de recherche technique détaillant la découverte, l’analyse de cause racine et l’exploitation d’une vulnérabilité critique dans NGINX, avec divulgation coordonnée.

🧠 TTPs et IOCs détectés

TTP

  • T1190 — Exploit Public-Facing Application (Initial Access)
  • T1203 — Exploitation for Client Execution (Execution)
  • T1059 — Command and Scripting Interpreter (Execution)

IOC

  • CVEs : CVE-2026-42945NVD · CIRCL
  • CVEs : CVE-2026-42946NVD · CIRCL
  • CVEs : CVE-2026-40701NVD · CIRCL
  • CVEs : CVE-2026-42934NVD · CIRCL
  • Chemins : src/http/ngx_http_script.c

🟡 Indice de vérification factuelle : 50/100 (moyenne)

  • ⬜ depthfirst.com — source non référencée (0pts)
  • ✅ 17466 chars — texte complet (fulltext extrait) (15pts)
  • ✅ 5 IOCs (IPs/domaines/CVEs) (10pts)
  • ⬜ pas d’IOC vérifié (0pts)
  • ✅ 3 TTPs MITRE identifiées (15pts)
  • ✅ date extraite du HTML source (10pts)
  • ⬜ aucun acteur de menace nommé (0pts)
  • ⬜ 0/4 CVE(s) confirmée(s) (0pts)

🔗 Source originale : https://depthfirst.com/research/nginx-rift-achieving-nginx-rce-via-an-18-year-old-vulnerability