
PHP 8.4.26 - Critico - Remoto - OOM longjmp - CVE-2026-109618 PHP2Shell. Un multipart chunked non autenticato raggiunge memory_limit prima del codice dell'app su Apache mod_php. Lab vs 8.4.27. Advisory RCE dedotta.
Chiunque su internet può comunicare con il tuo sito PHP allo stesso modo di un browser, senza password. Sulle ultime versioni di PHP interessate è possibile inviare una richiesta di caricamento file appositamente costruita che fa esaurire la memoria al motore mentre sta ancora leggendo la richiesta, prima che la tua applicazione venga avviata. PHP esce quindi da quel lavoro con la richiesta costruita solo a metà. Il PHP Group ha dimostrato che la pulizia di quello stato parzialmente costruito può trasformarsi in esecuzione di codice remoto nei panni del worker web. Questo laboratorio dimostra il salto per esaurimento di memoria su Apache mod_php 8.4.26 e che la 8.4.27 completa la stessa richiesta in modo pulito.
Classe: OOM longjmp / interruzione all'avvio della richiesta Portata: Remota
PHP 8.4.26 (php:8.4.26-apache) vs 8.4.27 con patch - php.net
Apache mod_php esegue sempre lo shutdown della richiesta, anche quando l'avvio della richiesta è fallito. CVE-2026-109618 è un longjmp() su memory_limit durante il parsing rfc1867 mentre un bucket di una HashTable è già visibile al teardown. Il laboratorio consiste in un POST multipart/form-data chunked senza Content-Length utilizzabile e con ~3000 header di parte aggiuntivi sotto memory_limit=8M. La 8.4.26 restituisce Fatal error: Allowed memory size ... in Unknown on line 0. La 8.4.27 restituisce il marker di attività ed esegue index.php. La GET al worker dopo il trigger restituisce ancora 200 su entrambi i lati. L'RCE nei panni del worker Apache è dedotto dal GHSA.
| ID | CVE-2026-109618 |
| Advisory | GHSA-w8hw-w9fx-j79w |
| Classe | OOM longjmp / interruzione all'avvio della richiesta (RCE dedotto dall'advisory) |
| Portata | Remota (HTTP non autenticato) |
| CWE | CWE-416 / CWE-824 / CWE-755 |
| CVSS | Critico: 9.2 CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H (PHP Group) |
| Prodotto | PHP |
| Interessate | PHP 8.2 precedente alla 8.2.35, 8.3 precedente alla 8.3.36, 8.4 precedente alla 8.4.27, 8.5 precedente alla 8.5.12 (versione del lab 8.4.26) |
| Corrette | 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 (21 ott 2026) |
| Auth | nessuna |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Correlata: CVE-2026-109619 UAF su worker-global obsoleto (coppia PHP2Shell).
| Metodo | Sink | Privilegio |
|---|---|---|
POST non autenticato multipart/form-data con Transfer-Encoding: chunked, molti header di parte aggiuntivi, memory_limit finito | parsing rfc1867 / longjmp di zend_bailout durante php_request_startup | Disponibilità (dimostrata nel lab): interruzione dell'avvio della richiesta prima di index.php sulla 8.4.26 (Unknown on line 0). Integrità (dedotta): lo shutdown percorre $_POST/$_FILES parzialmente inizializzati; il vendor ha mostrato RCE nei panni del worker Apache (www-data nell'immagine ufficiale). Ricognizione (dedotta): divulgazione di residui dell'heap della richiesta. |
| Stesso trigger sulla 8.4.27 | soft OOM ritardato | Chiusa (dimostrata nel lab): marker di attività HTTP 200, files=1, il worker resta attivo. |
| GET dopo il trigger | worker ancora attivo | Dimostrata nel lab: questa versione non ha prodotto SIGSEGV né registrato zend_mm_heap corrupted. |
Login, route dell'applicazione, .so personalizzato, reverse shell | n/a | Chiusa. Nessun tentativo di controllo del RIP. |
Dimostrato nel lab vs dedotto: il differenziale OOM-longjmp tra 8.4.26 e 8.4.27 è dimostrato nel lab. La UAF con morte del worker e l'RCE sono dedotti da GHSA-w8hw-w9fx-j79w. FPM in genere termina il processo figlio in caso di fallimento all'avvio; per questa CVE il vendor non ha mostrato un exploit FPM completo.
Requisiti: Apache apache2handler. memory_limit finito (non impostare -1; quella è la mitigazione). Parsing multipart abilitato. php:8.4.26-apache ufficiale vs php:8.4.27-apache.
python3 php-oom-longjmp-Abraxas-Labs.py
oppure cd lab && ./run.sh. Loopback 127.0.0.1:18220 (8.4.26) vs 127.0.0.1:18221 (8.4.27). Progetto Compose cve-2026-109618. Witness CVE-2026-109618-OOM-WITNESS. Ultima riga:
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 autorizzato. Comunica con il loopback.
Aggiornare a PHP 8.4.27 (o 8.2.35 / 8.3.36 / 8.5.12). La patch sostituisce il longjmp() per OOM con un soft OOM ritardato al successivo punto sicuro della VM e un _exit() forzato oltre una soglia più alta (31c0ea7). Fino ad allora: impostare memory_limit=-1 a livello di amministratore in modo che le applicazioni non possano sovrascriverlo; mantenere post_max_size basso; limitare il numero di parti e le dimensioni delle intestazioni multipart. Non usare RLIMIT_AS o RLIMIT_DATA.
Abraxas Labs [email protected]