↓ Aller au contenu

Nginx RIFT (CVE-2026-42945) : vérifier les configurations réellement exposées

··1298 mots·7 mins
Cryptolab.re
Auteur
Cryptolab.re
Cryptolab est un blog personnel où je documente mes expérimentations techniques : infra, self-hosting, réseau, crypto et projets parfois inutiles, souvent instructifs.
Sommaire

CVE-2026-42945, surnommée Nginx RIFT par ses découvreurs, est un dépassement de tampon dans ngx_http_rewrite_module. Le défaut existe depuis Nginx 0.6.27 et peut être déclenché à distance lorsqu’une configuration utilise une séquence particulière de directives rewrite et set avec des données contrôlées par le client.

L’équipe de recherche depthfirst a démontré une exécution de code avec l’ASLR désactivé. Cette preuve établit que la corruption mémoire est exploitable dans un environnement préparé, mais elle ne démontre pas une exécution de code fiable sur toute installation Nginx moderne.

Nginx classe la vulnérabilité au niveau medium. Les versions 0.6.27 à 1.30.0 sont affectées. Les branches 1.30.1 et 1.31.0 ont introduit le correctif.

Mise à jour du 28 août 2026 : la première version de cet article évaluait trop largement le risque comme élevé pour les reverse proxies, homelabs et ingress Kubernetes. La priorité dépend d’abord de la version et de la présence du chemin rewrite/set vulnérable. La qualification amont est medium.

En bref
#

  • Vulnérabilité distante, mais dépendante de la configuration.
  • Composant concerné : ngx_http_rewrite_module.
  • Versions affectées : Nginx 0.6.27 à 1.30.0.
  • Première version corrigée de la branche stable : 1.30.1.
  • Première version corrigée de la branche mainline : 1.31.0.
  • Un PoC public provoque la corruption mémoire et une démonstration de RCE existe avec l’ASLR désactivé.
  • Un WAF ou Cloudflare ne corrige pas le processus Nginx vulnérable.
  • Les paquets des distributions peuvent contenir un rétroportage sans reprendre le numéro de version amont.

Explication technique
#

Le module rewrite compile les directives rewrite et set dans un petit moteur de script. Lors de l’exécution, Nginx effectue une première passe pour calculer la taille du résultat, puis une seconde pour copier les données.

Dans la séquence vulnérable, l’état is_args, qui indique le traitement de la partie arguments d’une URI, n’est pas propagé de la même manière entre les deux passes. La première sous-estime alors la taille nécessaire. La seconde applique l’échappement URI, où certains octets occupent trois caractères, et écrit au-delà du tampon alloué sur le tas.

Le chercheur montre qu’une disposition contrôlée des allocations peut conduire à l’écrasement d’un pointeur de nettoyage d’un pool Nginx. Dans sa démonstration de RCE, l’ASLR est désactivé afin de rendre les adresses prévisibles.

Cette nuance est importante :

  • la corruption mémoire à distance est établie ;
  • l’exécution de code a été démontrée dans un environnement préparé ;
  • l’exploitation fiable avec les protections mémoire habituelles demande des conditions supplémentaires.

Impact réel
#

Reverse proxy public avec configuration atteignable
#

Un Nginx exposé à Internet mérite une mise à jour rapide si sa version est affectée et si des données de requête peuvent atteindre la séquence de rewrite vulnérable. C’est le scénario prioritaire, car l’attaquant n’a pas besoin d’un compte local.

L’exposition du port 443 ne suffit cependant pas à conclure que le chemin vulnérable existe. Un serveur statique sans les directives concernées n’a pas la même surface.

Nginx interne
#

Un service accessible uniquement depuis un réseau maîtrisé réduit la probabilité d’exploitation, pas l’impact d’une corruption mémoire. Il faut le mettre à jour dans le cycle normal de maintenance et vérifier si des applications internes non fiables peuvent lui envoyer des requêtes.

