El 20 de octubre de 2026 el proyecto PHP corrigió dos vulnerabilidades críticas (CVSS 9.2): CVE-2026-109618 y CVE-2026-109619. Las dos permiten ejecutar código en tu servidor con una sola petición, sin autenticarse y antes de que corra el código de tu aplicación. Ya hay pruebas de concepto públicas y CERT-EU considera probable la explotación activa (boletín 2026-018).

Esta guía te lleva de principio a fin: encontrar todo lo que corre PHP, confirmar la versión real, actualizar, aplicar mitigaciones si no puedes actualizar hoy y verificar que quedó bien.

Lo esencial: la única corrección es actualizar a PHP 8.5.12, 8.4.27, 8.3.36 u 8.2.35 (o al paquete parchado de tu distribución). Si no puedes hacerlo hoy, saca de Internet los servicios expuestos o aplica las mitigaciones del paso 5, que reducen el riesgo pero no lo eliminan.

Tabla de contenidos

  1. Qué está pasando
  2. Paso 1: inventario de todo lo que corre PHP
  3. Paso 2: confirma la versión real
  4. Paso 3: actualiza
  5. Paso 4: reinicia y verifica
  6. Paso 5: mitigaciones si no puedes actualizar hoy
  7. Paso 6: revisa señales de compromiso
  8. Lista de verificación final
  9. Preguntas frecuentes

Qué está pasando

CVECVSSQué es
CVE-2026-1096189.2Cuando una petición supera memory_limit, PHP deja datos a medio inicializar (por ejemplo, durante una subida de archivos). Al limpiar, libera memoria que contiene datos del atacante y eso permite ejecutar código.
CVE-2026-1096199.2Tras un error fatal, parte del estado interno de una petición sobrevive y la siguiente petición atendida por el mismo proceso lo reutiliza, lo que también permite ejecutar código.

Afecta a todo PHP que atienda peticiones web: PHP-FPM, mod_php de Apache (el de mayor riesgo), php-cgi, FrankenPHP y LiteSpeed. No importa qué aplicación tengas encima: WordPress, Laravel, Magento, Moodle o un desarrollo propio quedan expuestos por igual.

1Inventario de todo lo que corre PHP

El error más común es parchar el servidor principal y olvidar los demás. Haz una lista con:

Prioriza lo que está expuesto a Internet: ahí basta una petición para explotar la falla.

2Confirma la versión real

En cada servidor, revisa qué versiones están instaladas:

# Versión de la línea de comandos
php -v

# Todas las versiones de PHP-FPM instaladas
ls /usr/sbin/php-fpm* 2>/dev/null
php-fpm8.3 -v        # repite con cada versión (8.1, 8.2, 8.4...)

# Debian / Ubuntu
dpkg -l 'php*' | grep -E '^ii' | awk '{print $2, $3}'

# RHEL / AlmaLinux / Rocky
rpm -qa 'php*'
Atención: lo que ejecuta el servidor web puede ser distinto de lo que muestra php -v. Confírmalo con php-fpm8.x -i | grep 'PHP Version' o con una página temporal con phpinfo() (bórrala apenas la revises).

¿Tu distribución ya trae el parche?

Debian, Ubuntu, RHEL y sus derivadas aplican el parche sin cambiar el número de versión principal. Un Ubuntu puede mostrar 8.3.6 y estar corregido. Por eso, revisa el registro de cambios del paquete y busca los CVE:

# Debian / Ubuntu (ajusta 8.3 a tu versión)
zgrep -E 'CVE-2026-10961[89]' /usr/share/doc/php8.3-fpm/changelog.Debian.gz

# RHEL / AlmaLinux / Rocky
rpm -q --changelog php-fpm | grep -E 'CVE-2026-10961[89]'

Si ambos CVE aparecen, ese paquete ya está corregido. Si no aparece nada, sigue con el paso 3.

3Actualiza

RamaVersión corregida
8.58.5.12
8.48.4.27
8.38.3.36
8.28.2.35
8.1, 8.0 y 7.4Sin versión oficial. Hay parches mínimos para compilar desde el código fuente; si no, un proveedor con soporte extendido o migrar a una rama con soporte.

Debian y Ubuntu

apt update
apt install --only-upgrade 'php*'

RHEL, AlmaLinux y Rocky

dnf upgrade 'php*'

Si usas repositorios externos

Docker

Actualizar el servidor no corrige los contenedores: hay que reconstruir la imagen con una versión corregida y volver a desplegar.

# En tu Dockerfile, fija la versión corregida, por ejemplo:
FROM php:8.4.27-fpm

docker build --pull -t mi-app .
docker compose up -d --force-recreate

Paneles de hosting y productos de terceros

Actualiza cada versión de PHP desde el panel (o con el gestor de paquetes del panel) y aplica las actualizaciones que publique cada fabricante. Si un producto no tiene parche, aíslalo de Internet hasta que lo tenga.

4Reinicia y verifica

Los procesos que ya estaban corriendo siguen usando el código viejo hasta que se reinician:

# PHP-FPM (todas las versiones instaladas)
systemctl restart 'php*-fpm'

# Apache con mod_php
systemctl restart apache2     # o httpd en RHEL

# LiteSpeed
systemctl restart lsws

Después, vuelve a ejecutar los comandos del paso 2 y confirma la versión que reporta el servidor web, no solo la del CLI.

