Mise à jour du 27 octobre : la CISA classe PHP2Shell parmi les failles exploitées
Le 26 octobre 2026, la CISA, l'agence américaine de cybersécurité, a ajouté les deux failles (CVE-2026-109618 et CVE-2026-109619) à son catalogue des vulnérabilités connues comme exploitées, le KEV (Known Exploited Vulnerabilities). Une entrée n'y figure que lorsqu'une exploitation réelle est établie : jusqu'ici, ce constat reposait sur les pièges réseau de watchTowr ; il vient désormais d'une autorité publique.
La CISA a fixé l'échéance au 29 octobre 2026, soit trois jours après l'ajout. Cette date ne s'impose qu'aux agences fédérales américaines, mais elle donne l'ordre de grandeur de l'urgence qu'un organisme public attribue à ces failles : quelques jours, pas la prochaine fenêtre de maintenance mensuelle.
Ce que dit l'entrée du catalogue KEV
- Date d'ajout : 26 octobre 2026, pour CVE-2026-109618 (« PHP Memory Corruption Vulnerability ») comme pour CVE-2026-109619 (« PHP Stale Internal Request-State Vulnerability »).
- Échéance : 29 octobre 2026 pour les deux.
- Action demandée : appliquer les mesures du fournisseur en respectant la directive BOD 26-04 (Prioritizing Security Updates Based on Risk), ou cesser d'utiliser le produit si aucune mesure n'est disponible.
- Triage forensique : l'entrée renvoie aux « Forensics Triage Requirements » de la CISA. Corriger ne suffit pas : il faut aussi chercher une compromission survenue avant le correctif.
- Rançongiciels : l'usage dans une campagne de rançongiciel est indiqué comme « inconnu » à ce jour.
Ce que cela change pour vous
Rien dans la marche à suivre : les versions corrigées et les commandes restent celles de cet article. Ce qui change, c'est la priorité. Avant le 26 octobre, on pouvait encore arbitrer entre « tout de suite » et « à la prochaine fenêtre de maintenance » ; ce n'est plus défendable. Les serveurs exposés à internet passent en premier. Et la question n'est plus seulement « suis-je protégé ? » mais « ai-je été touché entre le 21 octobre et le moment où j'ai corrigé ? » : la liste de contrôle plus bas a été complétée en ce sens.
PHP2Shell en bref
PHP2Shell n'est pas une faille de WordPress, de Laravel ou d'un plugin : c'est le moteur PHP qui est en cause. Toute application PHP qui répond à des requêtes web est donc concernée, quel que soit son code. L'avis de sécurité cite PHP-FPM, Apache avec mod_php, php-cgi, FrankenPHP et LiteSpeed.
Les deux failles partagent un même mécanisme. Quand PHP interrompt brutalement une requête (mémoire épuisée, erreur fatale), il peut laisser derrière lui un état interne à moitié initialisé ou déjà libéré. Une requête suivante, traitée par le même processus PHP, réutilise alors cet état : c'est ce qui ouvre la voie à une exécution de code à distance.
Ce qu'il faut retenir
- CVE-2026-109618 — corruption mémoire lors d'un dépassement de
memory_limit: des données de requête partiellement initialisées sont ensuite traitées comme valides au nettoyage. - CVE-2026-109619 — état global périmé : un état propre à une requête survit à la libération de sa mémoire et peut être lu par la requête suivante sur le même processus.
- Score : 9.2 sur 10 en CVSS 4.0 pour chacune, sans authentification ni interaction de l'utilisateur.
- Versions corrigées : PHP 8.5.12, 8.4.27, 8.3.36 et 8.2.35. Le projet ne publie plus de version pour 8.1 et les branches antérieures.
- Exploitation : watchTowr rapporte des tentatives d'exploitation dans ses pièges réseau dès le 21 octobre 2026.
- Périmètre : d'après la NVD, CVE-2026-109619 touche toutes les versions depuis PHP 5.4.0, et CVE-2026-109618 toutes celles depuis PHP 7.3.0.
Pourquoi ces deux failles sont si dangereuses
La plupart des failles web exigent un formulaire précis, un compte ou un plugin vulnérable. PHP2Shell n'a besoin de rien de tout cela : le déclencheur le plus courant est le traitement d'un envoi multipart/form-data avec le suivi de progression des sessions (session.upload_progress), un mécanisme que PHP active par défaut et qui s'exécute avant le premier octet de votre application. Un pare-feu applicatif placé dans votre code, un plugin de sécurité WordPress ou un middleware Laravel arrivent donc trop tard.
Le second facteur est le modèle d'exécution lui-même. PHP-FPM et Apache réutilisent le même processus pour des centaines de requêtes successives : c'est précisément ce qui permet à une requête piégée de contaminer la suivante. Selon Imperva, les techniques publiées vont du plantage de processus à la lecture de fichiers arbitraires via le cache OPcache, en passant par la fuite d'environ 67 Ko de mémoire du processus dans un cookie PHPSESSID surdimensionné. Cette mémoire peut contenir des mots de passe de base de données ou des clés d'API.
Quelle version installer selon votre branche
Faites défiler le tableau
| Branche PHP | Version corrigée | Que faire |
|---|---|---|
| 8.5 | 8.5.12 | Mettre à jour puis redémarrer PHP |
| 8.4 | 8.4.27 | Mettre à jour puis redémarrer PHP |
| 8.3 | 8.3.36 | Mettre à jour puis redémarrer PHP |
| 8.2 | 8.2.35 | Mettre à jour, puis planifier la migration vers 8.3 ou 8.4 |
| 8.1, 8.0, 7.4 | Aucune version officielle | Paquet corrigé de votre distribution, rétroportage source, sinon migration |
| 7.3 et antérieures, 5.x | Aucun correctif publié | Migrer vers une branche maintenue |
Vérifier si vos serveurs sont exposés
Attention à un piège classique : la version affichée par php -v en ligne de commande n'est pas forcément celle qui sert vos sites. Un serveur peut avoir plusieurs versions de PHP-FPM installées côte à côte, et chaque site peut pointer vers une version différente. Il faut donc vérifier la version réellement servie par le web, site par site.
Inventorier les versions de PHP servies
Lister les versions installées
Sur Debian ou Ubuntu :
dpkg-query -W -f='${db:Status-Abbrev} ${Package} ${Version}\n' 'php*' | awk '$1=="ii"' | grep -E 'php[0-9.]+-(fpm|cli|common)|libapache2-mod-php'Sur RHEL, AlmaLinux ou Rocky Linux :
rpm -qa 'php*' 'ea-php*' 'alt-php*' | sortRepérer les processus PHP qui tournent
systemctl list-units --type=service --state=running | grep -E 'php|apache2|httpd|lsws'Chaque service
phpX.Y-fpmactif est une version à vérifier et à corriger.Lire la version servie par un site
Déposez un fichier temporaire à la racine du site, interrogez-le, puis supprimez-le immédiatement :
echo '<?php echo PHP_VERSION, " ", PHP_SAPI;' > /var/www/monsite/v-check.php curl -s https://monsite.example/v-check.php rm /var/www/monsite/v-check.phpUn résultat
8.3.36 fpm-fcgiindique une version corrigée servie par PHP-FPM.Contrôler les conteneurs Docker
docker ps --format '{{.Names}}' | while read c; do echo "$c: $(docker exec "$c" php -r 'echo PHP_VERSION;' 2>/dev/null)"; doneUn conteneur sans PHP n'affiche rien après son nom.
Appliquer le correctif
Les distributions Linux et les fournisseurs de support étendu ont reçu les correctifs avant la publication. Le paquet corrigé de votre distribution ne porte donc pas forcément le numéro 8.3.36 : Ubuntu 24.04, par exemple, corrige sa version 8.3.6 dans le paquet 8.3.6-0ubuntu0.24.04.13. Fiez-vous à l'avis de sécurité de votre distribution plutôt qu'au seul numéro de version de PHP. Dans tous les cas, le redémarrage est indispensable : tant que les anciens processus tournent, c'est l'ancien code qui répond.
Mettre à jour PHP selon votre environnement
Debian et Ubuntu
sudo apt update sudo apt install --only-upgrade $(dpkg-query -W -f='${db:Status-Abbrev} ${Package}\n' 'php*' | awk '$1=="ii"{print $2}') sudo systemctl restart 'php*-fpm' sudo systemctl restart apache2 # si vous utilisez mod_phpSi vos versions viennent d'un dépôt tiers (par exemple le PPA
ondrej/php), vérifiez que la version installée après la mise à jour est bien une version corrigée.RHEL, AlmaLinux, Rocky Linux
sudo dnf upgrade 'php*' sudo systemctl restart php-fpm sudo systemctl restart httpdAlmaLinux a publié ses paquets corrigés le 21 octobre 2026. Le dépôt communautaire Remi a publié, lui, les versions 8.2.35, 8.3.36, 8.4.27 et 8.5.12 le 22 octobre 2026 : si vous en dépendez, vérifiez la version installée après coup.
Serveur cPanel (EasyApache 4 ou CloudLinux)
sudo dnf upgrade 'ea-php*' 'alt-php*' /scripts/restartsrv_apache_php_fpm /scripts/restartsrv_httpdSur un serveur plus ancien, remplacez
dnfparyum. Contrôlez ensuite chaque version dans WHM › MultiPHP Manager : un compte réglé sur 7.3 ou antérieur, sans correctif chez cPanel, doit être basculé vers une version maintenue ; 7.4, 8.0 et 8.1 sont corrigées par rétroportage mais en fin de vie (voir plus bas).Conteneurs Docker
docker compose pull docker compose up -d --force-recreate docker compose exec app php -r 'echo PHP_VERSION;'Si votre
Dockerfilepart d'une imagephp:8.3-fpm, reconstruisez l'image avecdocker compose build --pull: sans--pull, Docker réutilise l'ancienne image de base en cache.Contrôler le résultat
Relancez la vérification de l'étape précédente sur chaque site. Le correctif n'est appliqué que si la version servie par le web est corrigée, pas seulement la version installée sur le disque.
cPanel et EasyApache 4 : un numéro inchangé ne veut pas dire « non corrigé »
Le journal d'EasyApache 4 (EA4) du 21 octobre 2026, version 25.91, couvre sept branches de PHP. Pour les branches maintenues, le numéro monte : ea-php82 passe de 8.2.34 à 8.2.35, ea-php83 de 8.3.35 à 8.3.36, ea-php84 de 8.4.26 à 8.4.27 et ea-php85 de 8.5.11 à 8.5.12. Pour ea-php74, ea-php80 et ea-php81, que cPanel a pourtant déclarées en fin de vie, le correctif est rétroporté : le numéro de version de PHP ne bouge pas, seule la révision du paquet change.
C'est le piège : php -v affiche alors une version « ancienne » alors que le code est corrigé, et une version ancienne dont le changelog ne cite pas les deux CVE reste vulnérable. Seule la lecture du changelog du paquet tranche. Une version 25.92, publiée le même jour, a d'ailleurs reconstruit les méta-paquets pour que leur changelog mentionne aussi le rétroportage.
EasyApache 4 25.91 : ce que cPanel a publié, paquet par paquet
Faites défiler le tableau
| Paquet | Ce qui a changé | Comment le vérifier |
|---|---|---|
| ea-php85 | 8.5.11 vers 8.5.12 | Version du paquet |
| ea-php84 | 8.4.26 vers 8.4.27 | Version du paquet |
| ea-php83 | 8.3.35 vers 8.3.36 | Version du paquet |
| ea-php82 | 8.2.34 vers 8.2.35 | Version du paquet |
| ea-php81, ea-php80, ea-php74 | Correctif rétroporté, numéro PHP inchangé | Changelog RPM : chercher les deux CVE |
| ea-php73 et antérieurs | Aucune entrée dans le journal 25.91 | Migrer, ou voir CloudLinux ci-dessous |
Vérifier qu'un paquet rétroporté est bien corrigé
Lire le changelog du paquet EasyApache
rpm -qa 'ea-php*-php-cli' rpm -q --changelog ea-php81-php-cli | grep -E 'CVE-2026-(109618|109619)'La première commande liste les branches installées ; la seconde se rejoue pour chacune. Une ligne qui cite les CVE confirme le correctif. Aucune ligne : le paquet n'est pas corrigé, quel que soit son numéro de version.
Faire de même pour les paquets alt-php
Sur un serveur CloudLinux, les versions choisies dans Select PHP Version sont des paquets
alt-php:rpm -q --changelog alt-php85-common | grep -E 'CVE-2026-(109618|109619)'Reprendre les comptes un par un
Dans WHM › MultiPHP Manager, chaque domaine doit pointer vers une branche dont le paquet a passé ce contrôle. Les branches 7.4, 8.0 et 8.1 corrigées par rétroportage restent en fin de vie : c'est une position d'attente, pas une destination.
CloudLinux : le même correctif, un à deux jours plus tard selon le produit
CloudLinux publie ses propres paquets, et ils n'arrivent pas en même temps que ceux de cPanel. D'après son bulletin, les paquets ea-php (de 5.2 à 8.5) sont passés en stable le 21 octobre, les alt-php le 22 octobre sur CloudLinux 7, 8 et 9, le PHP natif du système le 22 octobre en fin de journée (UTC), et les paquets numérotés comme PHP.net le 23 octobre.
Là aussi, ce sont des rétroportages : ea-php84 y reste par exemple en 8.4.26 avec une révision propre à CloudLinux (8.4.26-2), tout en étant corrigé. Deux points d'attention : le 21 octobre, des alt-php annoncés comme publiés étaient en réalité dans le dépôt TuxCare ELS et non dans ceux de CloudLinux ; et le conseil de désactiver le dépôt php-els, donné le 22, a été corrigé le 23 au soir : laissez-le activé. Enfin, Imunify360 a publié ses règles WAF dès le 21 octobre (jeu de règles 8.83), la version 8.88 est en stable depuis le 23 : elles bloquent des vecteurs connus et ne remplacent pas la mise à jour.
Le PHP interne de cPanel/WHM et Roundcube : un autre PHP à mettre à jour
MultiPHP et EasyApache gouvernent le PHP de vos sites. Les interfaces de cPanel, de WHM et le webmail Roundcube tournent, eux, sur un PHP interne livré avec cPanel lui-même, que le choix d'une version dans MultiPHP Manager ne touche pas. Le 21 octobre 2026, cPanel a publié une mise à jour de sécurité pour ce PHP interne, en précisant qu'elle « affecte PHP dans les interfaces cPanel, y compris le webmail Roundcube ».
Elle livre PHP 8.4.27 dans cPanel & WHM 138.0.18, 136.0.50 et 134.0.66, et des correctifs rétroportés pour PHP 8.1.34 dans la version 110.0.153. Ces interfaces sont ouvertes aux connexions de vos clients, donc souvent joignables depuis internet : ce sont des cibles de premier choix. Lisez votre version avec /usr/local/cpanel/cpanel -V (ou dans le bandeau de WHM) et comparez-la à ces numéros. Si votre série n'y figure pas, ne la supposez pas corrigée : consultez les notes de version de cPanel et passez à une série qui l'est.
Après le correctif, coupez quand même le suivi de progression des envois
Le 23 octobre 2026, PHP a publié un avis d'information complémentaire : il recommande de garder session.upload_progress.enabled=0 jusqu'à la prochaine version de correction ordinaire, pour se protéger d'un vecteur d'exécution de code jugé peu probable. Il vise les applications qui configurent session.serialize_handler sur php_binary ou php_serialize, puis le repassent à php à l'exécution avec ini_set() avant session_start(). PHP annonce un avis complet pour CVE-2026-115560 avec la prochaine version. Le réglage ne concerne que la barre de progression des envois de fichiers.
Si vous ne pouvez pas mettre à jour tout de suite
L'avis officiel de PHP propose des réglages qui réduisent l'exposition sans rendre l'installation sûre. Ils servent à gagner quelques heures, pas à remplacer le correctif. Ils doivent être posés dans php.ini, dans le pool PHP-FPM ou dans la configuration du serveur web, jamais par ini_set() ni par un fichier .user.ini : ces derniers sont lus trop tard, après l'analyse de la requête.
Contre CVE-2026-109619, désactivez le suivi de progression des envois. Sur PHP 8.5, désactivez aussi les traces d'erreurs fatales :
; dans le pool FPM, par exemple /etc/php/8.3/fpm/pool.d/www.conf
php_admin_flag[session.upload_progress.enabled] = off
; PHP 8.5 uniquement :
php_admin_flag[fatal_error_backtraces] = offContre CVE-2026-109618, l'avis recommande memory_limit = -1 imposé par php_admin_value, afin qu'aucune application ne puisse le redéfinir, et une taille de requête bornée (post_max_size = 8M, ou 32M si vous avez besoin d'envois de fichiers). En contrepartie, la mémoire doit être plafonnée ailleurs, par une limite de conteneur ou de cgroup. N'utilisez pas RLIMIT_AS ni RLIMIT_DATA : ils provoquent justement l'échec d'allocation vulnérable.
Redémarrez ensuite tous les processus PHP pour que les réglages s'appliquent.
Ajoutez une barrière devant PHP
Bornez la taille des requêtes au niveau du serveur web, avant qu'elles n'atteignent PHP : client_max_body_size 8m; dans nginx, LimitRequestBody 8388608 dans Apache. Si votre site passe par Cloudflare en mode proxifié, des règles WAF ciblant les vecteurs connus de PHP2Shell ont été déployées pour tous les comptes, offre gratuite comprise. Ce sont des filets de sécurité : seule la mise à jour de PHP ferme la faille.
Rechercher des traces d'exploitation
Les tentatives publiées laissent des traces caractéristiques : des processus PHP qui plantent, des dépassements de mémoire en rafale et des envois multipart anormalement volumineux. Si votre serveur a été exposé avant la mise à jour, prenez dix minutes pour vérifier.
Contrôles à mener après le correctif
Chercher les processus PHP-FPM tués
sudo grep -E 'exited on signal (11|6)' /var/log/php*-fpm.log | tail -20Des processus tués par le signal 11 (SIGSEGV) en série depuis le 21 octobre sont un signal d'alerte.
Chercher les dépassements de mémoire
sudo grep -rh 'Allowed memory size' /var/log/php* /var/log/nginx /var/log/apache2 2>/dev/null | tail -20Repérer les fichiers PHP récemment créés
sudo find /var/www /home -name '*.php' -newermt '2026-10-20' -not -path '*/vendor/*' -not -path '*/cache/*' -lsUn fichier inconnu au nom générique, dans un dossier d'envoi ou dans
/tmp, doit être examiné avant toute suppression.En cas de doute, traiter le serveur comme compromis
Isolez la machine, conservez une copie des journaux, puis renouvelez les mots de passe de base de données, les clés d'API et les secrets présents dans les fichiers
.env: une fuite de mémoire peut les avoir exposés sans laisser d'autre trace.
Signaux à rechercher en plus, d'après les sources primaires
- Requêtes
multipartanormalement volumineuses ou très imbriquées dans les journaux du serveur web (watchTowr). - Processus PHP qui plantent ou atteignent leur limite de mémoire (watchTowr).
- Fichiers écrits dans les racines web et connexions sortantes de processus PHP que vous ne savez pas expliquer (watchTowr).
- Nouveaux web shells, tâches cron inattendues et comptes récemment créés en lien avec des processus PHP (watchTowr).
- Conserver avant de nettoyer : journaux PHP et serveur web, instantanés de configuration et fichiers suspects, avant toute modification (watchTowr). La CISA associe d'ailleurs à son entrée KEV des exigences de triage forensique.
- Aucun indicateur chiffré n'est publié : au 27 octobre, ni watchTowr, ni PHP, ni l'avis GitHub de CVE-2026-109618 ne donnent d'adresse IP, de hachage, de nom de fichier ou de signature de requête. Méfiez-vous des listes d'indicateurs sans source : l'absence d'une adresse dans vos journaux ne prouve rien.
Sur un hébergement mutualisé
Sur un hébergement mutualisé, ce n'est pas vous qui mettez à jour PHP : c'est l'hébergeur qui maintient les versions proposées. Votre part du travail consiste à vérifier que votre site utilise une branche encore corrigée. Dans cPanel, l'outil de choix de version (MultiPHP Manager, ou Select PHP Version sur un serveur CloudLinux) indique la version active de chaque domaine. Si votre site tourne encore en 7.4, 8.0 ou 8.1, ces branches ne reçoivent plus de version officielle de PHP : basculez vers 8.3 ou 8.4 après avoir testé votre site, en suivant notre checklist de migration PHP.
La documentation officielle
Les détails techniques et les réglages de contournement sont publiés dans l'avis de sécurité de PHP et dans les avis GitHub GHSA-w8hw-w9fx-j79w (CVE-2026-109618) et GHSA-6wmf-4rv5-p3rp (CVE-2026-109619). Pour les paquets de distribution, consultez l'annonce d'Ubuntu et celle d'AlmaLinux. Pour la suite : le catalogue KEV de la CISA, le journal EasyApache 4, les notes de version de cPanel & WHM, le bulletin de CloudLinux et la FAQ de watchTowr.