Docker et Kubernetes
#

Un conteneur n’annule pas la vulnérabilité. Il peut toutefois limiter les conséquences selon l’utilisateur du processus, les capacités Linux, les volumes montés et les droits du service account.

Pour ingress-nginx, le numéro de version du contrôleur ne correspond pas directement au numéro de Nginx embarqué. Il faut examiner l’image réellement déployée et les avis du projet ingress-nginx, puis mettre à jour le contrôleur par son mécanisme normal.

Origine derrière un CDN ou un WAF
#

Restreindre l’origine aux seules adresses du CDN réduit les chemins directs vers le serveur. Cela ne constitue pas un correctif : les requêtes transmises atteignent toujours Nginx et aucune règle générique de WAF ne garantit le blocage de toutes les formes exploitables.

Vérifier son exposition
#

Version et paquet
#

Afficher la version du binaire :

nginx -v

Sur Debian ou Ubuntu, relever aussi la version du paquet et sa provenance :

dpkg-query -W -f='${Package}\t${Version}\n' nginx nginx-common 2>/dev/null
apt-cache policy nginx

Ne pas conclure à partir du seul nginx -v. Un paquet maintenu par la distribution peut intégrer le correctif par rétroportage. L’avis du fournisseur et le changelog du paquet font foi.

Configuration effective
#

Afficher la configuration complète, y compris les fichiers inclus :

sudo nginx -T 2>&1 | less

Rechercher les directives concernées :

sudo nginx -T 2>&1 | rg -n '^[[:space:]]*(rewrite|set)[[:space:]]'

Cette recherche produit un inventaire, pas une preuve de vulnérabilité. Le chemin précis dépend de l’enchaînement des directives, de l’utilisation de captures et des données fournies dans l’URI.

Conteneur Docker
#

Identifier l’image, puis interroger le binaire dans le conteneur :

docker inspect --format '{{.Config.Image}}' <conteneur>
docker exec <conteneur> nginx -v

Une image nommée latest ne prouve pas que le conteneur en cours d’exécution a été recréé depuis la dernière version disponible.

Ingress Kubernetes
#

Lister les images déployées dans le namespace ingress-nginx :

kubectl -n ingress-nginx get deploy \
  -o jsonpath='{range .items[*].spec.template.spec.containers[*]}{.image}{"\n"}{end}'

Comparer ensuite ces références avec les avis et notes de publication du contrôleur utilisé.

Détection
#

Il n’existe pas de signature de log universelle pour CVE-2026-42945. Une requête peut provoquer un crash de worker, mais une tentative plus avancée ne produit pas nécessairement une ligne explicite.

Les vérifications suivantes peuvent faire apparaître des crashs ou redémarrages inhabituels :

journalctl -u nginx --since "7 days ago" --no-pager
coredumpctl list nginx 2>/dev/null

Chercher notamment des signaux SIGSEGV, des sorties inattendues de workers ou des redémarrages répétés. Ces événements ont de nombreuses causes possibles. Leur absence ne permet pas d’écarter une tentative.

Ne pas lancer le PoC public contre une instance de production. Le résultat le plus probable est un crash, avec un impact direct sur la disponibilité.

Correctifs et mitigations
#

Mettre à jour
#

Pour CVE-2026-42945, les versions amont minimales corrigées sont 1.30.1 et 1.31.0. Depuis, Nginx a publié d’autres correctifs de sécurité. Il est donc préférable d’installer le paquet actuellement recommandé par le fournisseur plutôt que de viser uniquement ces versions minimales.

Sur Debian ou Ubuntu :

sudo apt update
apt list --upgradable 2>/dev/null | rg '^nginx'
sudo apt install --only-upgrade nginx nginx-common

L’installation peut recharger ou redémarrer Nginx selon le paquet et la distribution. Vérifier ensuite la configuration et l’état du service :

sudo nginx -t
systemctl status nginx --no-pager

