| Nombre del plugin | Plugin de SEO de WordPress Yoast |
|---|---|
| Tipo de vulnerabilidad | Scripting entre sitios (XSS) |
| Número CVE | CVE-2026-3427 |
| Urgencia | Baja |
| Fecha de publicación de CVE | 2026-03-23 |
| URL de origen | CVE-2026-3427 |
Yoast SEO (<= 27.1.1) XSS almacenado (CVE-2026-3427) — Guía práctica para propietarios y administradores de sitios de WordPress
TL;DR
Una vulnerabilidad de Cross-Site Scripting (XSS) almacenada en las versiones de Yoast SEO hasta e incluyendo 27.1.1 (CVE-2026-3427) permite a un usuario autenticado con privilegios de Contribuidor guardar contenido (por ejemplo, en un atributo de bloque llamado jsonText) que puede ejecutar JavaScript más tarde en el navegador de un editor o administrador que visualiza o edita ese contenido. La solución está incluida en Yoast SEO 27.2. Parchea de inmediato; si no es posible un parcheo inmediato, aplica controles compensatorios, busca contenido sospechoso y restringe las capacidades de los contribuyentes.
What’s the vulnerability?
- A stored XSS exists in Yoast SEO versions ≤ 27.1.1.
- El problema se activa a través del
jsonTextatributo utilizado por un bloque (Gutenberg) u otro contenido guardado: HTML no escapado puede persistir y ejecutarse más tarde en un contexto de navegador de administrador/editor. - Requisitos previos para la explotación: un usuario autenticado de nivel Contribuidor para almacenar la carga útil, y un Editor/Admin para abrir o editar el contenido afectado (se requiere interacción del usuario).
- Parcheado en Yoast SEO 27.2 — los sitios que ejecutan versiones anteriores son vulnerables hasta que se actualicen.
Por qué esto es importante — evaluación de riesgos práctica
El XSS almacenado es persistente y se ejecuta en el contexto de seguridad de usuarios de confianza. Para organizaciones y equipos editoriales con sede en Hong Kong que dependen de flujos de trabajo colaborativos, las consecuencias pueden ser materiales:
- Compromiso de cuentas de sesiones de Editor/Admin (robo de cookies, captura de tokens).
- Acciones administrativas no autorizadas: creación de cuentas, modificación de plugins/temas, cambio de opciones del sitio.
- Desfiguración del sitio, inyección de spam SEO, redirecciones o exfiltración de datos encubierta.
Restricciones que reducen el riesgo: un atacante necesita una cuenta de Contribuidor (o equivalente), y un usuario privilegiado debe abrir el contenido. No obstante, muchos sitios aceptan contribuyentes o tienen flujos de trabajo de múltiples autores — no asumas seguridad.
Flujo de ataque realista
- El atacante obtiene o crea una cuenta de Contribuyente (registro, credenciales robadas, ingeniería social).
- El Contribuyente crea/edita una publicación o bloque incrustando una carga útil en un
jsonTextatributo que incluye JavaScript (por ejemplo,or event handlers). - Payload is stored in the database as post content or block attribute.
- An Editor/Admin opens the post in the block editor; the script runs in their browser.
- Malicious script performs actions (modify site options, create admin users, exfiltrate cookies, install backdoors).
- Attacker uses stolen session tokens to achieve persistent administrative access.
Immediate actions (first 24 hours)
If you operate WordPress sites running Yoast SEO ≤ 27.1.1, perform these steps immediately and in order:
- Patch: Update Yoast SEO to 27.2 or later as soon as possible. This is the primary mitigation.
- When you cannot update immediately:
- Restrict or temporarily suspend Contributor publishing rights.
- Disable access to the block editor for high-privilege accounts from untrusted networks where practical.
- Deploy detection/blocking rules on your perimeter WAF (virtual patch) to catch suspicious payloads in
jsonTextor editor POSTs.
- Audit recent content: Review posts/pages and revisions created by Contributors in the last 30–90 days for suspicious HTML or JS.
- Credential hygiene: Rotate passwords for admin/editor accounts and enable multi-factor authentication where available.
- Backups: Create a fresh backup of database and files before performing intrusive changes.
How to hunt for suspicious content (practical queries)
Run these safe, non-destructive searches against a backup or staging copy where possible.
Search for script tags in post content:
SELECT ID, post_title, post_author, post_date
FROM wp_posts
WHERE post_content LIKE '%
Search for posts or content containing jsonText:
SELECT p.ID, p.post_title, p.post_author, p.post_date, p.post_content
FROM wp_posts p
WHERE p.post_content LIKE '%jsonText%';
Search for jsonText in postmeta:
SELECT post_id, meta_key, meta_value
FROM wp_postmeta
WHERE meta_value LIKE '%jsonText%';
Find revisions created by contributors in the last 30 days (adjust roles detection as needed):
SELECT p.ID, p.post_title, p.post_author, p.post_date
FROM wp_posts p
JOIN wp_users u ON p.post_author = u.ID
WHERE p.post_type = 'revision'
AND p.post_date >= DATE_SUB(NOW(), INTERVAL 30 DAY)
AND u.roles LIKE '%contributor%';
WP-CLI approach (example):
# Search for