
PHP 8.4.26 - Crítico - Remoto - OOM longjmp - CVE-2026-109618 PHP2Shell. Un multipart por chunks sin autenticación alcanza memory_limit antes que el código de la aplicación en Apache mod_php. Laboratorio frente a 8.4.27. Aviso: RCE inferido.
Cualquiera en internet puede comunicarse con tu sitio PHP de la misma forma en que lo hace un navegador, sin contraseña. En las últimas versiones de PHP afectadas, pueden enviar una solicitud de carga de archivos manipulada que hace que el motor se quede sin memoria mientras todavía está leyendo la solicitud, antes de que tu aplicación se inicie. PHP entonces abandona ese trabajo con la solicitud solo a medio construir. El PHP Group demostró que la limpieza de ese estado a medio construir puede convertirse en ejecución remota de código como el worker web. Este laboratorio demuestra el salto por falta de memoria en Apache mod_php 8.4.26 y que 8.4.27 finaliza la misma solicitud de forma limpia.
Clase: OOM longjmp / aborto en el arranque de la solicitud Alcance: Remoto
PHP 8.4.26 (php:8.4.26-apache) vs parcheado 8.4.27 - php.net
Apache mod_php siempre ejecuta el apagado de la solicitud, incluso cuando el arranque de la solicitud falló. CVE-2026-109618 es un longjmp() sobre memory_limit durante el parseo de rfc1867 mientras un bucket de HashTable ya es visible para la destrucción. El laboratorio es un POST multipart/form-data en chunks sin Content-Length utilizable y con ~3000 cabeceras de parte adicionales bajo memory_limit=8M. 8.4.26 devuelve Fatal error: Allowed memory size ... in Unknown on line 0. 8.4.27 devuelve el marcador de vivo y ejecuta index.php. El GET del worker después del disparador sigue devolviendo 200 en ambos lados. La RCE según el aviso se infiere del GHSA.
| ID | CVE-2026-109618 |
| Aviso | GHSA-w8hw-w9fx-j79w |
| Clase | OOM longjmp / aborto en el arranque de la solicitud (RCE del aviso inferida) |
| Alcance | Remoto (HTTP no autenticado) |
| CWE | CWE-416 / CWE-824 / CWE-755 |
| CVSS | Crítico: 9.2 CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H (PHP Group) |
| Producto | PHP |
| Afectado | PHP 8.2 anterior a 8.2.35, 8.3 anterior a 8.3.36, 8.4 anterior a 8.4.27, 8.5 anterior a 8.5.12 (fijación del laboratorio 8.4.26) |
| Corregido | 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 (21 oct 2026) |
| Autenticación | ninguna |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Relacionado: CVE-2026-109619 UAF de global de worker obsoleto (pareja PHP2Shell).
| Método | Destino | Privilegio |
|---|---|---|
POST no autenticado multipart/form-data con Transfer-Encoding: chunked, muchas cabeceras de parte adicionales, memory_limit finito | parseo de rfc1867 / longjmp de zend_bailout durante php_request_startup | Disponibilidad (probado en laboratorio): aborta el arranque de la solicitud antes de index.php en 8.4.26 (Unknown on line 0). Integridad (inferida): el apagado recorre $_POST/$_FILES medio inicializados; el proveedor mostró RCE como el worker de Apache (www-data en la imagen oficial). Reconocimiento (inferido): divulgación de restos del heap de la solicitud. |
| Mismo disparador en 8.4.27 | OOM suave retardado | Cerrado (probado en laboratorio): marcador de vivo HTTP 200, files=1, el worker sigue en pie. |
| GET después del disparador | el worker sigue vivo | Probado en laboratorio: esta fijación no produjo SIGSEGV ni registró zend_mm_heap corrupted. |
Inicio de sesión, ruta de la aplicación, .so personalizado, reverse shell | n/a | Cerrado. No se intentó control de RIP. |
Probado en laboratorio vs inferido: el diferencial de OOM-longjmp entre 8.4.26 y 8.4.27 está probado en laboratorio. La UAF por muerte del worker y la RCE se infieren de GHSA-w8hw-w9fx-j79w. FPM normalmente termina el hijo ante un fallo de arranque; el proveedor no mostró un exploit completo de FPM para este CVE.
Requiere: Apache apache2handler. memory_limit finito (no establecer -1; esa es la mitigación). Parseo multipart habilitado. php:8.4.26-apache oficial vs php:8.4.27-apache.
python3 php-oom-longjmp-Abraxas-Labs.py
o cd lab && ./run.sh. Loopback 127.0.0.1:18220 (8.4.26) frente a 127.0.0.1:18221 (8.4.27). Proyecto de Compose cve-2026-109618. Testigo CVE-2026-109618-OOM-WITNESS. Última línea:
SUCCESS CVE-2026-109618 vuln-crash=yes patched-ok=yes sapi=apache2handler vuln-image=php:8.4.26-apache patched-image=php:8.4.27-apache how=oom-longjmp-startup-fatal trigger=header-bomb-chunked asan=no CVE-2026-109618-OOM-WITNESS
Solo laboratorio autorizado. Se comunica con loopback.
Actualice a PHP 8.4.27 (o 8.2.35 / 8.3.36 / 8.5.12). El parche reemplaza el longjmp() por OOM con un OOM suave diferido en el siguiente punto seguro de la VM y un _exit() forzado tras un umbral superior (31c0ea7). Hasta entonces: memory_limit=-1 de administrador que las aplicaciones no puedan sobrescribir; mantenga post_max_size bajo; limite las partes y cabeceras multipart. No use RLIMIT_AS ni RLIMIT_DATA.
Abraxas Labs [email protected]