| Nombre del plugin | nuxt |
|---|---|
| Tipo de vulnerabilidad | Scripting entre sitios (XSS) |
| Número CVE | CVE-2026-46342 |
| Urgencia | Baja |
| Fecha de publicación de CVE | 2026-05-20 |
| URL de origen | CVE-2026-46342 |
__nuxt_island envenenamiento de caché y XSS — por qué los sitios de WordPress que utilizan frontends de Nuxt deben actuar ahora
Por: Experto en Seguridad de Hong Kong
Resumen: Nuxt corrigió una vulnerabilidad donde el __nuxt_island endpoint no vinculaba respuestas a las propiedades de la solicitud, permitiendo el envenenamiento de caché compartido que puede llevar a scripting entre sitios almacenado o reflejado (XSS) para sitios que utilizan Nuxt SSR o islas con cachés compartidos. Los backends de WordPress emparejados con frontends de Nuxt (sin cabeza, híbrido, JAMstack) o sitios detrás de CDNs/proxies compartidos están en riesgo. Este artículo explica el problema, escenarios de explotación realistas y mitigaciones prácticas para los equipos de WordPress desde la perspectiva de un profesional de seguridad de Hong Kong.
CVE: CVE-2026-46342 — Aviso: GHSA-g8wj-3cr3-6w7v — Versiones de nuxt afectadas: >= 4.0.0-alpha.1, <= 4.4.5 — Corregido en: 4.4.6
Por qué los propietarios de sitios de WordPress deberían preocuparse (incluso si WordPress en sí no es Nuxt)
En Hong Kong y a nivel global, WordPress se utiliza en diversas arquitecturas de entrega:
- Tradicional: WordPress renderiza HTML del lado del servidor y lo sirve directamente.
- Sin cabeza / Híbrido: WordPress es el backend de contenido (REST API / GraphQL) y un marco de JS (como Nuxt) renderiza el frontend con SSR, regeneración incremental o “islas”.
- Configuraciones pesadas en CDN y caché: Los sitios están detrás de CDNs y proxies inversos que almacenan en caché las respuestas para mejorar el rendimiento.
Si tu sitio de WordPress utiliza un frontend de Nuxt, o si las rutas gestionadas por Nuxt se sirven desde el mismo nombre de host y capa de caché que el contenido de WordPress, un problema de envenenamiento de caché de Nuxt puede inyectar HTML/JS malicioso que los navegadores ejecutan cuando se cargan las páginas. Las consecuencias incluyen XSS, robo de credenciales, inyección de anuncios o un compromiso adicional. Incluso los sitios de WordPress puros deberían estar al tanto: las pilas mixtas que comparten un CDN o proxy pueden sufrir un impacto cruzado de una ruta vulnerable de Nuxt.
Qué salió mal exactamente: explicación técnica (clara y detallada)
La arquitectura de islas de Nuxt expone un endpoint: __nuxt_island. Este endpoint acepta solicitudes que llevan “props” utilizadas para renderizar islas (pequeños fragmentos de SSR). El error combina dos fallos:
- Nuxt devolvió HTML renderizado para
__nuxt_islandsolicitudes. - La clave de caché de respuesta utilizada por cachés intermedios (CDNs, proxies inversos, cachés de borde) no incluía de manera confiable las propiedades de la solicitud, por lo que diferentes solicitudes podían mapearse a la misma entrada de caché.
Como resultado, una respuesta producida para un conjunto de propiedades podría almacenarse en una caché compartida y luego servirse a otros visitantes que solicitaron la misma ruta pero con diferentes propiedades. Si las propiedades contienen valores controlados por un atacante que se renderizan sin la codificación adecuada, un atacante puede crear una solicitud cuya respuesta se almacena en caché y luego se sirve a muchos visitantes: un clásico envenenamiento de caché que permite un XSS generalizado.
Puntos técnicos clave:
- Una clave de caché debe distinguir respuestas específicas del usuario o de la solicitud. Si no lo hace, los usuarios reciben contenido destinado a otros.
- Para los puntos finales de SSR que renderizan fragmentos dinámicos, la clave de caché debe incluir las propiedades o el punto final debe optar por no participar en la caché compartida (Cache-Control: private / no-store).
- El XSS ocurre cuando la entrada no confiable llega a HTML/JS sin el escape correcto; las cachés compartidas multiplican el efecto.
Escenario de ataque realista contra un frontend de WordPress + Nuxt
Implementación común:
- WordPress sirve contenido a través de la API REST.
- El frontend de Nuxt realiza SSR, solicitando datos y renderizando islas a través de
__nuxt_island. - El sitio se sirve desde un dominio común utilizando un CDN que almacena en caché las respuestas del servidor Nuxt.
Pasos de explotación que un atacante podría seguir:
- Encontrar un
__nuxt_islandpunto final que acepte entrada controlada por el atacante a través de parámetros de consulta o cuerpo de solicitud utilizados como propiedades. - Crear propiedades que contengan una carga útil de XSS que se renderizará en el fragmento sin escape.
- Enviar la solicitud a través del CDN y hacer que el CDN almacene en caché la respuesta bajo una clave compartida.
- Los visitantes posteriores reciben el HTML envenenado y el script del atacante se ejecuta en sus navegadores.
Consecuencias potenciales:
- Robo de credenciales si hay cookies presentes.
- Robo de sesión para administradores o editores que visitan el frontend.
- Daño a SEO y a la marca por anuncios o redirecciones insertadas.
- Distribución de malware a través de scripts inyectados o redirecciones.
Pasos inmediatos (qué hacer hoy — priorizado)
Si su sitio podría verse afectado (usa frontends de Nuxt, o un CDN/proxy que sirva rutas de Nuxt), siga esta secuencia inmediatamente:
- Actualizar Nuxt a la versión corregida (4.4.6 o posterior). Esta es la solución definitiva; coordine con los equipos de frontend y programe la actualización ahora.
- Desactivar la caché compartida para
__nuxt_islandpuntos finales en CDN/borde/proxy: configure reglas basadas en rutas para omitir la caché o establecerCache-Controltono-store/privadohasta que actualice. - Establecer encabezados de respuesta de origen para rutas de isla: usar
Cache-Control: privado, no-store, max-age=0ors-maxage=0, y agregarVaryencabezados para encabezados/cookies que varíe. - Implementar reglas de WAF (o filtrado en el borde del CDN) para bloquear o monitorear propiedades sospechosas: marcar o bloquear solicitudes que contengan etiquetas de script o patrones de script codificados en la consulta/cuerpo.
- Purgar cachés y registros de auditoría: eliminar cualquier respuesta de isla en caché y buscar en los registros actividades sospechosas.
__nuxt_islandsolicitudes que contienen cargas útiles comotags 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