Pour une image de conteneur, tirer une image corrigée ne modifie pas les conteneurs existants. Il faut reconstruire ou redéployer le service, puis contrôler la version dans le nouveau conteneur.

Réduire temporairement l’exposition
#

Si la mise à jour est impossible immédiatement :

  • identifier les blocs utilisant rewrite et set ;
  • désactiver la route concernée ou remplacer la logique de rewrite si cela peut être testé ;
  • restreindre l’accès réseau au service ;
  • isoler le worker Nginx avec un utilisateur non privilégié et des permissions minimales.

Ces mesures réduisent le risque sans corriger le dépassement de tampon. Une modification de rewrite peut aussi changer le routage applicatif et doit passer par un test de non-régression.

Conclusion
#

CVE-2026-42945 est une vraie corruption mémoire distante avec un démonstrateur public. Elle ne justifie toutefois pas de classer automatiquement chaque serveur Nginx comme exposé à une RCE triviale.

La décision opérationnelle tient en trois contrôles : version du paquet, présence de la logique rewrite/set concernée et accessibilité de cette route par une source non fiable. Quand ces conditions se cumulent, la mise à jour doit être priorisée. Dans tous les cas, utiliser le paquet corrigé du fournisseur reste plus fiable qu’une mitigation par WAF.

Sources
#

Sources vérifiées le 28 août 2026 :

Articles connexes

Dirty Frag sous Linux : vérifier l'exposition et installer les correctifs

··1359 mots·7 mins
Dirty Frag désigne deux vulnérabilités du noyau Linux publiées le 7 mai 2026 par Hyunwoo Kim. Elles sont suivies sous CVE-2026-43284 pour le chemin XFRM/ESP et CVE-2026-43500 pour RxRPC. Dans les deux cas, un attaquant qui peut déjà exécuter du code localement peut modifier une page du cache mémoire associée à un fichier normalement accessible en lecture seule. Le démonstrateur public utilise cette primitive pour obtenir les privilèges root. Mise à jour du 28 août 2026 : les deux CVE disposent désormais de correctifs dans les noyaux fournis par les principales distributions. La désactivation des modules reste une solution temporaire lorsque la mise à jour est impossible. L’article initial, écrit pendant la divulgation, indiquait encore que le second correctif n’était pas publié.

Ubuntu Server 26.04 LTS : ce qu'il faut savoir avant de migrer

··2469 mots·12 mins
Ubuntu 26.04 LTS est sortie le 23 avril 2026 sous le nom Resolute Raccoon. Pour un poste desktop, c’est une nouvelle LTS avec GNOME 50, Wayland et quelques changements visibles. Pour un serveur, c’est autre chose : une base qui peut rester en production pendant plusieurs années, avec un nouveau noyau, une pile crypto plus stricte, des paquets serveur mis à jour, des changements de comportement sur des services courants, et une stratégie de support à bien comprendre avant de lancer un do-release-upgrade. Je regarde donc Ubuntu 26.04 LTS sous l’angle qui m’intéresse le plus ici : serveurs, VPS, homelab, cloud, sécurité et migration propre.

Debian 14 Forky : builds reproductibles, loong64 et impacts côté serveur

Debian 14, nom de code Forky, est la future version stable de Debian. Au 14 mai 2026, elle est encore en branche testing. Aucune date de sortie n’est annoncée, et les étapes du freeze ne sont pas encore planifiées publiquement. Le bulletin de l’équipe Release publié le 10 mai 2026 apporte tout de même plusieurs informations importantes : les builds reproductibles deviennent une contrainte plus forte dans la migration des paquets, les binNMU passent par davantage de tests automatiques, et l’architecture loong64 arrive dans l’archive Debian. Pour un serveur de production, la conclusion immédiate est simple : Debian 13 Trixie reste la version stable à utiliser. Debian 14 est intéressante à tester dès maintenant, mais pas à déployer comme base principale tant qu’elle n’est pas publiée en stable.