
PHP 8.4.26 - Critique - Distant - OOM longjmp - CVE-2026-109618 PHP2Shell. Un multipart chunked non authentifié atteint memory_limit avant le code applicatif sur Apache mod_php. Labo vs 8.4.27. Avis RCE déduit.
N'importe qui sur Internet peut communiquer avec votre site PHP de la même manière qu'un navigateur, sans mot de passe. Sur les dernières versions de PHP affectées, il peut envoyer une requête de téléversement de fichier forgée qui fait manquer de mémoire au moteur alors qu'il est encore en train de lire la requête, avant même que votre application ne démarre. PHP interrompt alors ce travail par un saut, la requête n'étant qu'à moitié construite. Le PHP Group a montré que le nettoyage de cet état à moitié construit peut se transformer en exécution de code à distance en tant que worker web. Ce lab prouve le saut sur manque de mémoire sur Apache mod_php 8.4.26 et que 8.4.27 termine proprement la même requête.
Classe : OOM longjmp / abandon au démarrage de la requête Portée : Distante
PHP 8.4.26 (php:8.4.26-apache) vs corrigé 8.4.27 - php.net
Apache mod_php exécute toujours l'arrêt de la requête, même lorsque le démarrage de la requête a échoué. CVE-2026-109618 est un longjmp() sur memory_limit pendant l'analyse rfc1867 alors qu'un bucket de HashTable est déjà visible en cours de démontage. Le lab est un POST multipart/form-data chunked sans Content-Length exploitable et avec environ 3000 en-têtes de parties supplémentaires sous memory_limit=8M. 8.4.26 renvoie Fatal error: Allowed memory size ... in Unknown on line 0. 8.4.27 renvoie le marqueur de vie et exécute index.php. Le GET du worker après le déclencheur renvoie toujours 200 des deux côtés. La RCE annoncée dans l'avis, en tant que worker Apache, est déduite du GHSA.
| ID | CVE-2026-109618 |
| Avis | GHSA-w8hw-w9fx-j79w |
| Classe | OOM longjmp / abandon au démarrage de la requête (RCE de l'avis déduite) |
| Portée | Distante (HTTP non authentifié) |
| CWE | CWE-416 / CWE-824 / CWE-755 |
| CVSS | Critique : 9.2 CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H (PHP Group) |
| Produit | PHP |
| Affecté | PHP 8.2 avant 8.2.35, 8.3 avant 8.3.36, 8.4 avant 8.4.27, 8.5 avant 8.5.12 (version du lab 8.4.26) |
| Corrigé | 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 (21 oct. 2026) |
| Auth | aucune |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
Similaire : CVE-2026-109619, UAF de variable globale de worker obsolète (paire PHP2Shell).
| Méthode | Point de chute | Privilège |
|---|---|---|
POST multipart/form-data non authentifié avec Transfer-Encoding: chunked, de nombreux en-têtes de parties supplémentaires, memory_limit fini | analyse rfc1867 / longjmp de zend_bailout pendant php_request_startup | Disponibilité (prouvée en lab) : abandon du démarrage de la requête avant index.php sur 8.4.26 (Unknown on line 0). Intégrité (déduite) : l'arrêt parcourt des $_POST/$_FILES à moitié initialisés ; le fournisseur a montré une RCE en tant que worker Apache (www-data dans l'image officielle). Reconnaissance (déduite) : divulgation de résidus du tas de la requête. |
| Même déclencheur sur 8.4.27 | OOM doux retardé | Fermé (prouvé en lab) : marqueur de vie HTTP 200, files=1, le worker reste actif. |
| GET après le déclencheur | worker toujours actif | Prouvé en lab : cette version n'a pas produit de SIGSEGV ni journalisé zend_mm_heap corrupted. |
Connexion, route applicative, .so personnalisé, reverse shell | s.o. | Fermé. Aucune tentative de contrôle du RIP. |
Prouvé en lab vs déduit : le différentiel OOM-longjmp entre 8.4.26 et 8.4.27 est prouvé en lab. La mort du worker par UAF et la RCE sont déduites de GHSA-w8hw-w9fx-j79w. FPM termine généralement le processus enfant en cas d'échec au démarrage ; un exploit FPM complet n'a pas été montré par le fournisseur pour ce CVE.
Nécessite : Apache apache2handler. Un memory_limit fini (ne pas mettre -1 ; c'est là l'atténuation). L'analyse multipart activée. php:8.4.26-apache officiel vs php:8.4.27-apache.
python3 php-oom-longjmp-Abraxas-Labs.py
ou cd lab && ./run.sh. Boucle locale 127.0.0.1:18220 (8.4.26) vs 127.0.0.1:18221 (8.4.27). Projet Compose cve-2026-109618. Témoin CVE-2026-109618-OOM-WITNESS. Dernière ligne :
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
Laboratoire autorisé uniquement. Il communique avec le loopback.
Mettez à jour vers PHP 8.4.27 (ou 8.2.35 / 8.3.36 / 8.5.12). Le correctif remplace le longjmp() en cas d'OOM par un OOM doux différé au prochain point sûr de la VM et un _exit() forcé au-delà d'un seuil plus élevé (31c0ea7). En attendant : memory_limit=-1 côté admin que les applications ne peuvent pas surcharger ; gardez post_max_size bas ; limitez les parties et les en-têtes multipart. N'utilisez pas RLIMIT_AS ni RLIMIT_DATA.
Abraxas Labs [email protected]