5Mitigaciones si no puedes actualizar hoy

Importante: estas medidas no dejan la instalación segura; solo reducen el riesgo mientras preparas la actualización. Si el servicio está expuesto a Internet y no puedes actualizar pronto, lo más seguro es sacarlo de Internet.

Contra CVE-2026-109618 (agotamiento de memoria)

a) Quita el límite de memoria de PHP sin que las aplicaciones puedan cambiarlo. Así la petición no llega al punto donde se produce la falla:

; Pool de PHP-FPM (por ejemplo /etc/php/8.3/fpm/pool.d/www.conf)
php_admin_value[memory_limit] = -1
# Apache con mod_php
php_admin_value memory_limit -1

Luego busca configuraciones que vuelvan a poner un límite finito (otro pool, un .htaccess, la configuración de la aplicación):

grep -rn memory_limit /etc/php* /etc/apache2 /etc/httpd /var/www 2>/dev/null

b) Pon un límite de memoria externo, porque sin memory_limit un proceso podría consumir toda la RAM. Con systemd, por ejemplo con systemctl edit php8.3-fpm:

[Service]
MemoryMax=2G
# Que el kernel termine solo el proceso que se excede, sin detener todo el servicio
OOMPolicy=continue

Ajusta MemoryMax a la RAM de tu servidor. No uses LimitAS ni LimitDATA (RLIMIT_AS y RLIMIT_DATA): provocan justamente el fallo vulnerable.

c) Reduce el tamaño de las peticiones en PHP (8M si el sitio no recibe archivos, 32M si los recibe; upload_max_filesize siempre menor):

post_max_size = 8M
upload_max_filesize = 6M

d) Limita las peticiones en el servidor web o proxy, incluidas las que llegan sin Content-Length (chunked):

# nginx (bloque http o server)
client_max_body_size 8m;
large_client_header_buffers 4 8k;
# Apache
LimitRequestBody 8388608
LimitRequestFields 50
LimitRequestFieldSize 8190

Si tienes un WAF o proxy delante, limita también la cantidad de campos, de partes multipart, de cabeceras y la profundidad de anidamiento.

Contra CVE-2026-109619 (estado reutilizado)

e) Desactiva el progreso de subida de sesiones. Debe ir en php.ini, en el pool de FPM o en la configuración del servidor (ini_set() y .user.ini no sirven, porque se aplican tarde):

; php.ini
session.upload_progress.enabled = 0

; o en el pool de PHP-FPM
php_admin_flag[session.upload_progress.enabled] = off

f) Solo en PHP 8.5: desactiva fatal_error_backtraces:

fatal_error_backtraces = 0

g) Corrige la configuración que genera avisos al iniciar cada petición (directivas inválidas u obsoletas). Ocultarlos con error_reporting, display_errors o @ no ayuda: hay que corregirlos. Revisa el log de PHP-FPM:

grep -iE 'PHP (Warning|Deprecated|Notice)' /var/log/php*-fpm.log | sort | uniq -c | sort -rn | head

h) Corrige los errores fatales y los timeouts que un atacante pueda provocar: callbacks, subidas e importaciones de archivos, y tareas de limpieza.

Aplica y comprueba

systemctl restart 'php*-fpm'     # o apache2 / httpd / lsws
php-fpm8.3 -i | grep -E 'memory_limit|post_max_size|upload_progress'

Las mitigaciones solo bloquean las vías de ataque confirmadas, no otras variantes. Programa la actualización igual.

6Revisa señales de compromiso

Si el servidor estuvo expuesto sin parche, conviene revisar con buenas prácticas generales (no son indicadores oficiales de esta falla):

Si encuentras algo, no borres nada todavía: aísla el servidor, conserva los logs y pide apoyo para analizarlo. Tener respaldos inmutables te deja un punto de restauración limpio.

Lista de verificación final

Preguntas frecuentes

¿Basta con las mitigaciones?

No. Las mitigaciones reducen el riesgo mientras preparas la actualización, pero no dejan la instalación segura. Solo actualizar PHP a una versión corregida resuelve el problema.

Mi Ubuntu dice PHP 8.3.6, ¿estoy vulnerable?

No necesariamente. Las distribuciones aplican el parche sin cambiar el número de versión principal. Revisa el registro de cambios del paquete (paso 2): si menciona CVE-2026-109618 y CVE-2026-109619, estás corregido.

Uso PHP 7.4 u 8.1, ¿qué hago?

No hay versión oficial corregida para 8.1, 8.0 ni 7.4. Las opciones son compilar con los parches mínimos publicados, usar un proveedor con soporte extendido o migrar a una rama con soporte. Mientras tanto, aplica todas las mitigaciones.

¿Me afecta si no uso PHP directamente?

Puede afectarte: muchos productos de terceros traen PHP incorporado. Revísalos con php2shell y consulta a cada fabricante.

Referencias

¿Prefieres que lo revisemos contigo?

Te ayudamos a revisar sin costo si tus servidores usan una versión afectada y qué conviene hacer primero. Mientras aplicas la actualización, también podemos definir en Cerberus WAF reglas específicas para las rutas y parámetros vulnerables de tu sitio; eso reduce la exposición, pero no reemplaza el parche.

Revisar si me afecta Gestión de parches