PHP2Shell: la falla crítica de PHP, explicada — y cómo la atravesó Folder

PHP2Shell la falla crítica de PHP

El 21 de octubre de 2026, el equipo de seguridad de PHP publicó una actualización de emergencia para dos fallas críticas que permiten tomar el control de un servidor sin usuario ni contraseña. Folder estaba entre los sitios afectados. Ya está migrado y verificado, y acá te cuento qué pasó y qué hice.

Qué pasó

PHP es el lenguaje que hace funcionar buena parte de internet: cerca del 70% de los sitios cuyo software de servidor se puede identificar, según W3Techs. Ahí entran WordPress, Drupal, Joomla y Magento.

Esta semana se confirmaron dos vulnerabilidades en su núcleo, registradas como CVE-2026-109618 y CVE-2026-109619 y apodadas PHP2Shell. Según el propio equipo de PHP, ambas puntúan 9,2 sobre 10 en CVSS v4.0, la escala internacional de gravedad. Algunos reportes previos al aviso oficial hablaban de 10.

Lo vi primero en una nota de Infobae y lo contrasté con los avisos técnicos de CERT-EU, Qualys, Sansec y otros. La lista completa está al final.


Por qué es grave

La categoría técnica es ejecución remota de código sin autenticación. Es decir: un atacante puede hacer que el servidor ejecute sus propias instrucciones sin tener cuenta ni contraseña.

Es el tipo de falla más delicada porque no depende de que alguien cometa un error ni de que se roben credenciales. Quien lo logra puede hacer en el servidor lo mismo que haría el propio sitio: leer, modificar o borrar lo que ese sitio alcanza.


Qué puede hacer un atacante

Una imagen para entenderlo: no le robaron la llave de la casa, le dieron la voz del dueño, y la casa hace todo lo que esa voz ordene. Estos son los actos concretos, de lo más silencioso a lo más visible.

Robo silencioso. Es lo más común, porque el atacante prefiere que nadie se entere.

Envenenar a los visitantes.

Lo visible.

La puerta trasera. Lo primero que suele hacer un atacante es dejar un archivo escondido para volver cuando quiera. Por eso actualizar no alcanza si ya entraron: el parche cierra la puerta, pero no echa al que ya está adentro. Por eso, después de actualizar, hay que revisar si aparecieron archivos PHP desconocidos.

Un servidor, varios sitios. Una misma cuenta de hosting puede alojar varios sitios. Si el servidor obedece a un extraño, entrar por uno puede abrirle la puerta a todos los demás.


Las dos fallas, sin jerga

Los análisis posteriores al parche señalan dos puertas de entrada: las subidas de archivos (pedidos multipart/form-data) y el manejo de sesiones, en particular las opciones session.upload_progress.enabled y session.use_strict_mode.


A quién afecta

A casi cualquier sitio en PHP, porque la falla está en el lenguaje y no en una aplicación puntual.

Versiones corregidas:

  1. PHP 8.5: corregida en la 8.5.12. Soporte activo.
  2. PHP 8.4: corregida en la 8.4.27. Soporte activo.
  3. PHP 8.3: corregida en la 8.3.36. Solo seguridad.
  4. PHP 8.2: corregida en la 8.2.35. Solo seguridad, hasta el 31/12/2026.
  5. PHP 8.1 y anteriores: sin versión oficial. Fuera de soporte.

Para 7.4, 8.0 y 8.1 se publicaron parches mínimos de código fuente, pero no versiones oficiales. Después de actualizar hay que reiniciar PHP-FPM o el servidor web para que cargue el binario nuevo. En hosting compartido, la actualización depende del proveedor.

El tamaño del problema


Cómo se filtró

Dos grupos de investigación, Calif y Wiz Research, reportaron las fallas a PHP de forma independiente durante agosto. La divulgación coordinada estaba prevista para el jueves 22 de octubre.

El 20 de octubre, una publicación anónima en Hacker News, borrada después, reveló que las fallas existían y rompió el embargo. watchTowr confirmó que eran reales, PHP adelantó un aviso y CERT-EU y las agencias de ciberseguridad del Reino Unido y Australia emitieron alertas.

El 21 a las 04:43 (hora argentina), Cloudflare reportó los primeros ataques, antes de que existiera el parche. Entre las 10:35 y las 10:52, PHP publicó las versiones corregidas, unos minutos antes de lo anunciado.

Hay una razón extra para la urgencia: cuando sale un parche, comparar el código viejo con el nuevo es el atajo más rápido para entender cómo explotar la falla. Los servidores sin actualizar quedan más expuestos que antes del aviso, no menos.


Qué recomendaron los especialistas

  1. Actualizar de inmediato a 8.5.12, 8.4.27, 8.3.36 u 8.2.35. Un desarrollador del núcleo de PHP sostuvo que actualizar es la única mitigación real.
  2. Si no se puede actualizar ya, contener el riesgo: poner el sitio detrás de un servicio con reglas de protección como Cloudflare, bloquear las subidas multipart/form-data en el servidor web, endurecer la configuración de sesiones, o dejar el sitio en solo lectura o desconectado, como recomendó CERT-EU.
  3. Si se usa PHP 8.1 o anterior, migrar. No va a haber arreglo oficial.
  4. Revisar después si hubo intrusiones. Los ataques empezaron antes de que existiera el parche.

Si tenés un sitio en PHP y no sabés qué versión corre, preguntale a tu proveedor de hosting.


Qué hice en Folder

Folder es una plataforma de portfolio y catálogo para artistas, escrita en PHP y JavaScript sin frameworks. Estaba afectada: la web corría PHP 8.2.34, y el arreglo para esa rama es 8.2.35. Que no use framework no la protegía, porque la falla está en el lenguaje. Además, el vector apuntaba justo a lo que Folder usa: subidas de archivos y sesiones son el corazón del panel donde los artistas cargan su obra.

  1. Medí la versión real de la web, no la de la consola. La que muestra la consola puede ser otro binario. Usé una prueba temporal servida por la propia web, y la borré apenas la leí.
  2. Migré de PHP 8.2 a 8.5, en lugar de solo parchar. La rama 8.2 deja de recibir parches de seguridad el 31 de diciembre de 2026: parcharla hoy era resolver el problema por dos meses. Elegí 8.5 por ser la de soporte más largo, y Folder siguió funcionando sin cambios de código.
  3. Revisé la arquitectura, no solo la versión. Los datos de los usuarios viven fuera de la carpeta pública del servidor, así que no hay dirección web que llegue a ellos. Y los archivos se entregan leyéndolos, nunca ejecutándolos. Aunque alguien lograra colar un archivo ejecutable entre las subidas, el servidor nunca lo correría. Por eso no hizo falta agregar reglas extra: la separación ya estaba resuelta desde el diseño.
  4. Audité las inclusiones dinámicas de código. La única con ruta variable resultó apuntar a un archivo fijo, generado por la propia aplicación.
  5. Limpié código muerto. Encontré en la carpeta pública código huérfano de un proyecto anterior que ya no vive ahí, y lo borré. Código que nadie mantiene es superficie de ataque que nadie vigila.
  6. Verifiqué que las herramientas internas no respondan desde afuera sin sesión. Todas pasaron la prueba.


Lo que me deja


Fuentes

Back Next Let's talk