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 : les chercheurs estiment que les branches touchées remontent jusqu'à PHP 5.4, sans que chaque version ait été testée individuellement.
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 n'avait, lui, aucune mise à jour disponible au moment de l'annonce : 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 encore réglé sur une branche sans correctif (7.x, 8.0, 8.1) doit être basculé vers une version maintenue.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.
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.
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.