Tutorial

PHP2Shell: cómo corregir CVE-2026-109618 y CVE-2026-109619

Seguridad y monitorización9 min de lectura13 pasos

El 21 de octubre de 2026, el equipo de seguridad de PHP publicó de urgencia PHP 8.5.12, 8.4.27, 8.3.36 y 8.2.35. Estas versiones corrigen dos fallos apodados «PHP2Shell»: CVE-2026-109618 y CVE-2026-109619, con una puntuación de 9.2 sobre 10 en CVSS 4.0. Afectan al propio intérprete, no a una aplicación: basta una sola solicitud HTTP anónima, incluso antes de que se ejecute su código. Se observan intentos de explotación desde el mismo día de la publicación. A continuación se explica qué hacen estos dos fallos, cómo saber si sus servidores están expuestos y cómo corregirlos en Debian, Ubuntu, RHEL, cPanel y Docker.

Contenido· PHP2Shell en resumen1/14
  1. 01PHP2Shell en resumen
  2. 02Lo que hay que recordar
  3. 03Por qué estos dos fallos son tan peligrosos
  4. 04Qué versión instalar según su rama
  5. 05Comprobar si sus servidores están expuestos
  6. 06Inventariar las versiones de PHP servidas
  7. 07Aplicar el parche
  8. 08Actualizar PHP según su entorno
  9. 09Si no puede actualizar de inmediato
  10. 10Añada una barrera delante de PHP
  11. 11Buscar rastros de explotación
  12. 12Controles que realizar después del parche
  13. 13En un alojamiento compartido
  14. 14La documentación oficial

PHP2Shell en resumen

PHP2Shell no es un fallo de WordPress, de Laravel ni de un plugin: lo que está en cuestión es el propio motor de PHP. Por lo tanto, toda aplicación PHP que responda a solicitudes web está afectada, sea cual sea su código. El aviso de seguridad menciona PHP-FPM, Apache con mod_php, php-cgi, FrankenPHP y LiteSpeed.

Ambos fallos comparten el mismo mecanismo. Cuando PHP interrumpe bruscamente una solicitud (memoria agotada, error fatal), puede dejar tras de sí un estado interno a medio inicializar o ya liberado. Una solicitud posterior, atendida por el mismo proceso PHP, reutiliza entonces ese estado: eso es lo que abre la puerta a una ejecución remota de código.

Lo que hay que recordar

  • CVE-2026-109618 — corrupción de memoria al superar memory_limit: los datos de la solicitud, inicializados solo en parte, se tratan después como válidos durante la limpieza.
  • CVE-2026-109619 — estado global obsoleto: un estado propio de una solicitud sobrevive a la liberación de su memoria y puede ser leído por la siguiente solicitud en el mismo proceso.
  • Puntuación: 9.2 sobre 10 en CVSS 4.0 para cada una, sin autenticación ni interacción del usuario.
  • Versiones corregidas: PHP 8.5.12, 8.4.27, 8.3.36 y 8.2.35. El proyecto ya no publica versiones para 8.1 ni para las ramas anteriores.
  • Explotación: watchTowr informa de intentos de explotación en sus trampas de red desde el 21 de octubre de 2026.
  • Alcance: los investigadores estiman que las ramas afectadas se remontan hasta PHP 5.4, aunque no se ha probado cada versión de forma individual.

Por qué estos dos fallos son tan peligrosos

La mayoría de los fallos web exigen un formulario concreto, una cuenta o un plugin vulnerable. PHP2Shell no necesita nada de eso: el desencadenante más habitual es el procesamiento de un envío multipart/form-data con el seguimiento del progreso de sesiones (session.upload_progress), un mecanismo que PHP activa por defecto y que se ejecuta antes del primer byte de su aplicación. Un cortafuegos de aplicación ubicado en su código, un plugin de seguridad de WordPress o un middleware de Laravel llegan, por tanto, demasiado tarde.

El segundo factor es el propio modelo de ejecución. PHP-FPM y Apache reutilizan el mismo proceso para cientos de solicitudes sucesivas: eso es precisamente lo que permite que una solicitud maliciosa contamine la siguiente. Según Imperva, las técnicas publicadas van desde la caída de procesos hasta la lectura de archivos arbitrarios a través de la caché OPcache, pasando por la fuga de unos 67 KB de memoria del proceso en una cookie PHPSESSID sobredimensionada. Esa memoria puede contener contraseñas de bases de datos o claves de API.

Qué versión instalar según su rama

Desplace la tabla

Rama de PHPVersión corregidaQué hacer
8.58.5.12Actualizar y luego reiniciar PHP
8.48.4.27Actualizar y luego reiniciar PHP
8.38.3.36Actualizar y luego reiniciar PHP
8.28.2.35Actualizar y luego planificar la migración a 8.3 u 8.4
8.1, 8.0, 7.4Ninguna versión oficialPaquete corregido de su distribución, retroportación del código fuente o, si no, migración
7.3 y anteriores, 5.xNingún parche publicadoMigrar a una rama mantenida

Comprobar si sus servidores están expuestos

Cuidado con una trampa clásica: la versión que muestra php -v en la línea de comandos no es necesariamente la que sirve sus sitios. Un servidor puede tener varias versiones de PHP-FPM instaladas en paralelo, y cada sitio puede apuntar a una versión distinta. Por lo tanto, hay que comprobar la versión que realmente sirve la web, sitio por sitio.

Inventariar las versiones de PHP servidas

  1. Listar las versiones instaladas

    En Debian o Ubuntu:

    dpkg-query -W -f='${db:Status-Abbrev} ${Package} ${Version}\n' 'php*' | awk '$1=="ii"' | grep -E 'php[0-9.]+-(fpm|cli|common)|libapache2-mod-php'

    En RHEL, AlmaLinux o Rocky Linux:

    rpm -qa 'php*' 'ea-php*' 'alt-php*' | sort
  2. Localizar los procesos PHP en ejecución

    systemctl list-units --type=service --state=running | grep -E 'php|apache2|httpd|lsws'

    Cada servicio phpX.Y-fpm activo es una versión que hay que comprobar y corregir.

  3. Leer la versión que sirve un sitio

    Coloque un archivo temporal en la raíz del sitio, consúltelo y después elimínelo de inmediato:

    echo '<?php echo PHP_VERSION, " ", PHP_SAPI;' > /var/www/monsite/v-check.php
    curl -s https://monsite.example/v-check.php
    rm /var/www/monsite/v-check.php

    Un resultado 8.3.36 fpm-fcgi indica una versión corregida servida por PHP-FPM.

  4. Revisar los contenedores Docker

    docker ps --format '{{.Names}}' | while read c; do echo "$c: $(docker exec "$c" php -r 'echo PHP_VERSION;' 2>/dev/null)"; done

    Un contenedor sin PHP no muestra nada después de su nombre.

Aplicar el parche

Las distribuciones Linux y los proveedores de soporte extendido recibieron los parches antes de la publicación. Por eso, el paquete corregido de su distribución no lleva necesariamente el número 8.3.36: Ubuntu 24.04, por ejemplo, corrige su versión 8.3.6 en el paquete 8.3.6-0ubuntu0.24.04.13. Confíe en el aviso de seguridad de su distribución más que en el número de versión de PHP por sí solo. En cualquier caso, el reinicio es imprescindible: mientras los procesos antiguos sigan en ejecución, es el código antiguo el que responde.

Actualizar PHP según su entorno

  1. Debian y Ubuntu

    sudo apt update
    sudo apt install --only-upgrade $(dpkg-query -W -f='${db:Status-Abbrev} ${Package}\n' 'php*' | awk '$1=="ii"{print $2}')
    sudo systemctl restart 'php*-fpm'
    sudo systemctl restart apache2   # si usa mod_php

    Si sus versiones proceden de un repositorio de terceros (por ejemplo, el PPA ondrej/php), compruebe que la versión instalada tras la actualización sea realmente una versión corregida.

  2. RHEL, AlmaLinux, Rocky Linux

    sudo dnf upgrade 'php*'
    sudo systemctl restart php-fpm
    sudo systemctl restart httpd

    AlmaLinux publicó sus paquetes corregidos el 21 de octubre de 2026. El repositorio comunitario Remi, en cambio, no tenía ninguna actualización disponible en el momento del anuncio: si depende de él, compruebe después la versión instalada.

  3. Servidor cPanel (EasyApache 4 o CloudLinux)

    sudo dnf upgrade 'ea-php*' 'alt-php*'
    /scripts/restartsrv_apache_php_fpm
    /scripts/restartsrv_httpd

    En un servidor más antiguo, sustituya dnf por yum. Después, revise cada versión en WHM › MultiPHP Manager: una cuenta que siga configurada en una rama sin parche (7.x, 8.0, 8.1) debe pasarse a una versión mantenida.

  4. Contenedores Docker

    docker compose pull
    docker compose up -d --force-recreate
    docker compose exec app php -r 'echo PHP_VERSION;'

    Si su Dockerfile parte de una imagen php:8.3-fpm, reconstruya la imagen con docker compose build --pull: sin --pull, Docker reutiliza la antigua imagen base almacenada en caché.

  5. Comprobar el resultado

    Vuelva a ejecutar la comprobación del paso anterior en cada sitio. El parche solo está aplicado si la versión servida por la web está corregida, no únicamente la versión instalada en el disco.

Si no puede actualizar de inmediato

