Tutoriel

PHP2Shell : corriger CVE-2026-109618 et CVE-2026-109619

Sécurité & Monitoring9 min de lecture13 étapes

Le 21 octobre 2026, l'équipe de sécurité de PHP a publié en urgence PHP 8.5.12, 8.4.27, 8.3.36 et 8.2.35. Ces versions corrigent deux failles surnommées « PHP2Shell » : CVE-2026-109618 et CVE-2026-109619, notées 9.2 sur 10 en CVSS 4.0. Elles visent l'interpréteur lui-même, pas une application : une seule requête HTTP anonyme suffit, avant même que votre code ne s'exécute. Des tentatives d'exploitation sont observées depuis le jour de la publication. Voici ce que font ces deux failles, comment savoir si vos serveurs sont exposés, et comment les corriger sur Debian, Ubuntu, RHEL, cPanel et Docker.

Sommaire· PHP2Shell en bref1/14
  1. 01PHP2Shell en bref
  2. 02Ce qu'il faut retenir
  3. 03Pourquoi ces deux failles sont si dangereuses
  4. 04Quelle version installer selon votre branche
  5. 05Vérifier si vos serveurs sont exposés
  6. 06Inventorier les versions de PHP servies
  7. 07Appliquer le correctif
  8. 08Mettre à jour PHP selon votre environnement
  9. 09Si vous ne pouvez pas mettre à jour tout de suite
  10. 10Ajoutez une barrière devant PHP
  11. 11Rechercher des traces d'exploitation
  12. 12Contrôles à mener après le correctif
  13. 13Sur un hébergement mutualisé
  14. 14La documentation officielle

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 PHPVersion corrigéeQue faire
8.58.5.12Mettre à jour puis redémarrer PHP
8.48.4.27Mettre à jour puis redémarrer PHP
8.38.3.36Mettre à jour puis redémarrer PHP
8.28.2.35Mettre à jour, puis planifier la migration vers 8.3 ou 8.4
8.1, 8.0, 7.4Aucune version officiellePaquet corrigé de votre distribution, rétroportage source, sinon migration
7.3 et antérieures, 5.xAucun 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

  1. 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*' | sort
  2. Repérer les processus PHP qui tournent

    systemctl list-units --type=service --state=running | grep -E 'php|apache2|httpd|lsws'

    Chaque service phpX.Y-fpm actif est une version à vérifier et à corriger.

  3. 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.php

    Un résultat 8.3.36 fpm-fcgi indique une version corrigée servie par PHP-FPM.

  4. 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)"; done

    Un 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

  1. 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_php

    Si 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.

  2. RHEL, AlmaLinux, Rocky Linux

    sudo dnf upgrade 'php*'
    sudo systemctl restart php-fpm
    sudo systemctl restart httpd

    AlmaLinux 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.

  3. Serveur cPanel (EasyApache 4 ou CloudLinux)

    sudo dnf upgrade 'ea-php*' 'alt-php*'
    /scripts/restartsrv_apache_php_fpm
    /scripts/restartsrv_httpd

    Sur un serveur plus ancien, remplacez dnf par yum. 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.

  4. Conteneurs Docker

    docker compose pull
    docker compose up -d --force-recreate
    docker compose exec app php -r 'echo PHP_VERSION;'

    Si votre Dockerfile part d'une image php:8.3-fpm, reconstruisez l'image avec docker compose build --pull : sans --pull, Docker réutilise l'ancienne image de base en cache.

  5. 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] = off

Contre 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

  1. Chercher les processus PHP-FPM tués

    sudo grep -E 'exited on signal (11|6)' /var/log/php*-fpm.log | tail -20

    Des processus tués par le signal 11 (SIGSEGV) en série depuis le 21 octobre sont un signal d'alerte.

  2. 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 -20
  3. Repé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/*' -ls

    Un fichier inconnu au nom générique, dans un dossier d'envoi ou dans /tmp, doit être examiné avant toute suppression.

  4. 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.

Gardez la main sur vos versions de PHP

Sur un VPS ServOrbit.com, vous avez l'accès root : vous appliquez un correctif PHP dès sa publication, vous choisissez la version de chaque site et vous redémarrez vos services quand vous le décidez.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet