El 21 de octubre PHP publicó una versión de seguridad fuera de calendario para dos vulnerabilidades críticas, CVE-2026-109618 y CVE-2026-109619, conocidas como PHP2Shell. Permiten ejecutar código en el servidor sin autenticarse, con una simple petición POST de subida de archivos, y antes de que llegue a ejecutarse tu script. El problema está en el gestor de memoria de Zend, en las tablas hash y en el seguimiento del progreso de subida de las sesiones. En el núcleo de php.
Lo urgente, primero
- Actualizar a PHP 8.2.35, 8.3.36, 8.4.27 u 8.5.12 o posteriores.
- Desactivar el progreso de subida si no lo usas, que es lo más probable:
session.upload_progress.enabled = 0en la configuración del servidor o del pool de PHP-FPM, y reiniciar los procesos. Unini_set()en la aplicación no sirve, porque ese código se ejecuta antes que el tuyo. - No dar el asunto por cerrado. El 23 de octubre se publicó otra vulnerabilidad en el mismo mecanismo, CVE-2026-115560, que esas versiones no corrigen. La recomendación es la misma: progreso de subida desactivado.
La propuesta
A raíz del caso, en la lista de internals de PHP apareció una idea de RFC con el diagnóstico, PHP sigue definido por una única implementación. Los intentos de especificarlo formalmente, como php-langspec o KPHP, se abandonaron en la época de PHP 7, y HHVM dejó de ser compatible en 2019 para convertirse en Hack. Sin una segunda implementación ni una especificación formal, nadie puede comprobar si el motor hace lo que el lenguaje dice que hace.
Proponen una moratoria inmediata de nuevas funcionalidades y de deprecaciones cosméticas, y construir cuatro implementaciones independientes en K, Redex, Rocq y Agda. El argumento es que, si este tipo de fallos se encuentran ahora con IA, la IA también puede escribir directamente en lenguajes formales.
Ojo, que no son cuatro PHP alternativos para usar en producción. K y Redex son herramientas para describir con reglas precisas cómo se ejecuta cada instrucción del lenguaje, y esa descripción se puede ejecutar: le pasas un programa y te dice qué debería hacer (KPHP, de 2014, era justo eso, escrito en K). Rocq y Agda van un paso más allá: son asistentes de prueba, donde además de describir el comportamiento se puede demostrar matemáticamente que algo no ocurre nunca, por ejemplo, que una tabla hash no deja un puntero apuntando a memoria liberada. La gracia de tener varias es poder comparar: si Zend y esas definiciones no dan lo mismo con el mismo programa, alguien se equivoca.
Lo que tiene razón y lo que no
El diagnóstico es certero. Un puntero que se queda apuntando a memoria ya liberada dentro de una tabla hash es el tipo de fallo que una especificación precisa ayuda a encontrar, porque obliga a escribir qué debe pasar en cada caso y no solo qué pasa hoy.
La solución es cuanto menos fantasiosa. Ben Ramsey le respondió con lo evidente: las otras implementaciones de otros lenguajes existen porque las construyeron sus comunidades, no porque el equipo principal dejara de trabajar en la suya. Pedir a un grupo de voluntarios que ya va justo que congele el lenguaje y mantenga cuatro implementaciones más es pedir lo que no tiene.
Quizás siendo un poco menos ambicioso se podría llegar a un punto dulce. Pero lo que está claro es que alguien tiene que pagar esta fiesta, con los miles de proyectos que lo utilizan debería de ser sencillo... Espero que no tenga que llegar otro PHP2Shell para que alguien lo financie.
El hilo, en la propuesta original y la respuesta de Ben Ramsey.