Protéger les sites Web de Hong Kong contre Nuxt XSS(CVE202646342)

Cross Site Scripting (XSS) dans Npm nuxt Npm
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 :

  1. Nuxt a renvoyé du HTML rendu pour __nuxt_island demandes.
  2. 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 :

  1. Trouver un __nuxt_island point 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.
  2. Créer des props contenant une charge utile XSS qui sera rendue dans le fragment sans échappement.
  3. Envoyer la requête via le CDN et provoquer le CDN à mettre en cache la réponse sous une clé partagée.
  4. 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 :

  1. 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.
  2. 4. Désactivez le cache partagé pour __nuxt_island 5. des points de terminaison au CDN/edge/proxy : configurez des règles basées sur le chemin pour contourner le cache ou définissez Cache-Control à 6. no-store / privé 7. jusqu'à ce que vous mettiez à jour.
  3. 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=0 ou 11. s-maxage=0, 12. , et ajoutez les Variez 13. en-têtes appropriés pour les en-têtes/cookies que vous variez.
  4. 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.
  5. 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_island des requêtes contenant des charges utiles comme or encoded equivalents.
  6. Review server-side rendering paths that use user input and ensure proper escaping/encoding of props.
  7. Inform stakeholders (developers, hosting, CDN admins) about the vulnerability and actions taken.

WAF strategy & sample rules (practical examples)

Below are conservative example rules to use as a starting point. Test in detection mode before blocking to avoid false positives.

1. Block or challenge requests with script-like content

IF request.path CONTAINS "__nuxt_island"
AND request.method IN ("GET","POST")
AND (
  request.query_string CONTAINS "

2. Reject serialized HTML/JS in props

IF request.path CONTAINS "__nuxt_island"
AND request.params.props MATCHES "(<[^>]+>|%3C[^%]+%3E|javascript:|on[a-z]+=)"
THEN log & block

3. Enforce origin cache-control for island routes

For responses to __nuxt_island, set:

  • Cache-Control: private, no-store, max-age=0
  • Surrogate-Control: no-store (for CDNs that honor it)

4. Rate-limit suspicious island requests

IF request.path CONTAINS "__nuxt_island"
AND requests_from_ip > 10 per minute
THEN rate-limit or block

5. Monitor for inline scripts in cached responses

Alert on edge logs where responses for island routes include inline