Le 21 octobre 2026, l'équipe PHP a publié en urgence des correctifs pour deux vulnérabilités critiques regroupées sous le nom PHP2Shell : CVE-2026-109618 et CVE-2026-109619. Notées 9,2 sur 10 (CVSS v4.0), elles permettent à un attaquant non authentifié d'exécuter du code à distance sur un serveur web qui fait tourner PHP.
Si vous hébergez un site WordPress, Drupal, Joomla, une application Laravel, Symfony ou n'importe quel projet PHP exposé sur Internet, cet article vous concerne directement.
En bref
- Quoi : deux failles de sécurité mémoire dans le moteur de PHP lui-même, pas dans votre code.
- Impact : exécution de code à distance (RCE) sans authentification, et lecture possible de la mémoire des workers PHP (mots de passe, clés API, jetons).
- Qui est touché : pratiquement toutes les versions de PHP qui servent des requêtes web avant les versions corrigées, y compris les branches en fin de vie.
- Que faire : mettre à jour vers PHP 8.5.12, 8.4.27, 8.3.36 ou 8.2.35, puis redémarrer tous les processus PHP.
Comment la faille a été découverte
Les failles ont été trouvées par Wiz Research, en collaboration avec OpenAI, Calif et Quarkslab. Le premier bug a été identifié le 19 août 2026 puis signalé à PHP le 24 août. La divulgation coordonnée était prévue pour le 22 octobre, mais des détails ont fuité le 20 octobre. PHP a alors publié un avis préalable et avancé la sortie des correctifs au 21 octobre à 14h00 UTC. Le CERT-EU a publié son propre avis (2026-018) le même jour.
Ce qui se passe techniquement
Le problème se situe dans la façon dont PHP interrompt une requête qui échoue brutalement.
Quand PHP rencontre une erreur de mémoire insuffisante ou une erreur fatale, il abandonne la requête en cours via un saut (longjmp()). Dans certains contextes, cet abandon intervient au mauvais moment : après que PHP a publié un pointeur ou réservé un emplacement dans un cache (OPcache par exemple), mais avant le nettoyage.
Résultat : un état incohérent reste en mémoire, et la requête suivante traitée par le même worker peut tomber dessus.
- CVE-2026-109618 : corruption liée à l'épuisement de la mémoire. La préparation de la requête reste à moitié faite, et le nettoyage considère ces données cassées comme valides.
- CVE-2026-109619 : état global périmé. Un état lié à une requête survit à la libération de sa mémoire et peut être réutilisé par une requête ultérieure.
Les deux CVE sont classées CWE-824 (accès à un pointeur non initialisé). Selon Wiz, quatre bugs distincts se cachent derrière ces deux identifiants. Le correctif de PHP traite le problème à la racine, ce qui couvre aussi d'autres variantes.
Point important : l'exploitation peut se déclencher avant même que votre code applicatif ne s'exécute. Un code propre et bien sécurisé ne vous protège donc pas.
Quelles configurations sont exposées
| Configuration | Niveau de risque |
|---|---|
| Apache + mod_php | Le plus élevé : exploit démontré avant toute exécution du code applicatif |
| PHP-FPM (Nginx, Apache) | Exposé |
| php-cgi | Exposé |
| FrankenPHP | Exposé |
| LiteSpeed | Exposé |
Wiz a démontré une exécution de code à distance sur des installations par défaut de WordPress, Drupal et Joomla.
Versions concernées et versions corrigées
| Branche | Vulnérable avant | Version corrigée |
|---|---|---|
| PHP 8.5 | 8.5.12 | 8.5.12 |
| PHP 8.4 | 8.4.27 | 8.4.27 |
| PHP 8.3 | 8.3.36 | 8.3.36 |
| PHP 8.2 | 8.2.35 | 8.2.35 |
| PHP 8.1, 8.0, 7.4 | Toutes | Pas de release officielle, seulement des backports minimaux du code source |
| PHP 7.3 et antérieures | Toutes | Aucun correctif |
Les versions touchées remonteraient jusqu'à PHP 5.4. On estime à environ 884 000 le nombre de serveurs exposés sur Internet qui annoncent encore PHP 8.1 ou plus ancien.
À noter : les distributions Linux (Debian, Ubuntu, RHEL, Alpine...) et les hébergeurs peuvent intégrer le correctif sans changer le numéro de version affiché. Vérifiez les bulletins de sécurité de votre distribution plutôt que de vous fier uniquement à php -v.
La faille est-elle déjà exploitée ?
Au 21 octobre, PHP ne signalait aucune exploitation active et la CISA n'avait pas encore ajouté les CVE à son catalogue KEV. Depuis, Aikido et Patchstack ont rapporté des premiers cas d'exploitation réelle.
Pour rappel, lors de la faille PHP CVE-2024-4577, les premières tentatives d'attaque étaient apparues moins de 24 heures après la divulgation. Considérez que la fenêtre de tir est déjà ouverte.
Que faire tout de suite
1. Inventorier
Listez toutes vos installations PHP : serveurs, conteneurs Docker, images de base, environnements de staging, panneaux d'hébergement, outils internes. N'oubliez pas les PHP embarqués dans des appliances ou des outils tiers.
php -v
php -i | grep -i "server api"
docker images | grep -i php
2. Mettre à jour
C'est la seule correction complète.
# Debian / Ubuntu
sudo apt update && sudo apt upgrade php*
# Alpine
apk update && apk upgrade php*
Pour Docker, reconstruisez vos images à partir d'une image de base corrigée (php:8.4.27-fpm, php:8.3.36-apache, etc.) puis redéployez.
Ensuite, redémarrez tous les workers PHP (php-fpm, Apache, FrankenPHP...). Un paquet mis à jour sans redémarrage ne protège rien.
3. Si vous ne pouvez pas mettre à jour immédiatement
Ces mesures réduisent l'exposition sans la supprimer. Testez-les avant de les appliquer en production.
Dans php.ini :
session.upload_progress.enabled = 0
opcache.enable = 0 ; impact sur les performances
fatal_error_backtraces = 0 ; PHP 8.5 uniquement
post_max_size = 8M ; 32M si vous gérez des uploads
Côté serveur et infrastructure :
- Limitez la taille et le nombre de champs des requêtes au niveau de Nginx, Apache ou du reverse proxy.
- Utilisez des limites de conteneur ou de cgroup pour la mémoire.
- Activez une règle WAF « virtual patch » si votre fournisseur en propose une (Cloudflare, Imperva, etc.), en sachant que c'est une protection temporaire.
- Isolez ou placez derrière un VPN les applications exposées tant qu'elles ne sont pas corrigées, comme le recommande le CERT-EU.
4. Pour les versions en fin de vie (8.1 et antérieures)
Il n'y a pas de solution simple : migrez. En attendant, sortez ces applications d'Internet ou mettez-les derrière un VPN et un WAF.
Détecter une tentative d'attaque
Surveillez dans vos logs :
- des requêtes multipart inhabituellement volumineuses ou avec un grand nombre de champs, suivies d'erreurs
Allowed memory size exhausted; - des erreurs HTTP 500 répétées ;
- des cookies
PHPSESSIDsurdimensionnés ou malformés ; - des processus
php-fpm,php-cgi,httpdouapache2qui lancent un shell, un interpréteur oucurl/wget.
Une erreur isolée ne prouve rien. C'est la combinaison de ces signaux qui doit alerter.
En cas de compromission suspectée
- Isolez le serveur du réseau.
- Conservez les logs du serveur web et de PHP.
- Recherchez des web shells et des fichiers récents dans le répertoire web.
- Vérifiez les tâches cron, les comptes utilisateurs et les connexions sortantes inhabituelles.
- Renouvelez tous les secrets accessibles par PHP (mots de passe de base de données, clés API,
APP_KEY, jetons OAuth), puisque la mémoire des workers a pu être lue.
Conclusion
PHP2Shell fait partie des failles les plus sérieuses qu'ait connues l'écosystème PHP ces dernières années : elle est exploitable à distance, sans authentification, touche le moteur lui-même et concerne une énorme partie du web. La priorité est simple : mettez à jour, redémarrez, vérifiez.
Chez SageCoders, nous accompagnons les entreprises dans l'audit et la mise à jour de leurs infrastructures PHP. Si vous avez besoin d'aide pour évaluer votre exposition ou migrer une application vieillissante, contactez-nous.


