PHP2Shell (CVE-2026-109618 y CVE-2026-109619): qué es, a quién afecta y cómo mitigarla
Dos vulnerabilidades críticas en el núcleo de PHP permiten ejecutar código en el servidor sin autenticación. Versiones afectadas, versiones corregidas, mitigaciones temporales que publica PHP y un procedimiento para verificar cada servidor.

El 21 de octubre de 2026 el proyecto PHP publicó versiones de seguridad que corrigen dos vulnerabilidades críticas del núcleo del lenguaje, identificadas como CVE-2026-109618 y CVE-2026-109619 y conocidas en conjunto como PHP2Shell. Ambas permiten que un atacante sin credenciales ejecute código en un servidor web que use PHP. Este artículo describe el mecanismo de cada falla, delimita qué instalaciones están expuestas y ordena las acciones de corrección según la forma en que PHP llega a cada servidor. Al terminar, el lector podrá decidir si un servidor está protegido y comprobarlo con evidencia.
La recomendación del proyecto PHP es directa: «No hay mitigaciones completas; actualizar es la única opción segura». Las medidas temporales descritas más adelante reducen la exposición, pero no la eliminan.
Explicación para quien no administra servidores
PHP es el lenguaje con el que funcionan muchos sitios web, tiendas en línea y sistemas internos; WordPress, Joomla, Drupal, Moodle, Magento y Laravel, entre otros, dependen de él. Cuando un visitante abre una página, el servidor ejecuta PHP para construir la respuesta.
PHP2Shell es un defecto en esa pieza de base, no en un complemento ni en el sitio en sí. Una petición fabricada con intención puede llevar a PHP a un estado interno inconsistente y, desde ahí, hacer que el servidor ejecute instrucciones del atacante. En la práctica, eso equivale a entregarle el control del servidor: leer bases de datos, robar contraseñas, alterar el sitio o instalar programas maliciosos.
Si su empresa tiene un sitio o sistema en PHP, la pregunta que conviene hacer hoy a su proveedor de hosting o a su equipo técnico es concreta: «¿qué versión de PHP atiende nuestro sitio y cuándo se reinició después de actualizarla?». Mantener actualizados los complementos no protege contra esta falla; lo que la corrige es actualizar PHP.
Mecanismo de las dos vulnerabilidades
Ambas fallas ocurren en la gestión de memoria que PHP realiza para cada petición web. Un worker es el proceso de PHP que atiende peticiones una tras otra; entre petición y petición, PHP debería liberar y reiniciar todo el estado que pertenecía a la anterior.
CVE-2026-109618, corrupción por falta de memoria. Según el aviso de PHP (GHSA-w8hw-w9fx-j79w), el manejo de memoria agotada puede interrumpir a PHP mientras los datos internos de la petición están inicializados solo en parte. La rutina de limpieza posterior trata entonces esos datos inválidos como válidos. Un atacante que provoque deliberadamente el agotamiento de memoria con una petición grande o compleja puede aprovechar esa inconsistencia.
CVE-2026-109619, estado global obsoleto. Según el aviso GHSA-6wmf-4rv5-p3rp, cierto estado interno asociado a una petición puede sobrevivir después de que se libera la memoria que lo respalda. Una petición posterior atendida por el mismo worker puede usar ese estado antes de que la inicialización normal lo restablezca. Es un caso de uso después de liberar (use-after-free): el programa sigue usando una referencia a memoria que ya no le pertenece. PHP señala como impactos confirmados la ejecución de código y la divulgación de memoria.
El proyecto PHP calificó ambas con 9.2 en CVSS v4.0, la escala estándar de severidad, cuyo máximo es 10. La PHP Foundation aclaró que los identificadores que circularon antes de la publicación llevaban por error una puntuación de 10.0.
Versiones afectadas y versiones corregidas
Las investigaciones publicadas sitúan el código vulnerable desde PHP 5.4 y hasta 8.5.11. La corrección oficial existe solo para las ramas con soporte:
| Rama | Versión corregida | Situación |
|---|---|---|
| 8.5 | 8.5.12 | Soporte activo |
| 8.4 | 8.4.27 | Soporte activo |
| 8.3 | 8.3.36 | Solo seguridad |
| 8.2 | 8.2.35 | Solo seguridad; fin de vida el 31 de diciembre de 2026 |
| 7.4, 8.0 y 8.1 | Sin versión oficial | Fin de vida; el equipo de seguridad publicó parches mínimos de código fuente |
| 5.4 a 7.3 | Sin corrección | Fin de vida; la única salida es migrar a una rama con soporte |
Las distribuciones de Linux y los proveedores de soporte extendido recibieron los parches por adelantado. En paquetes de distribución, el número de versión puede no coincidir con la tabla porque el parche se aplica sobre la versión que la distribución mantiene; en ese caso la referencia es el aviso de seguridad del proveedor para ambos CVE. La versión de prueba PHP 8.6.0 RC4 también incluye la corrección, pero no está destinada a producción.
Instalaciones expuestas
PHP indica que está en riesgo toda instalación que atienda peticiones web, con cualquiera de sus modos de ejecución (SAPI): PHP-FPM, Apache con mod_php, php-cgi, FrankenPHP y LiteSpeed. El riesgo es mayor en mod_php, donde la explotación demostrada se dispara con una petición sin autenticar antes de que se ejecute cualquier código de la aplicación. Por eso no importa qué tan bien escrito esté el sitio: el punto de entrada está por debajo de él.

