| Nom du plugin | nuxt |
|---|---|
| Type de vulnérabilité | Script intersite (XSS) |
| Numéro CVE | CVE-2026-46342 |
| Urgence | Faible |
| Date de publication CVE | 2026-05-20 |
| URL source | CVE-2026-46342 |
__nuxt_island empoisonnement de cache et XSS — pourquoi les sites WordPress utilisant des frontends Nuxt doivent agir maintenant
Par : Expert en sécurité de Hong Kong
Résumé : Nuxt a corrigé une vulnérabilité où le __nuxt_island point de terminaison ne liait pas les réponses aux propriétés de la requête, permettant l'empoisonnement de cache partagé qui peut conduire à du cross-site scripting (XSS) stocké ou réfléchi pour les sites utilisant Nuxt SSR ou des îlots avec des caches partagés. Les backends WordPress associés à des frontends Nuxt (headless, hybride, JAMstack) ou les sites derrière des CDN/proxies partagés sont à risque. Cet article explique le problème, des scénarios d'exploitation réalistes et des atténuations pratiques pour les équipes WordPress du point de vue d'un praticien de la sécurité de Hong Kong.
CVE : CVE-2026-46342 — Avis : GHSA-g8wj-3cr3-6w7v — Versions nuxt affectées : >= 4.0.0-alpha.1, <= 4.4.5 — Corrigé dans : 4.4.6
Pourquoi les propriétaires de sites WordPress devraient s'en soucier (même si WordPress lui-même n'est pas Nuxt)
À Hong Kong et dans le monde, WordPress est utilisé dans diverses architectures de livraison :
- Traditionnelle : WordPress rend le HTML côté serveur et le sert directement.
- Headless / Hybride : WordPress est le backend de contenu (REST API / GraphQL) et un framework JS (comme Nuxt) rend le frontend avec SSR, régénération incrémentale ou “îlots”.
- Configurations lourdes en CDN et cache : Les sites se trouvent derrière des CDN et des proxies inverses qui mettent en cache les réponses pour des performances optimales.
Si votre site WordPress utilise un frontend Nuxt, ou si des routes gérées par Nuxt sont servies depuis le même nom d'hôte et la même couche de cache que le contenu WordPress, un problème d'empoisonnement de cache Nuxt peut injecter du HTML/JS malveillant que les navigateurs exécutent lors du chargement des pages. Les conséquences incluent XSS, vol d'identifiants, injection de publicités ou compromission supplémentaire. Même les sites purement WordPress devraient être conscients : des stacks mixtes partageant un CDN ou un proxy peuvent subir un impact croisé d'une route Nuxt vulnérable.
Que s'est-il exactement passé : explication technique (simple et détaillée)
L'architecture des îlots de Nuxt expose un point de terminaison : __nuxt_island. Ce point de terminaison accepte des requêtes portant des “props” utilisées pour rendre des îlots (petits fragments SSR). Le bug combine deux échecs :
- Nuxt a renvoyé du HTML rendu pour
__nuxt_islanddemandes. - La clé de cache de réponse utilisée par les caches intermédiaires (CDNs, proxies inverses, caches de périphérie) n'incluait pas de manière fiable les propriétés de la requête, de sorte que différentes requêtes pouvaient correspondre à la même entrée de cache.
En conséquence, une réponse produite pour un ensemble de props pourrait être stockée dans un cache partagé et ensuite servie à d'autres visiteurs qui ont demandé le même chemin mais avec des props différents. Si les props contiennent des valeurs contrôlées par un attaquant qui sont rendues sans encodage approprié, un attaquant peut créer une requête dont la réponse est mise en cache et ensuite servie à de nombreux visiteurs — classique empoisonnement de cache permettant un XSS généralisé.
Points techniques clés :
- Une clé de cache doit distinguer les réponses spécifiques à l'utilisateur ou à la requête. Si ce n'est pas le cas, les utilisateurs reçoivent du contenu destiné à d'autres.
- Pour les points de terminaison SSR qui rendent des fragments dynamiques, la clé de cache doit inclure les props ou le point de terminaison doit renoncer au cache partagé (Cache-Control : privé / no-store).
- Le XSS se produit lorsque des entrées non fiables atteignent HTML/JS sans échappement correct ; les caches partagés multiplient l'effet.
Scénario d'attaque réaliste contre un frontend WordPress + Nuxt
Déploiement commun :
- WordPress sert du contenu via l'API REST.
- Le frontend Nuxt effectue du SSR, demandant des données et rendant des îlots via
__nuxt_island. - Le site est servi depuis un domaine commun utilisant un CDN qui met en cache les réponses du serveur Nuxt.
Étapes d'exploitation qu'un attaquant pourrait suivre :
- Trouver un
__nuxt_islandpoint de terminaison qui accepte des entrées contrôlées par l'attaquant via des paramètres de requête ou le corps de la requête utilisés comme props. - Créer des props contenant une charge utile XSS qui sera rendue dans le fragment sans échappement.
- Envoyer la requête via le CDN et provoquer le CDN à mettre en cache la réponse sous une clé partagée.
- Les visiteurs suivants reçoivent le HTML empoisonné et le script de l'attaquant s'exécute dans leurs navigateurs.
Conséquences potentielles :
- Vol de données d'identification si des cookies sont présents.
- Vol de session pour les administrateurs ou les éditeurs visitant le frontend.
- Dommages SEO et à la marque dus à des publicités ou des redirections insérées.
- Distribution de logiciels malveillants via des scripts ou des redirections injectés.
Étapes immédiates (que faire aujourd'hui — priorisées)
1. Si votre site peut être affecté (vous utilisez des frontends Nuxt, ou un CDN/proxy qui sert des routes Nuxt), suivez cette séquence immédiatement :
- 2. Mettez à jour Nuxt 3. vers la version corrigée (4.4.6 ou ultérieure). C'est la solution définitive ; coordonnez-vous avec les équipes frontend et planifiez la mise à jour maintenant.
- 4. Désactivez le cache partagé pour
__nuxt_island5. des points de terminaison au CDN/edge/proxy : configurez des règles basées sur le chemin pour contourner le cache ou définissezCache-Controlà6. no-store/privé7. jusqu'à ce que vous mettiez à jour. - 8. Définissez les en-têtes de réponse d'origine 9. pour les routes d'île : utilisez
10. Cache-Control : private, no-store, max-age=0ou11. s-maxage=0, 12. , et ajoutez lesVariez13. en-têtes appropriés pour les en-têtes/cookies que vous variez. - 14. Déployez des règles WAF 15. (ou filtrage CDN edge) pour bloquer ou surveiller les propriétés suspectes : signalez ou bloquez les requêtes contenant des balises script ou des motifs de script encodés dans la requête/le corps.
- 16. Purgez les caches et les journaux d'audit : 17. supprimez toutes les réponses d'île mises en cache, et recherchez dans les journaux des requêtes suspectes contenant des charges utiles comme
__nuxt_islanddes requêtes contenant des charges utiles commetags or external script references to unfamiliar hosts.Always run rules in monitoring mode first, tune them against real traffic, and escalate to blocking only after validating low false-positive rates.
Cache configuration recommendations
- For server-rendered fragments that depend on per-request data (cookies, auth, props), use
Cache-Control: privateorCache-Control: no-store. Shared caches should not store user-specific content. - If you allow caching, ensure the cache key includes any user- or request-specific identifier used by Nuxt props. Many CDNs allow custom cache key composition — include only the minimal, necessary identifiers to avoid cache collisions.
- Use
Vary:headers correctly. If responses depend onCookieorAuthorization, includeVary: Cookiewhere applicable. - Avoid caching raw HTML fragments that contain unescaped user content.
- Regularly sample cached content to check for integrity and absence of injected scripts.
Detecting if you’ve been hit (indicators of compromise)
- Unexpected inline scripts or external JS from unfamiliar hosts.
- User reports of redirects, popups, or strange behavior on Nuxt-served pages.
- CDN edge logs showing
__nuxt_islandrequests with unusual query strings or bodies followed by many cached GET responses. - Traffic spikes to island paths with new inline scripts.
- Security scanners/site-monitoring alerts flagging injected scripts.
Investigation steps:
- For server-rendered fragments that depend on per-request data (cookies, auth, props), use