La Crisis de Runtimes del "Black October": PHP2Shell, Vector Sin Parche CVE-2026-115560 y RCE Políglota HTTP2Shell en Brotli (CVE-2026-111497)
CVE-2026-109618, CVE-2026-109619, CVE-2026-115560 y CVE-2026-111497 (CWE-416 (Use After Free), CWE-502 (Deserialización Insegura) y CWE-787 (Escritura Fuera de Límites))
Severity: CRÍTICA (EMERGENCIA EN RUNTIMES "BLACK OCTOBER") (CVSS 9.2 – 9.8)
Threat Actor: Botnets Globales, Afiliados de Ransomware y Enjambres de Exploits Mutantes con IA
Status: Explotación Masiva en la Naturaleza; Alerta Urgente de CISA Emitida el 23 de Octubre de 2026
Affected Systems: PHP 5.4–8.5 | Decodificador C Google Brotli 1.0.3–1.2.0 (Node.js, Python, Java brotli4j, Bun, Envoy, Rust FFI)
Fixed In: PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 (+ mitigación php.ini) | libbrotli 1.2.1+ | Node.js 22.23.4 / 24.22.1 / 26.12.1
Para comprender por qué los líderes de seguridad de Anthropic, Cloudflare y OpenAI advirtieron durante el fin de semana sobre un "tsunami de vulnerabilidades" impulsado por IA en este "Black October", basta con observar el colapso simultáneo de la seguridad de memoria en dos de los componentes más ubicuos de internet: el manejo de sesiones multipart en PHP y la biblioteca C de descompresión Brotli de Google. En las últimas 96 horas, los equipos de defensa no solo han enfrentado la explotación masiva de PHP2Shell (CVE-2026-109618 y CVE-2026-109619) y una alerta urgente de CISA el 23 de octubre, sino también la revelación de un nuevo vector de deserialización en PHP sin parche (CVE-2026-115560) y la expansión de Node2Shell hacia HTTP2Shell (CVE-2026-111497), una corrupción de memoria en libbrotlidec que atraviesa fronteras FFI y JNI hacia Python, Java, Node.js, Bun y proxies C++.

1. PHP2Shell (CVE-2026-109618 y CVE-2026-109619): Heap UAF Pre-Script Descubierto con IA
Descubiertas en agosto de 2026 por investigadores de Wiz, OpenAI y Calif utilizando modelos de IA frontera para analizar el ciclo de vida de punteros C durante la fase de inicialización de peticiones (RINIT) de PHP, CVE-2026-109618 y CVE-2026-109619 (CVSS 9.2) residen en main/rfc1867.c y ext/session/session.c. Dado que la configuración por defecto de php.ini habilita session.upload_progress.enabled = 1, cualquier petición HTTP POST multipart/form-data que incluya el campo PHP_SESSION_UPLOAD_PROGRESS obliga al motor PHP a iniciar la sesión y escribir en $_SESSION antes de que se ejecute una sola línea del script PHP de la aplicación.
- CVE-2026-109618 (Puntero Colgante por Redimensionamiento de HashTable): Durante el análisis multipart,
php_session_rfc1867_callbackalmacena punteroszval*crudos hacia elementos internos de$_SESSION. Al forzar una realocación de laHashTablede Zend a mitad de la subida, el búferarDatase libera mientras el puntero en caché queda colgante, provocando un Heap Use-After-Free determinista pre-autenticación. - CVE-2026-109619 (Corrupción en Salida por Agotamiento de Memoria OOM): Al combinar el progreso de subida con un agotamiento deliberado del límite de memoria (
zend_bailout()), PHP omite las rutinas de limpieza de RFC1867 dejando punteros corruptos durante el cierre de la petición (RSHUTDOWN).
2. El Segundo Impacto en PHP: Vector Sin Parche CVE-2026-115560
Apenas 48 horas después de publicar PHP 8.5.12, 8.4.27, 8.3.36 y 8.2.35, el 23 de octubre se divulgó CVE-2026-115560, un vector RCE sin parche que afecta incluso a las versiones recién actualizadas cuando una aplicación cambia dinámicamente su manejador de serialización de sesiones:
// Patrón vulnerable en aplicaciones PHP:
// 1. php.ini inicia la petición en RINIT con el valor por defecto: session.serialize_handler = php
// El atacante envía multipart PHP_SESSION_UPLOAD_PROGRESS con: "|O:8:"Exploit":..."
// 2. Durante la ejecución del script, la aplicación cambia dinámicamente el serializador:
ini_set('session.serialize_handler', 'php_serialize');
session_start(); // ¡Deserializa el delimitador '|' bajo el parser equivocado logrando Object Injection!
3. De Node2Shell a HTTP2Shell (CVE-2026-111497): Desbordamiento de Búfer Políglota en Brotli
Mientras los administradores de PHP aplicaban mitigaciones, los equipos de Node.js, Python y Java descubrieron que CVE-2026-111497 (CVSS 9.2/9.8) —inicialmente apodada Node2Shell— reside en la biblioteca C original Google Brotli 1.0.3 a 1.2.0 (c/dec/decode.c). Un fallo en el cálculo de distancias y expansión del búfer circular provoca una escritura fuera de límites en el heap (CWE-787) al descomprimir un flujo HTTP con Content-Encoding: br:
- Node.js y Bun: Express 5,
body-parseryfetch()delegan la descompresión ennode:zlibsobrec/dec/decode.c. Corregido en Node.js 22.23.4, 24.22.1, 26.12.1 y Bun 1.4.4. - Python (Auto-Activación Silenciosa): Si el paquete C
brotliobrotlicffi(< 1.2.1) está instalado ensite-packages, bibliotecas comourllib3,requests,aiohttpyhttpxañaden automáticamenteAccept-Encoding: bry pasan las respuestas directamente al decodificador C vulnerable. - Java / JVM (
brotli4jJNI): Frameworks como Netty (HttpContentDecompressor), Reactor Netty, Spring WebFlux / Cloud Gateway y Vert.x cargan automáticamentecom.aayushatharva.brotli4j:brotli4jmediante JNI (libbrotlidec.so), exponiendo la memoria nativa de la JVM.
Telemetría y Mitigación de Emergencia
# 1. PHP: Neutralizar TANTO PHP2Shell COMO el vector sin parche CVE-2026-115560 en php.ini
echo "session.upload_progress.enabled = 0" | sudo tee -a /etc/php/*/fpm/conf.d/99-disable-upload-progress.ini
sudo systemctl reload php*-fpm
# 2. Mitigación en Nginx: Rechazar peticiones entrantes comprimidas con Brotli (Content-Encoding: br)
if ($http_content_encoding ~* "br") { return 415; }
# 3. Auditar entornos Python en busca de extensiones nativas brotli vulnerables (< 1.2.1)
python3 -c "
for mod in ('brotli', 'brotlicffi'):
try:
m = __import__(mod)
print(f'[ALERTA] {mod} instalado en {m.__file__} (versión: {getattr(m, "__version__", "unknown")})')
except ImportError:
print(f'[OK] {mod} no presente')
"Pasos de Remediación
- Actualizar PHP y Desactivar Upload Progress: Actualice a PHP 8.5.12, 8.4.27, 8.3.36 o 8.2.35 y configure
session.upload_progress.enabled = 0en todos los archivosphp.ini. - Actualizar Brotli en Todos los Ecosistemas: Actualice
libbrotlidel sistema a 1.2.1+, Node.js a 22.23.4 / 24.22.1 / 26.12.1, Pythonbrotli/brotlicffia 1.2.1+ y Javabrotli4ja 1.20.0+.