Los scripts que solo se ejecutan por línea de comandos y no reciben tráfico web quedan fuera de este vector, aunque conviene actualizarlos en el mismo ciclo para no mantener dos versiones.
Estado de explotación
Los identificadores se filtraron el 20 de octubre y el proyecto adelantó un día la publicación prevista para el 22. Cloudflare informó que observa los primeros intentos de ataque y desplegó reglas en su firewall de aplicaciones (WAF) para todos sus planes, incluido el gratuito, aclarando que se trata de una medida provisional que solo protege el tráfico que pasa por su red. Circula código de explotación público cuya eficacia no ha sido verificada por terceros independientes. Con tres vulnerabilidades previas de PHP en el catálogo de vulnerabilidades explotadas de CISA, el criterio prudente es tratar cualquier servidor sin corregir como objetivo activo.
Corrección según cómo llega PHP al servidor
La acción es la misma en todos los casos, actualizar y reiniciar, pero el procedimiento depende del canal de instalación:
- Paquetes de la distribución (Debian, Ubuntu, Red Hat, Oracle Linux, Alpine y similares): instalar las actualizaciones de seguridad publicadas para ambos CVE y confirmar en el aviso del proveedor que el paquete instalado las incluye. Repositorios de terceros como los de Ondřej Surý o Remi se actualizan por separado.
- Contenedores: volver a construir la imagen sobre una base corregida (por ejemplo, descargar de nuevo
php:8.4-fpmantes de construir) y redesplegar. Una imagen ya construida no se corrige sola, aunque la etiqueta de origen se haya actualizado. - Hosting compartido o con panel (cPanel, Plesk, CloudLinux): la actualización depende del proveedor. Conviene pedir por escrito la versión aplicada y la fecha; en paneles con selector de versión, cambiar el sitio a una rama con soporte.
- Plataformas administradas: algunas aplican el parche automáticamente y otras exigen redesplegar. Google Cloud, por ejemplo, actualiza App Engine Standard con PHP 8.2 o superior, pero App Engine Flexible y Cloud Run sin actualización automática de imagen base requieren un nuevo despliegue.
- Compilación propia: compilar desde las fuentes de php.net. Para 7.4, 8.0 y 8.1, el proyecto publicó ramas con parches mínimos (ejemplo para 8.1); son una medida de transición, no un reemplazo de la migración.
Después de actualizar hay que reiniciar todos los workers: PHP-FPM, Apache o el servidor de aplicaciones. Un proceso que ya estaba en memoria sigue ejecutando el binario anterior aunque el paquete nuevo esté instalado.
Mitigaciones temporales mientras se actualiza
El aviso de PHP enumera medidas para el intervalo previo a la actualización y advierte que no hacen segura una instalación. Se aplican en php.ini, en la configuración del pool de FPM o del servidor web, nunca con ini_set() ni con .user.ini, y exigen reiniciar los workers.

