CVE-2026-87902 en resumen — qué está pasando ahora mismo
La vulnerabilidad reside en la función get_page_template(), que construye el nombre del archivo de plantilla a partir del parámetro pagename de la petición HTTP sin validarlo correctamente. Un atacante no autenticado puede inyectar secuencias de directory traversal doblemente codificadas para forzar a WordPress a incluir cualquier archivo PHP legible en el servidor, fuera de los directorios de tema permitidos.
La falla se clasifica como LFI condicional hacia RCE: la ejecución de código no está garantizada en cada instalación, pero las condiciones requeridas son muy comunes. Patchstack observó en las primeras horas de explotación cargas que usan pearcmd.php — presente por defecto en imágenes Docker oficiales y entornos cPanel con PHP < 8.5 — para escribir archivos PHP ejecutables en /tmp o /var/tmp. La puntuación CVSS 4.0 de 9.2 refleja la ausencia total de autenticación requerida y el impacto potencial sobre la confidencialidad, integridad y disponibilidad del servidor.
- Incluir un archivo PHP arbitrario legible fuera del directorio del tema activo mediante directory traversal en el parámetro
pagename - Usar
pearcmd.php(presente en cPanel/PHP < 8.5 e imágenes Docker oficiales) para escribir un archivo PHP controlado por el atacante en el disco - Depositar un webshell en
/tmpo/var/tmpcon un nombre genérico (wp-pear-rce-flag.php,poc87902.php) - Ejecutar comandos shell en el servidor sin ninguna cuenta de WordPress ni interacción del usuario
- Pivotar hacia otros sitios alojados en el mismo servidor si los permisos lo permiten
- Exfiltrar datos de base de datos, claves API o archivos
.envlegibles
Verificar si tus sitios están expuestos
El primer paso es conocer la versión de WordPress de cada instalación. Con WP-CLI, el comando es directo y se ejecuta en segundos, incluso en un parque de varias decenas de sitios.
Verificar la versión actual y las actualizaciones disponibles:
wp core version; wp core check-updateListar todas las instalaciones de WordPress en un servidor cPanel:
find /home -name 'wp-config.php' -not -path '*/wp-content/*' 2>/dev/nullVerificar la versión de cada instalación encontrada:
wp --path=/home/user/public_html core versionComprobar si el tema activo contiene un directorio que empiece por
page-(condición de explotación):ls $(wp --path=/home/user/public_html eval 'echo get_stylesheet_directory();') | grep '^page-'Verificar si
register_argc_argvestá habilitado (segunda condición de explotación):php -r 'echo ini_get("register_argc_argv") ? "EXPOSED" : "OK";'Buscar trazas de explotación en logs de acceso (patrón característico):
grep -E 'pagename=.*\.\..*page_id=' /var/log/nginx/access.log
Una instalación está expuesta a RCE si cumple las tres condiciones: versión entre 4.7.0 y 7.1.1, tema activo con directorio page-* en la raíz, y register_argc_argv habilitado. El LFI solo (sin RCE) es posible con las dos primeras condiciones aunque register_argc_argv esté desactivado. Los temas más citados por los investigadores son Twenty Twelve, Twenty Fourteen, Neve, Hestia y Sydney.
Hacer copia de seguridad antes de parchear
Antes de cualquier actualización del core de WordPress, una copia de seguridad es imprescindible. En un VPS, el método más fiable es el snapshot de VM — captura el estado completo del disco en segundos y permite un rollback inmediato. En paralelo, exportar la base de datos con WP-CLI garantiza una restauración precisa.
Crear un snapshot de la VM desde el panel VPS (operación instantánea, rollback en < 2 min) o desde la API si lo automatizas:
pvesh create /nodes/{node}/qemu/{vmid}/snapshot --snapname pre-wp712Exportar la base de datos de WordPress con WP-CLI (flag
--add-drop-tablepara una restauración limpia):wp db export backup-pre-712.sql --add-drop-tableVerificar la integridad del dump antes de proceder:
wp db checkCopiar el dump fuera del servidor (almacenamiento externo o local):
rsync -avz user@servidor:/home/user/public_html/backup-pre-712.sql ./
Aplicar WordPress 7.1.2 — los pasos
En un VPS con acceso root, la actualización de WordPress se realiza vía WP-CLI sin intervención del proveedor. El proceso completo — incluyendo copia de seguridad — tarda menos de tres minutos. WordPress 7.1.2 fue publicado el 22 de septiembre de 2026; los parches también han sido retroportados a todas las ramas mantenidas hasta la versión 4.7.
Activar el modo mantenimiento:
wp maintenance-mode activateActualizar el core de WordPress a 7.1.2:
wp core updateVerificar que la actualización se aplicó correctamente:
wp core version; # Debe retornar: 7.1.2Actualizar la base de datos si es necesario:
wp core update-dbLimpiar la caché:
wp cache flushDesactivar el modo mantenimiento:
wp maintenance-mode deactivateVerificar logs y probar una página clave:
curl -sI https://tu-sitio.com/ | grep HTTPPara actualizar varios sitios en bucle:
for dir in $(find /home -name 'wp-config.php' -not -path '*/wp-content/*' -exec dirname {} \;); do; wp --path="$dir" core update; done
Por qué el hosting compartido te expone más tiempo
En el hosting compartido, el proveedor controla el calendario de actualizaciones de WordPress. La ventana entre la publicación del parche y su aplicación efectiva depende del cronograma del proveedor, la carga de sus servidores y sus propias pruebas de regresión. En el caso de CVE-2026-87902, la explotación activa comenzó menos de cinco horas después de publicar el parche — un plazo muy inferior al ciclo de actualización de la mayoría de los hostings compartidos.
Desplace la tabla
| Criterio | Compartido (cPanel/Plesk) | VPS root ServOrbit |
|---|---|---|
| Tiempo de parche tras publicación | Hosting compartido: 12 a 72 horas según proveedor | VPS root: menos de 3 minutos con WP-CLI |
| Acceso a logs de acceso | Hosting compartido: limitado o inexistente | VPS root: acceso completo a /var/log en tiempo real |
| Control de `register_argc_argv` | Hosting compartido: lo impone el proveedor, frecuentemente habilitado | VPS root: desactivable via `php.ini` en 30 segundos |
| Aislamiento de sitios | Hosting compartido: mismo servidor que otros clientes | VPS root: entorno dedicado, sin vecinos |
| Copia de seguridad previa | Hosting compartido: snapshot no disponible o de pago | VPS root: snapshot instantáneo vía API |
El argumento «mi hosting actualiza automáticamente» ya no vale ante una explotación que empieza en J+0 en menos de cinco horas. Las primeras solicitudes maliciosas con CVE-2026-87902 se registraron el 22 de septiembre de 2026 a las 17:44 UTC — antes de que la mayoría de los hostings compartidos hubiera tenido tiempo de planificar y probar su despliegue.
Configuración recomendada post-parche: (1) Deshabilitar XML-RPC si no usas apps móviles de WordPress ni Jetpack: añade add_filter('xmlrpc_enabled', '__return_false'); en functions.php. (2) Forzar actualizaciones automáticas del core: define('WP_AUTO_UPDATE_CORE', 'minor'); en wp-config.php. (3) Deshabilitar register_argc_argv en php.ini para eliminar el vector RCE via pearcmd.php: register_argc_argv = Off. (4) Añadir una regla WAF para bloquear patrones de traversal en el parámetro pagename mientras el parche se propaga en instalaciones rezagadas.
Solución de problemas — errores comunes tras el parche
Las actualizaciones del core de WordPress suelen ser fluidas, pero ciertos entornos presentan problemas predecibles. Aquí los más frecuentes y su resolución.
- Error de conexión a la base de datos tras la actualización: ejecuta
wp core update-db— algunas migraciones de esquema no se aplican automáticamente con ciertos plugins de caché activos. Desactiva el caché antes de actualizar si experimentas este problema. - Pantalla blanca o error 500: revisa los logs de PHP y desactiva temporalmente todos los plugins:
wp plugin deactivate --all. - Permiso denegado en
wp-content/: ejecuta WP-CLI como el usuario propietario de los archivos:su - cpanelusername -c 'wp core update'. - 'Filesystem not available': añade
define('FS_METHOD', 'direct');enwp-config.php. Esta constante le indica a WordPress que escriba directamente en el sistema de archivos sin pasar por FTP ni SSH. - Tema hijo roto tras el parche: verifica la compatibilidad del tema padre con WordPress 7.1.2. Los temas que referenciaban directamente
pearcmd.phpen su código (caso muy raro) pueden generar reglas de acceso no deseadas después del parche. - Caché de objetos obsoleta (Redis/Memcached): tras
wp cache flush, reinicia el servicio:systemctl restart redis.
De WordPress hacia una arquitectura más robusta
CVE-2026-87902 ilustra una realidad estructural: el core de WordPress es una superficie de ataque amplia, y cada falla crítica replantea la cuestión del control del entorno de ejecución. Un VPS dedicado no elimina las vulnerabilidades, pero reduce la ventana de exposición a minutos, permite auditar el entorno completamente y responder con precisión a cada vector de ataque documentado.
Para agencias y desarrolladores que gestionan un parque de sitios WordPress, consolidar en un VPS con WP-CLI instalado y scripts de actualización automatizados transforma una emergencia de seguridad en un procedimiento rutinario. El coste operativo de un VPS queda compensado por la eliminación del retardo del proveedor — que, como demuestra esta CVE, puede resultar decisivo.