Ce qui a été publié le 14 octobre
Le 14 octobre 2026, l'équipe Next.js a publié une mise à jour de sécurité hors cycle : la version 16.4.1 pour la ligne Active LTS et la version 15.5.28 pour la ligne Maintenance LTS. Elle corrige trois failles liées à des dépendances amont : deux exécutions de code à distance critiques, sans authentification, et un déni de service de sévérité haute. Deux de ces correctifs avaient été reportés depuis la publication de septembre, en raison de retards chez les projets amont.
Sur un serveur que vous administrez, le correctif n'arrive pas tout seul. Il faut relever next, vérifier que la bibliothèque sharp suit, reconstruire l'application et redémarrer le processus qui sert réellement le trafic. Cet article suit ce chemin pour PM2, Docker et Coolify, sans refaire l'installation d'un serveur Next.js.
Ce qu'il faut retenir
- GHSA-673q-mjm6-r5xr (critique) — exécution de code à distance sans authentification dans une application App Router avec Cache Components, lorsqu'une fonction
use cacheretourne plusieurs tableaux typés. Aucun contournement connu. L'avis donne la plage 16.0.0 à 16.4.0 et un score CVSS de 9.5. - CVE-2026-96889 / GHSA-2464-fhr4-w9xw (critique) — exécution de code à distance par une bibliothèque amont de l'API d'optimisation d'images, lorsque des fichiers SVG sont utilisés, sur un Linux à base de glibc. Score de 9.5. Parade officielle : sharp 0.35.5 ou supérieur.
- GHSA-p3m5-59mp-jv5r (haute) — déni de service dans une application App Router qui compte au moins une Server Action : des requêtes forgées saturent le processeur et bloquent les requêtes suivantes du même processus. Score de 8.2. Le Pages Router, ou l'absence de Server Action, n'est pas concerné.
- Versions corrigées — 16.4.1 pour la ligne 16 et 15.5.28 pour la ligne 15, avec les commandes officielles
npm install [email protected]etnpm install [email protected]. - Pas de CVE pour deux avis sur trois — seul le RCE d'image porte un identifiant CVE. Les deux autres se suivent par leur identifiant GHSA : un outil qui ne cherche que des CVE les manquera.
- Même sans usage direct — pour le RCE
use cache, Vercel demande de mettre à jour même si l'application ne contient pas de fonction similaire.
Sans use cache ni SVG, pourquoi ça ne suffit pas
Trois raisons de ne pas s'arrêter à cette objection. D'abord, pour le RCE lié à use cache, l'annonce est explicite : aucun contournement n'existe, et la mise à jour est demandée même quand l'application n'a pas de fonction similaire. Ensuite, le RCE d'image dépend d'une bibliothèque amont, et vous ne savez pas toujours quels fichiers SVG atteignent l'optimiseur, notamment quand des images viennent de sources distantes. Enfin, le déni de service ne demande qu'une seule Server Action, ce que beaucoup de formulaires App Router contiennent déjà.
Le risque de casse est limité : la montée reste dans la même ligne, 16.4.x ou 15.5.x. Seule contrainte à connaître, la version 16.4.1 déclare Node 20.9 ou supérieur, alors que la 15.5.28 accepte Node 18.18 et plus. Si vous êtes sur une 16.x plus ancienne, le passage à la 16.4.1 reste dans la même majeure.
Quelle version installer selon votre ligne
Faites défiler le tableau
| Votre version | Statut | Que faire |
|---|---|---|
| 16.0.0 à 16.4.0 | Touchée par les trois avis | Passer à 16.4.1 ou à une 16.4.x plus récente |
| 16.4.1 et suivantes | Correctif inclus | Contrôler sharp et le redéploiement réel |
| 15.0.0 à 15.5.27 | Touchée par le RCE d'image et le DoS | Passer à 15.5.28, puis planifier la migration vers 16.4.x |
| 15.5.28 | Correctif inclus | Planifier la migration vers 16.4.x |
| 13.x et 14.x | Touchée, aucun correctif publié pour ces lignes | Migrer vers 15.5.28 ou 16.4.1 |
| 10.0.0 à 12.x | Touchée par le RCE d'image, aucun correctif publié | Migrer vers une ligne maintenue |
Savoir ce qui tourne réellement
La version écrite dans votre dépôt n'est pas celle qui répond aux requêtes. Un lockfile peut dater d'avant la correction, un build Docker peut réutiliser une couche en cache, un processus PM2 peut pointer vers un ancien répertoire de release. Avec la sortie standalone, Next.js copie dans le dossier de déploiement les fichiers de node_modules dont il a besoin : le sharp embarqué est donc celui présent au moment du build, pas celui que vous avez installé ensuite. Les contrôles suivants se font sur la machine ou dans le conteneur qui sert le trafic.
Inventorier en cinq contrôles
Lire les versions de Next.js et de sharp
Depuis la racine du projet :
npm ls next sharp, oupnpm why sharpavec pnpm. Pour la version exacte de Next.js :node -p "require('next/package.json').version". Unsharpinférieur à 0.35.5 sousnextest à corriger.Repérer Cache Components et use cache
grep -rn "cacheComponents" next.config.*puisgrep -rln "use cache" app src. SicacheComponentsn'apparaît pas, votre application n'emprunte pas le chemin décrit par l'avis. Mettez à jour quand même : Vercel le demande dans tous les cas.Repérer l'usage des SVG
grep -rn "dangerouslyAllowSVG\|remotePatterns" next.config.*etfind public -name "*.svg". Par défaut, la documentation indique que Next.js n'optimise pas les SVG, et quedangerouslyAllowSVGles autorise. L'absence de ce réglage est un bon signe, pas une preuve : l'avis ne détaille pas le chemin exact.Repérer les Server Actions
grep -rln "use server" app src. Un seul fichier suffit à rendre une application App Router concernée par le déni de service.Reconnaître la bibliothèque C du système
ldd --versionaffiche GNU libc sur Debian, Ubuntu, AlmaLinux ou Rocky, et musl libc sur Alpine. L'avis ne parle que de glibc et ne dit rien de musl : n'en déduisez pas que Alpine est épargné. Dans un conteneur :docker exec <conteneur> ldd --version.
Mettre à jour, puis contrôler le lockfile
Lancez la commande de votre ligne : npm install [email protected] ou npm install [email protected]. Reste un piège que l'annonce ne détaille pas. La version 16.4.1 déclare sharp en dépendance optionnelle avec la plage ^0.35.5, mais la 15.5.28 déclare ^0.34.3 || ^0.35.5. Un lockfile qui contient déjà une 0.34.x satisfait cette plage : le gestionnaire de paquets n'a aucune raison de la relever.
Contrôlez donc le résultat avec npm ls sharp. S'il affiche une version inférieure à 0.35.5, forcez la montée avec npm install sharp@^0.35.5, ou ajoutez un override dans package.json, par exemple "overrides": { "sharp": "^0.35.5" }. Avec pnpm ou yarn, l'équivalent consiste à relever sharp ou à déclarer un override. Validez le lockfile dans le dépôt : c'est lui que la CI et l'image Docker liront.
Redéployer selon votre cible
Valider le build
npm ci, puisnpm run build, puisnpm ls next sharp. Si le build échoue sur Node, vérifiez la version exigée par la ligne choisie.PM2
Construisez dans le répertoire que PM2 exécute, puis
pm2 reload <nom>. Contrôlez ensuite avecpm2 describe <nom>que le répertoire d'exécution est bien celui que vous venez de reconstruire : avec un schéma de releases, un lien symbolique oublié relance l'ancien code.Docker
Reconstruisez sans cache :
docker build --no-cache -t monapp:corrige ., ou invalidez au moins la couchenpm ci. Relancez avecdocker compose up -d --force-recreate. Comparez ensuite l'image du conteneur en cours (docker inspect -f '{{.Image}}' <conteneur>) à celle que vous venez de construire.Coolify
Déclenchez un redéploiement qui ignore le cache de build, puis lisez le journal : l'étape d'installation des dépendances doit s'exécuter, pas être marquée comme réutilisée. Un simple redémarrage ne reconstruit rien.
Prouver le correctif
Lisez la version dans le processus en cours, pas dans le dépôt :
docker exec <conteneur> node -p "require('next/package.json').version"doit afficher 16.4.1 ou 15.5.28 (ou une version plus récente de la même ligne). Contrôlezsharpavecdocker exec <conteneur> grep '"version"' node_modules/sharp/package.json, qui doit afficher 0.35.5 ou supérieur.
Si vous ne pouvez pas redéployer aujourd'hui
Pour le RCE lié à use cache, il n'existe aucune parade : seule la mise à jour corrige. Pour les deux autres failles, quelques atténuations réduisent le risque en attendant. Elles ne remplacent pas le correctif, et il faut les noter comme provisoires dans votre suivi d'exploitation.
Atténuations provisoires, pas des correctifs
- Relever sharp seul — c'est la parade officielle du RCE d'image : sharp 0.35.5 ou supérieur. Contrôlez que le build passe et que l'optimisation d'images fonctionne.
- Ne pas servir de SVG par l'optimiseur — laissez
dangerouslyAllowSVGdésactivé et ne l'activez pas sans besoin avéré. - Restreindre
images.remotePatterns— limitez les sources distantes que l'optimiseur accepte aux hôtes que vous maîtrisez. - Node en exécutable PIE — l'avis de sharp cite ce mode pour réduire le risque d'exécution de code, en précisant que les binaires officiels de Node.js ne sont pas PIE.
- Réduire les dégâts possibles — processus sans droits root, conteneur en lecture seule (
docker run --read-only), aucun secret inutile dans l'environnement. - Limiter le débit devant Next.js — une règle
limit_reqdans nginx et une alerte sur le processeur ralentissent un déni de service, sans l'empêcher.
Lancez npm audit après la mise à jour
npm audit s'appuie sur la base d'avis de GitHub : il couvre donc les identifiants GHSA, y compris ceux qui n'ont pas de CVE. Lancez-le après la montée de version, et ajoutez-le à votre CI pour que le prochain avis ne dépende pas d'une veille manuelle.
Après le correctif : surveiller et planifier la ligne 15
Les avis ne publient pas d'indicateur de compromission : il n'y a donc pas de signature précise à rechercher. Surveillez les signes généraux. Un processus Node dont le processeur reste saturé évoque le déni de service. Des redémarrages inattendus, des processus enfants que l'application ne lance jamais, ou des connexions sortantes depuis l'utilisateur de l'application justifient une enquête. Dans les journaux nginx, grep "_next/image" access.log | grep -i svg montre les demandes d'optimisation qui visent des SVG.
Sur la ligne 15, soyez prudent avec le calendrier. D'après endoflife.date, le support de sécurité de la ligne 15 s'est terminé le 21 octobre 2026, alors que la page de politique de Next.js ne donne pas de date et fixe deux ans de Maintenance LTS. La 15.5.28 peut donc être le dernier correctif de cette ligne : planifiez la migration vers la 16.4.x. La 16.4.2, publiée le lendemain de la 16.4.1, ne contient d'après ses notes que des rétroportages sans lien avec ces avis.
La documentation officielle
Annonce Next.js du 14 octobre 2026 : https://nextjs.org/blog/nextjs-security-update-october-14-2026
Avis GitHub : https://github.com/vercel/next.js/security/advisories/GHSA-673q-mjm6-r5xr, https://github.com/vercel/next.js/security/advisories/GHSA-2464-fhr4-w9xw et https://github.com/vercel/next.js/security/advisories/GHSA-p3m5-59mp-jv5r
Avis sharp : https://github.com/lovell/sharp/security/advisories/GHSA-wq5f-xc86-pv6w
Note de Netlify : https://www.netlify.com/changelog/2026-10-14-nextjs-react-security-vulnerabilities/
Politique de support : https://nextjs.org/support-policy et https://endoflife.date/nextjs