Tutoriel

Sécurité & Monitoring

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

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. Mise à jour du 27 octobre : la CISA a ajouté les deux failles à son catalogue des vulnérabilités exploitées le 26 octobre. 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.

16 min de lecture16 étapes
Sommaire· Mise à jour du 27 octobre : la CISA classe PHP2Shell parmi les failles exploitées1/24
  1. 01Mise à jour du 27 octobre : la CISA classe PHP2Shell parmi les failles exploitées
  2. 02Ce que dit l'entrée du catalogue KEV
  3. 03Ce que cela change pour vous
  4. 04PHP2Shell en bref
  5. 05Ce qu'il faut retenir
  6. 06Pourquoi ces deux failles sont si dangereuses
  7. 07Quelle version installer selon votre branche
  8. 08Vérifier si vos serveurs sont exposés
  9. 09Inventorier les versions de PHP servies
  10. 10Appliquer le correctif
  11. 11Mettre à jour PHP selon votre environnement
  12. 12cPanel et EasyApache 4 : un numéro inchangé ne veut pas dire « non corrigé »
  13. 13EasyApache 4 25.91 : ce que cPanel a publié, paquet par paquet
  14. 14Vérifier qu'un paquet rétroporté est bien corrigé
  15. 15CloudLinux : le même correctif, un à deux jours plus tard selon le produit
  16. 16Le PHP interne de cPanel/WHM et Roundcube : un autre PHP à mettre à jour
  17. 17Après le correctif, coupez quand même le suivi de progression des envois
  18. 18Si vous ne pouvez pas mettre à jour tout de suite
  19. 19Ajoutez une barrière devant PHP
  20. 20Rechercher des traces d'exploitation
  21. 21Contrôles à mener après le correctif
  22. 22Signaux à rechercher en plus, d'après les sources primaires
  23. 23Sur un hébergement mutualisé
  24. 24La documentation officielle

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

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

  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.

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

PaquetCe qui a changéComment le vérifier
ea-php858.5.11 vers 8.5.12Version du paquet
ea-php848.4.26 vers 8.4.27Version du paquet
ea-php838.3.35 vers 8.3.36Version du paquet
ea-php828.2.34 vers 8.2.35Version du paquet
ea-php81, ea-php80, ea-php74Correctif rétroporté, numéro PHP inchangéChangelog RPM : chercher les deux CVE
ea-php73 et antérieursAucune entrée dans le journal 25.91Migrer, ou voir CloudLinux ci-dessous

Vérifier qu'un paquet rétroporté est bien corrigé

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

  2. 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)'
  3. 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] = 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.

Signaux à rechercher en plus, d'après les sources primaires

  • Requêtes multipart anormalement 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.

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.