Para CVE-2026-109618:
memory_limit=-1, preferiblemente conphp_admin_valuepara que ninguna aplicación lo sobrescriba. Al quitar el límite interno, el límite de memoria debe pasar al contenedor o al cgroup, de modo que solo termine el worker afectado. PHP desaconseja usarRLIMIT_ASoRLIMIT_DATApara esto.post_max_size = 8Men aplicaciones sin carga de archivos, o32Msi la necesitan, conupload_max_filesizepor debajo de ese valor.- Límites en el servidor web o el proxy para tamaño de la petición decodificada, número de campos, partes multipart, encabezados y profundidad de anidamiento, aplicables también a peticiones sin
Content-Lengthutilizable.
Para CVE-2026-109619:
session.upload_progress.enabled=0.- Solo en PHP 8.5:
fatal_error_backtraces=0. - Eliminar ajustes por petición inválidos u obsoletos que emitan avisos antes de la inicialización. Ocultar los avisos con
error_reporting,display_errorso@no sirve. - Corregir errores fatales y tiempos de ejecución agotados que un atacante pueda provocar, incluidos los que ocurren en callbacks, procesamiento de cargas o importaciones.
Como capa adicional, un WAF con reglas para esta campaña (Cloudflare, Google Cloud Armor u otro) y el bloqueo de cuerpos de petición grandes antes de que lleguen a PHP reducen la superficie. CERT-EU recomienda además aislar de la red pública las aplicaciones expuestas hasta aplicar y verificar la corrección, cuando el negocio lo permita.
Proceso de respuesta completo
El diagrama siguiente reúne en notación BPMN 2.0 las decisiones de las secciones anteriores. Las tareas resaltadas son las que corrigen o contienen el riesgo; la mitigación temporal es un desvío que siempre desemboca en la actualización.

Procedimiento de verificación
La comprobación debe hacerse sobre el PHP que atiende la web, no solo sobre el de la terminal: en un mismo servidor pueden convivir varias versiones y php -v muestra únicamente la de línea de comandos.
- Inventariar cada servidor, contenedor y sitio de hosting que ejecute PHP, incluidos entornos de prueba y sistemas olvidados con acceso desde internet.
- Obtener la versión servida por la web:
php-fpm -v(ophp-fpm8.4 -v, según la distribución), o una página temporal conphpinfo()protegida y borrada al terminar. - Compararla con la tabla de versiones corregidas o, en paquetes de distribución, con el aviso del proveedor.
- Confirmar que los workers se reiniciaron después de la actualización, por ejemplo con
systemctl status php8.4-fpmy la hora de inicio del servicio. - Si se aplicaron mitigaciones temporales, confirmar su valor efectivo en
phpinfo()en la columna Local Value, que refleja lo que la aplicación ve realmente. - Para servidores que estuvieron expuestos sin corregir, revisar registros de acceso con peticiones anómalas de gran tamaño, reinicios inesperados de workers, archivos PHP nuevos o modificados en directorios públicos, tareas programadas y usuarios administrativos que nadie reconoce. Ante indicios de intrusión, actualizar no basta: corresponde un análisis de incidente y el cambio de credenciales.
Preguntas frecuentes
¿Mi sitio en WordPress está afectado?
Sí, si el servidor ejecuta una versión de PHP anterior a las corregidas. La falla está en PHP, no en WordPress ni en sus complementos, por lo que actualizar WordPress no la resuelve.
¿Basta con cambiar la configuración de php.ini?
No. PHP describe esas medidas como parciales. Sirven para ganar tiempo mientras se actualiza, no para sustituir la actualización.
Uso PHP 7.4 u 8.1. ¿Qué opciones tengo?
A corto plazo, un parche de la distribución o de un proveedor de soporte extendido, o compilar con las ramas de parches mínimos que publicó el proyecto. A mediano plazo, migrar a PHP 8.3 u 8.4, lo que suele exigir revisar compatibilidad de la aplicación y sus dependencias.
Estoy detrás de Cloudflare. ¿Ya estoy protegido?
Parcialmente. Las reglas del WAF filtran los vectores conocidos y solo para el tráfico que pasa por Cloudflare. Si el servidor responde también en su dirección directa, o aparece una variante del ataque, la protección no aplica.
Fuentes
- PHP, aviso de seguridad del 21 de octubre de 2026.
- GitHub Security Advisories de php-src: GHSA-w8hw-w9fx-j79w y GHSA-6wmf-4rv5-p3rp.
- Tenable, preguntas frecuentes sobre PHP2Shell.
- Google Cloud, respuesta a CVE-2026-109618 y CVE-2026-109619.
- Qualys, análisis de la publicación de seguridad.
Apoyo para aplicar la corrección
Xterra Engine realiza el inventario de servidores PHP, la actualización con reinicio controlado, la verificación posterior y, cuando hay una versión fuera de soporte, el plan de migración de la aplicación. Para solicitar apoyo o una cotización, escriba a info@xterraengine.com o complete el formulario de contacto indicando cuántos servidores o sitios utilizan PHP y dónde están alojados.