
PHP 8.4.26 – Kritisch – Remote – OOM longjmp – CVE-2026-109618 PHP2Shell. Unauth chunked multipart erreicht memory_limit vor dem App-Code unter Apache mod_php. Labor vs. 8.4.27. Advisory RCE abgeleitet.
Jemand im Internet kann mit Ihrer PHP-Site genauso kommunizieren wie ein Browser – ohne Passwort. Auf der zuletzt betroffenen PHP-Version kann er eine manipulierte Datei-Upload-Anfrage senden, die die Engine dazu bringt, den Arbeitsspeicher zu erschöpfen, während sie die Anfrage noch liest, bevor Ihre Anwendung überhaupt startet. PHP bricht diese Arbeit dann ab, wobei die Anfrage nur halb aufgebaut ist. Die PHP Group hat gezeigt, dass die Bereinigung dieses halb aufgebauten Zustands zu Remote Code Execution als Web-Worker führen kann. Dieses Lab beweist den Out-of-Memory-Sprung auf Apache mod_php 8.4.26 und dass 8.4.27 dieselbe Anfrage sauber abschließt.
Klasse: OOM longjmp / Abbruch beim Request-Startup Reichweite: Remote
PHP 8.4.26 (php:8.4.26-apache) vs. gepatchtes 8.4.27 - php.net
Apache mod_php führt immer das Request-Shutdown aus, selbst wenn das Request-Startup fehlgeschlagen ist. CVE-2026-109618 ist ein longjmp() bei memory_limit während des rfc1867-Parsings, während ein HashTable-Bucket bereits für den Teardown sichtbar ist. Das Lab ist ein gechunkter multipart/form-data-POST ohne nutzbare Content-Length und mit ~3000 zusätzlichen Part-Headern unter memory_limit=8M. 8.4.26 gibt Fatal error: Allowed memory size ... in Unknown on line 0 zurück. 8.4.27 gibt den Alive-Marker zurück und führt index.php aus. Der Worker-GET nach dem Trigger liefert auf beiden Seiten weiterhin 200. Die RCE als Apache-Worker wird aus der GHSA abgeleitet.
| ID | CVE-2026-109618 |
| Advisory | GHSA-w8hw-w9fx-j79w |
| Klasse | OOM longjmp / Abbruch beim Request-Startup (RCE aus Advisory abgeleitet) |
| Reichweite | Remote (unauthentifiziertes HTTP) |
| CWE | CWE-416 / CWE-824 / CWE-755 |
| CVSS | Kritisch: 9.2 CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H (PHP Group) |
| Produkt | PHP |
| Betroffen | PHP 8.2 vor 8.2.35, 8.3 vor 8.3.36, 8.4 vor 8.4.27, 8.5 vor 8.5.12 (Lab-Pin 8.4.26) |
| Behoben | 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 (21. Okt. 2026) |
| Auth | keine |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Verwandt: CVE-2026-109619 Stale-Worker-Global-UAF (PHP2Shell-Paar).
| Methode | Sink | Privileg |
|---|---|---|
Unauthentifizierter POST multipart/form-data mit Transfer-Encoding: chunked, vielen zusätzlichen Part-Headern, endlichem memory_limit | rfc1867-Parsing / zend_bailout longjmp während php_request_startup | Verfügbarkeit (im Lab bewiesen): Abbruch des Request-Startups vor index.php auf 8.4.26 (Unknown on line 0). Integrität (abgeleitet): Shutdown durchläuft halb initialisierte $_POST/$_FILES; der Hersteller zeigte RCE als Apache-Worker (www-data im offiziellen Image). Recon (abgeleitet): Offenlegung des verbleibenden Request-Heaps. |
| Derselbe Trigger auf 8.4.27 | verzögertes Soft-OOM | Geschlossen (im Lab bewiesen): HTTP 200 Alive-Marker, files=1, Worker bleibt aktiv. |
| GET nach dem Trigger | Worker weiterhin aktiv | Im Lab bewiesen: Dieser Pin führte weder zu SIGSEGV noch zu zend_mm_heap corrupted im Log. |
Login, Anwendungsroute, benutzerdefiniertes .so, Reverse Shell | n/a | Geschlossen. Keine RIP-Kontrolle versucht. |
Im Lab bewiesen vs. abgeleitet: Das OOM-longjmp-Differential zwischen 8.4.26 und 8.4.27 ist im Lab bewiesen. Worker-Death-UAF und RCE sind aus GHSA-w8hw-w9fx-j79w abgeleitet. FPM beendet das Kind bei einem Startup-Fehler typischerweise; ein vollständiger FPM-Exploit wurde vom Hersteller für dieses CVE nicht gezeigt.
Voraussetzungen: Apache apache2handler. Endliches memory_limit (nicht auf -1 setzen; das ist die Mitigation). Multipart-Parsing aktiviert. Offizielles php:8.4.26-apache vs. php:8.4.27-apache.
python3 php-oom-longjmp-Abraxas-Labs.py
oder cd lab && ./run.sh. Loopback 127.0.0.1:18220 (8.4.26) vs. 127.0.0.1:18221 (8.4.27). Compose-Projekt cve-2026-109618. Witness CVE-2026-109618-OOM-WITNESS. Letzte Zeile:
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
Nur autorisiertes Labor. Es kommuniziert über Loopback.
Aktualisieren Sie auf PHP 8.4.27 (oder 8.2.35 / 8.3.36 / 8.5.12). Der Patch ersetzt das OOM-longjmp() durch ein verzögertes Soft-OOM am nächsten VM-Sicherheitspunkt und ein hartes _exit() oberhalb einer höheren Schwelle (31c0ea7). Bis dahin: Admin-memory_limit=-1, das Anwendungen nicht überschreiben können; halten Sie post_max_size niedrig; begrenzen Sie Multipart-Teile und Header. Verwenden Sie nicht RLIMIT_AS oder RLIMIT_DATA.
Abraxas Labs [email protected]