flawopen.com/Incidents/wordpress-stored-xss-admin-session-campaign-october-2026
Campaña de XSS almacenado en WordPress: dos plugins, una cadena de persistencia
Patchstack observó intentos de usar el mismo implante posterior a la explotación a través de dos fallos de XSS almacenado en WordPress. Actualice ambos plugins e investigue la persistencia: el parche no limpia un sitio ya comprometido.[1], [2], [3], [4], [5]
Imagina dos buzones públicos de sugerencias cuyos mensajes abre después el administrador del sitio. Si el sitio guarda un mensaje como marcado ejecutable en vez de mostrarlo como texto, puede actuar con los privilegios del navegador del administrador al abrirse. El informe de campaña dice que se usaron dos fallos distintos de plugins como puntos de entrada y que después se intentó mantener el acceso tras una actualización.[1], [8], [9]
Conceptos Clave y Términos
XSS almacenado- Texto controlado por un atacante se guarda y luego se muestra en el navegador como marcado ejecutable. Aquí, el contexto relevante era la administración de WordPress.[2], [3], [8], [9]
Sesión de mismo origen- El navegador envía automáticamente la sesión del sitio en solicitudes del mismo origen. Un script que ya se ejecuta en ese sitio puede actuar mediante la página sin leer una cookie HttpOnly.[1], [17], [18]
Persistencia- Acceso que continúa después de corregir el fallo inicial, por ejemplo, cuentas o archivos no autorizados. Una actualización limpia no elimina esos cambios.[1]
Atribución de CVSS- Los registros CNA de Wordfence asignan CVSS 3.1 7,2 a cada CVE. Patchstack muestra 7,1 en su aviso de WPC Product Bundles; este artículo usa la puntuación del registro CVE y mantiene la atribución de la fuente.[2], [3], [6]
Referencias al código fuente- Las referencias CNA de Wordfence señalan archivos versionados de WPC Product Bundles y Ninja Forms relacionados con validación, almacenamiento y visualización administrativa. Son pistas de código, no un diff de parche verificado. El par PHP anterior es un modelo ilustrativo de codificación de salida, no código reconstruido de los plugins.[8], [9], [10], [11], [12], [13], [14], [15], [16]
Mapeos de marcos
- Referencia CWE para la debilidad descrita en esta guía: CWE-79
- OWASP Top 10:2025 — A05:2025 Injection
Cronología del Incidente
Los registros CNA de Wordfence muestran fechas de publicación del 21 de septiembre, mientras que Patchstack afirma que las fallas ya se habían divulgado públicamente el 22 de septiembre. Las fuentes difieren por un día; los registros CVE indican versiones afectadas hasta 8.6.6 y 3.15.3, respectivamente.[2], [3], [8], [9], [1]
Patchstack informa de intentos con la misma fase posterior a la explotación, primero mediante WPC Product Bundles y luego mediante Ninja Forms. Patchstack publicó su análisis el 6 de octubre.[1]
Flujo de Ataque Paso a Paso
El contenido guardado llega a un administrador
Los datos enviados se guardan y luego se muestran en una vista administrativa de pedido o envío. Si el tratamiento inseguro de salida permite ejecutarlos como marcado, la visita del administrador aporta el contexto del navegador.[1], [8], [9], [10], [11], [12], [13], [14]
El script hereda el contexto del sitio
El código que se ejecuta en el origen de WordPress puede hacer solicitudes del mismo origen con la sesión existente del administrador. HttpOnly protege la confidencialidad de la cookie; no impide que código ya ejecutado en ese origen use la sesión.[1], [17], [18]
El acceso posterior puede sobrevivir al fallo
Patchstack informa de intentos de instalar un plugin y crear persistencia adicional. Son observaciones de la campaña, no un resultado confirmado para cada objetivo; actualizar bloquea la entrada vulnerable, pero no elimina cambios ya realizados.[1], [4], [5]
Código Fuente: Vulnerable vs. Seguro
Este es el cambio de código fuente en Textarea::admin_form_element() de Ninja Forms, no un modelo genérico. La versión 3.15.3 interpolaba directamente el texto almacenado del envío en el cuerpo HTML de un textarea; la 3.15.4 aplica esc_textarea() antes de mostrarlo. Así se evita que ese contenido se interprete como marcado en este contexto. El ejemplo documenta solo la ruta de Ninja Forms para CVE-2026-94504; no es la corrección de WPC Product Bundles para CVE-2026-93836. Use un escape específico para cada contexto en los demás casos.[13], [15], [16]
public function admin_form_element( $id, $value )
{
return "<textarea class='widefat' name='fields[$id]'>$value</textarea>";
}public function admin_form_element( $id, $value )
{
return "<textarea class='widefat' name='fields[$id]'>" . esc_textarea( $value ) . "</textarea>";
}Lista de Verificación de Seguridad para Ingeniería
- ✓Actualice WPC Product Bundles al menos a 8.6.7 para corregir
CVE-2026-93836; en la comprobación del 11 de octubre de 2026, WordPress.org indicaba 8.7.4 como versión actual. El registro de 8.7.3 también menciona un refuerzo contra XSS almacenado sin vincularlo a esta CVE; instale la versión actual. Actualice Ninja Forms al menos a 3.15.4 para corregirCVE-2026-94504; en la comprobación del 11 de octubre de 2026, WordPress.org indicaba 3.15.5 como actual. El registro de 3.15.5 añade protección contra XSS almacenado en envíos del campo Paragraph Text (Rich Text), separada de la corrección de la CVE en 3.15.4. Compruebe las versiones instaladas de ambos plugins en todos los sitios de producción.[2], [3], [4], [5] - ✓Si una versión vulnerable estuvo expuesta, investigue antes de declarar la recuperación: compare las cuentas de administrador de la base de datos con el panel y revise plugins inesperados, incluidos los must-use.[1]
- ✓Revise los registros web, de WordPress y del alojamiento en busca de acciones administrativas, instalaciones de plugins y cambios inesperados cuando se consultaron pedidos o envíos.[1]
- ✓Recomendación operativa de FlawOpen: Elimine accesos no autorizados mediante un proceso confiable de respuesta a incidentes; tras contenerlos, rote credenciales privilegiadas y salts de autenticación de WordPress y revise otros secretos accesibles.
- ✓Recomendación operativa de FlawOpen: Conserve una copia de seguridad confiable y valide la base de datos, los archivos de plugins y el checkout/formularios antes de restaurar el servicio; actualizar no demuestra que la persistencia haya desaparecido.
Fuentes
- Patchstack — Four ways back in: the WordPress XSS campaign that hides its own admin account (2026-10-06)
- CVE-2026-93836 — CVE record (Wordfence CNA)
- CVE-2026-94504 — CVE record (Wordfence CNA)
- WPC Product Bundles for WooCommerce — WordPress.org changelog
- Ninja Forms — WordPress.org changelog
- Patchstack — WPC Product Bundles advisory
- NCSA Qatar — Cybersecurity advisories (October 7, 2026)
- Wordfence CNA — CVE-2026-93836 vulnerability record
- Wordfence CNA — CVE-2026-94504 vulnerability record
- CVE-2026-93836 — WPC Product Bundles 8.6.5 source pointer: class-woosb.php
- CVE-2026-93836 — WPC Product Bundles 8.6.5 source pointer: class-backend.php
- CVE-2026-94504 — Ninja Forms 3.15.3 source pointer: Submission.php
- CVE-2026-94504 — Ninja Forms 3.15.3 source pointer: Textarea.php
- CVE-2026-94504 — Ninja Forms 3.15.3 source pointer: admin submission template
- Ninja Forms 3.15.3 to 3.15.4 changeset referenced by CVE-2026-94504
- Corrección de código de Ninja Forms 3.15.4 — Textarea::admin_form_element()
- MDN — Política del mismo origen