El aviso oficial de PHP propone ajustes que reducen la exposición sin hacer que la instalación sea segura. Sirven para ganar unas horas, no para sustituir el parche. Deben establecerse en php.ini, en el pool de PHP-FPM o en la configuración del servidor web, nunca mediante ini_set() ni con un archivo .user.ini: estos últimos se leen demasiado tarde, después del análisis de la solicitud.

Contra CVE-2026-109619, desactive el seguimiento del progreso de los envíos. En PHP 8.5, desactive también las trazas de errores fatales:

; en el pool FPM, por ejemplo /etc/php/8.3/fpm/pool.d/www.conf
php_admin_flag[session.upload_progress.enabled] = off
; solo PHP 8.5:
php_admin_flag[fatal_error_backtraces] = off

Contra CVE-2026-109618, el aviso recomienda memory_limit = -1 impuesto mediante php_admin_value, para que ninguna aplicación pueda redefinirlo, y un tamaño de solicitud acotado (post_max_size = 8M, o 32M si necesita envíos de archivos). A cambio, la memoria debe limitarse en otro lugar, mediante un límite de contenedor o de cgroup. No utilice RLIMIT_AS ni RLIMIT_DATA: son precisamente los que provocan el fallo de asignación vulnerable.

Después, reinicie todos los procesos PHP para que los ajustes se apliquen.

Añada una barrera delante de PHP

Limite el tamaño de las solicitudes en el servidor web, antes de que lleguen a PHP: client_max_body_size 8m; en nginx, LimitRequestBody 8388608 en Apache. Si su sitio pasa por Cloudflare en modo proxy, se han desplegado reglas WAF dirigidas a los vectores conocidos de PHP2Shell para todas las cuentas, incluido el plan gratuito. Son redes de seguridad: solo la actualización de PHP cierra el fallo.

Buscar rastros de explotación

Los intentos publicados dejan rastros característicos: procesos PHP que se caen, desbordamientos de memoria en ráfaga y envíos multipart anormalmente voluminosos. Si su servidor estuvo expuesto antes de la actualización, dedique diez minutos a comprobarlo.

Controles que realizar después del parche

  1. Buscar los procesos PHP-FPM terminados

    sudo grep -E 'exited on signal (11|6)' /var/log/php*-fpm.log | tail -20

    Una serie de procesos terminados por la señal 11 (SIGSEGV) desde el 21 de octubre es una señal de alerta.

  2. Buscar los desbordamientos de memoria

    sudo grep -rh 'Allowed memory size' /var/log/php* /var/log/nginx /var/log/apache2 2>/dev/null | tail -20
  3. Localizar los archivos PHP creados recientemente

    sudo find /var/www /home -name '*.php' -newermt '2026-10-20' -not -path '*/vendor/*' -not -path '*/cache/*' -ls

    Un archivo desconocido con un nombre genérico, en una carpeta de subidas o en /tmp, debe examinarse antes de eliminarlo.

  4. En caso de duda, tratar el servidor como comprometido

    Aísle la máquina, conserve una copia de los registros y, a continuación, renueve las contraseñas de la base de datos, las claves de API y los secretos presentes en los archivos .env: una fuga de memoria puede haberlos expuesto sin dejar ningún otro rastro.

En un alojamiento compartido

En un alojamiento compartido, no es usted quien actualiza PHP: es el proveedor de alojamiento quien mantiene las versiones disponibles. Su parte del trabajo consiste en comprobar que su sitio utiliza una rama que todavía recibe parches. En cPanel, la herramienta de selección de versión (MultiPHP Manager, o Select PHP Version en un servidor CloudLinux) indica la versión activa de cada dominio. Si su sitio todavía funciona con 7.4, 8.0 u 8.1, esas ramas ya no reciben versiones oficiales de PHP: cambie a 8.3 u 8.4 después de probar su sitio, siguiendo nuestra lista de comprobación para migrar PHP.

La documentación oficial

Los detalles técnicos y los ajustes de mitigación se publican en el aviso de seguridad de PHP y en los avisos de GitHub GHSA-w8hw-w9fx-j79w (CVE-2026-109618) y GHSA-6wmf-4rv5-p3rp (CVE-2026-109619). Para los paquetes de distribución, consulte el anuncio de Ubuntu y el de AlmaLinux.

Mantenga el control de sus versiones de PHP

En un VPS ServOrbit.com, usted dispone de acceso root: aplica un parche de PHP en cuanto se publica, elige la versión de cada sitio y reinicia sus servicios cuando lo decide.

¿Necesita ayuda?

Consulte nuestro centro de ayuda y nuestra FAQ, o contacte con nuestro equipo: llamada, WhatsApp o correo electrónico. Soporte en francés, inglés y árabe.

Escribir por WhatsAppse abre en una pestaña nueva