La brecha de ejecución en la actualización de WordPress: Cómo CVE-2026-119977 compromete servidores durante el parche
El proceso de actualización del núcleo en WordPress desempaqueta archivos usando código heredado. Analizamos el vector de ataque durante la instalación del parche y el bloqueo de wp-content/upgrade.
Fecha de publicación: 2026.11.09
Clasificación asignada por Wordfence ante explotación activa
Tiempo de vida del instalador temporal durante el desempaquetado
Registrado por cortafuegos perimetrales tras publicarse el parche
El parche oficial publicado para neutralizar la vulnerabilidad crítica en el núcleo de WordPress presenta una paradoja operativa grave: el propio mecanismo de despliegue ejecuta la descompresión mediante el código previo sin parchear. Este desfase de ejecución deja expuesto el directorio temporal de instalación ante solicitudes web externas durante los segundos exactos en que los archivos se descomprimen en disco.
La Agencia de Ciberseguridad y Seguridad de Infraestructura de Estados Unidos (CISA) incorporó la vulnerabilidad CVE-2026-119977 a su catálogo de vulnerabilidades explotadas conocidas (KEV). La superficie de ataque afecta a despliegues desde la versión 4.7 hasta la 7.1.3, abarcando casi dos décadas de deuda técnica heredada desde la arquitectura de actualización introducida en 2008.
La condición de carrera en el descompresor heredado
El proceso de actualización central de WordPress descarga un archivo comprimido y lo extrae dentro de la ruta wp-content/upgrade. Cuando la actualización requiere un paquete completo, dicho archivo contiene el instalador funcional del CMS (wp-admin/install.php). El problema radica en que el servidor web suele tener permisos para servir peticiones HTTP directas contra ese subdirectorio.
En todas las instalaciones que operan con versiones 5.9 o superiores, el código heredado asigna al directorio temporal un nombre derivado directamente del archivo descargado. Al carecer de entropía en la nomenclatura, un atacante externo puede predecir con exactitud la ruta antes de que finalice el proceso de copia.
Secuencia temporal del fallo de descompresión en wp-content/upgrade
El actualizador baja el zip completo y crea la carpeta predecible con código viejo
Los archivos temporales quedan accesibles vía web durante 2 a 5 segundos
El atacante vincula una base de datos externa y ejecuta código con permisos del servidor web
El parche incorporado en la versión 7.1.4 y en las ramas de soporte extendido soluciona el problema asignando cadenas aleatorias al directorio de trabajo e impidiendo que un archivo wp-config.php temporal sobrescriba el archivo de producción. Sin embargo, en el instante exacto en que se aplica esta corrección, la rutina que descomprime los ficheros sigue siendo la versión vulnerable instalada previamente en el servidor.
Si un atacante envía ráfagas continuas de peticiones HTTP dirigidas a la ruta calculada durante esa ventana de descompresión, puede completar el asistente de configuración conectando una base de datos bajo su control. Una vez autenticado en la instancia temporal, el atacante obtiene ejecución de comandos PHP con los privilegios del proceso del servidor web (www-data o equivalente), permitiéndole alterar archivos en la raíz del sitio en producción antes de que WordPress elimine la carpeta transitoria.
Aislamiento de la carpeta de actualización frente al acceso web no autenticado
El servidor web entrega archivos PHP desde carpetas de trabajo temporales sin filtrar tráfico externo.
El actualizador desempaqueta el código nuevo usando las funciones no parcheadas de la versión previa.
Denegar respuestas HTTP 200 en la ruta de actualización mediante reglas en Nginx, Apache o CDN.
Comparativa de exposición por tipo de paquete y método de actualización
No todas las actualizaciones representan el mismo nivel de exposición. La criticidad depende de si el repositorio entrega un paquete parcial (diferencial) o un paquete completo, y de cómo interactúa el servidor web con el sistema de archivos local.
| Vector de despliegue | Tipo de paquete entregado | Presencia del instalador | Nivel de predictibilidad | Riesgo durante la actualización |
|---|---|---|---|---|
| Salto entre ramas (ej. 7.0.7 a 7.1.4) | Paquete completo | Sí (wp-admin/install.php) | Alta (nombre basado en archivo) | Crítico (ventana abierta para RCE) |
| Actualización en la misma rama (7.1.3 a 7.1.4) | Paquete parcial | Variable (solo si hubo cambios en instalador) | Alta (versiones 5.9+) | Bajo a nulo (salvo desajuste de sumas de verificación) |
| Instalaciones antiguas (4.4 a 5.8) | Paquete completo | Sí | Media (cadena pseudoaleatoria) | Medio (requiere fuga previa de rutas) |
Gestión vía WP-CLI (wp core update) | Paquete completo o diferencial | Sí | Idéntica a interfaz web | Crítico (reutiliza la misma lógica del actualizador) |
| Despliegue manual desacoplado fuera de webroot | Extracción externa | No aplica al servidor web | Ninguna (fuera de alcance HTTP) | Neutro (riesgo mitigado al 100%) |
Un sitio configurado para recibir actualizaciones parciales puede degradar de forma imprevista hacia un paquete completo si los archivos del núcleo no coinciden de manera exacta con las sumas de verificación oficiales de WordPress.org, o si la tarea se interpreta como una reinstalación. En ese momento, el instalador se desempaqueta en el disco local y queda expuesto si el servidor web no cuenta con reglas de restricción específicas.
Las herramientas de automatización como WP-CLI no eliminan este vector de ataque. El comando wp core update invoca las mismas clases subyacentes del núcleo y procesa el paquete a través del mismo subdirectorio temporal dentro de wp-content.
Métricas de telemetría y comportamiento del tráfico malicioso
Las firmas de ataque comenzaron a registrarse en cortafuegos perimetrales solo nueve minutos después de desplegarse las primeras reglas de protección tras la liberación del parche. La persistencia de las solicitudes indica un escaneo automatizado diseñado para aprovechar la ventana de segundos que tarda un administrador o un cron en actualizar el sistema.
Comparativa entre la persistencia del ataque y el tiempo útil de explotación en disco
El análisis de tráfico muestra nodos atacantes sondeando grupos definidos de dominios de forma ininterrumpida durante periodos de hasta 14,5 horas. El objetivo de este patrón de tráfico es sincronizar una petición POST maliciosa con el instante exacto en que la descompresión del paquete sitúa el archivo install.php en disco.
A pesar de que el aviso de seguridad de WordPress catalogó el problema con un impacto bajo basándose en la brevedad de la ventana de ejecución, los equipos de respuesta a incidentes y Wordfence determinaron una severidad CVSS de 8.1. La automatización del escaneo masivo convierte una ventana teórica de milisegundos en una oportunidad viable de compromiso de infraestructura.
Protocolo de blindaje y desacoplamiento para despliegues empresariales
La mitigación no debe depender exclusivamente de la ejecución del parche automatizado. Para neutralizar el riesgo durante la transición hacia la versión 7.1.4 o ramas equivalentes protegidas, los equipos de infraestructura deben aislar el entorno antes de activar cualquier comando de actualización.
Retorna HTTP 403 Forbidden a cualquier cliente web externo mientras WordPress opera en disco local.
Descarga y descompresión en /tmp, sobreescritura de binarios y migración de base de datos sin tocar wp-config.php.
1. Bloqueo de acceso HTTP al directorio de actualización
WordPress gestiona los archivos de wp-content/upgrade directamente desde el sistema de archivos del sistema operativo mediante llamadas POSIX. El servidor web jamás requiere exponer ni despachar contenido estático o dinámico desde esa carpeta hacia la red pública.
En servidores Nginx, se debe insertar una directiva explícita de denegación dentro del bloque principal de configuración del sitio:
location ^~ /wp-content/upgrade/ {
deny all;
return 403;
}
Para servidores Apache, la restricción debe configurarse mediante directivas a nivel de host virtual o dentro del archivo .htaccess raíz:
<DirectoryMatch "^.*/wp-content/upgrade/.*">
Require all denied
</DirectoryMatch>
Esta única regla neutraliza por completo la posibilidad de que un agente externo solicite la ejecución de install.php, sin interferir con las tareas de actualización en segundo plano ni requerir el reinicio de los procesos PHP-FPM.
2. Procedimiento de actualización manual fuera de la raíz web
En infraestructuras donde no sea viable modificar la configuración del servidor web antes del mantenimiento, la actualización debe realizarse de forma desacoplada fuera del árbol de directorios que atiende peticiones públicas:
- Generar una copia de respaldo completa de la base de datos MySQL/MariaDB y del directorio raíz.
- Descargar el paquete oficial de WordPress 7.1.4 en un directorio transitorio aislado (por ejemplo,
/opt/staging/o/tmp/). - Descomprimir el paquete en dicha ubicación externa, eliminando previamente la carpeta
wp-contentdel paquete descargado para no sobreescribir temas ni extensiones. - Sincronizar los archivos del núcleo hacia el directorio de producción mediante herramientas de transferencia de archivos locales (
rsync), excluyendo expresamentewp-config.php. - Ejecutar la migración del esquema de base de datos a través de la línea de comandos o accediendo a
wp-admin/upgrade.php.
Las instalaciones que operen en versiones 4.6 o anteriores carecen de parches oficiales por encontrarse fuera del ciclo de mantenimiento. En estos casos, la actualización manual y la reestructuración completa de los permisos del servidor web resultan imperativas para evitar compromisos persistentes en la infraestructura.