FactualRisk
Guide · Vulnérabilité critique · PHP

PHP2Shell
le guide complet

Deux failles dans le moteur PHP lui-même permettent de prendre la main sur un serveur web sans aucun identifiant. Comprendre, savoir si l'on est touché, détecter une intrusion et corriger : tout est ici, du premier niveau au plus technique.

Exploitation active CVE-2026-109618 · 109619 · 115560 CVSS 4.0 9,2 109618 et 109619 au catalogue KEV de la CISA depuis le 26/10/2026 Mis à jour le 27 octobre 2026
9,2
score de gravité CVSS 4.0 des deux failles principales
5,1 M
adresses IP exécutant PHP sur Internet (VirusTotal, 21/10)
69 %
des sites web reposent sur PHP, parmi ceux dont la technologie est connue (W3Techs)
0
authentification nécessaire pour l'attaquant

01En bref

PHP2Shell, ce sont deux failles critiques corrigées en urgence le 21 octobre 2026, et une troisième annoncée deux jours plus tard sans correctif.

  • Le problème est dans PHP, pas dans votre site. Mettre à jour WordPress, Drupal ou PrestaShop ne change rien : c'est le moteur PHP qu'il faut corriger.
  • Une simple requête web suffit. Pas de compte, pas de mot de passe : l'attaquant envoie un formulaire piégé et peut exécuter ses commandes sur le serveur.
  • Versions corrigées : PHP 8.2.35, 8.3.36, 8.4.27 et 8.5.12. En dessous, tout dépend de votre distribution ou de votre hébergeur.
  • Mesure immédiate : session.upload_progress.enabled = 0 dans la configuration de PHP réduit le risque sur deux des trois failles, sans impact pour la plupart des sites. Elle ne protège pas de la 109618 : seule la mise à jour la corrige.
  • L'exploitation est réelle mais ciblée : prises de contrôle confirmées sur des serveurs leurres, pas encore d'exploitation de masse à la date de ce guide.
CVE-2026-109618

Corruption mémoire à l'envoi de formulaire

Un envoi de fichiers démesuré épuise la mémoire de PHP en pleine préparation de la requête.

CVE-2026-109619

Données de session réutilisées

Le suivi de progression des envois laisse des restes en mémoire, réutilisés par la requête suivante.

CVE-2026-115560

Troisième faille, sans correctif

Exploitable dans une combinaison rare de configuration et de code. Neutralisée par le même réglage du php.ini.

02Chronologie

Neuf jours entre la première tentative et l'inscription au catalogue des failles activement exploitées de la CISA.

  1. 17 octobrePremière tentative d'exploitation observée par Amazon sur ses pièges, quatre jours avant les correctifs.
  2. 20 octobreFuite des détails et d'un premier code d'attaque ; PHP annonce les correctifs.
  3. 21 octobreCorrectifs d'urgence de PHP (8.2.35, 8.3.36, 8.4.27, 8.5.12). Alertes du CERT-FR et de la CISA. En France, à la demande de l'ANSSI, le ministère de l'Intérieur met ses sites en maintenance préventive. Un botnet de type Mirai (« Potassium ») tente déjà de s'en servir.
  4. 22 – 23 octobreOutils d'attaque industrialisés, millions de tentatives bloquées par les grands filtres web. Troisième faille annoncée (CVE-2026-115560), sans correctif. La CISA publie une règle de détection Sigma.
  5. 24 octobrePremières prises de contrôle confirmées, sur des serveurs leurres (35 shells sur 3 pièges). Repérage discret de 216 cibles attribué, avec une confiance modérée, à un acteur lié à la Corée du Nord (CYFIRMA).
  6. 25 octobrePalo Alto Unit 42 retire son rapport du 23 sur une administration européenne compromise : le lien avec PHP2Shell n'est pas établi.
  7. 26 octobreLa CISA inscrit les deux failles à son catalogue KEV des failles activement exploitées. L'exploitation réussie est confirmée publiquement.

03Comprendre la faille

La faille se déclenche dans le moteur PHP, pendant la lecture de la requête, avant même que le code du site ne s'exécute.

Visiteur ou attaquant Serveur web Apache, nginx Moteur PHP la faille est ici lecture du formulaire Application WordPress, Drupal… Données base, fichiers l'attaque court-circuite l'application : la mettre à jour ne protège pas
Le trajet d'une visite. PHP lit le formulaire envoyé avant de passer la main au site.

Deux failles, deux mécanismes

109618 · « le chantier abandonné »

Mémoire épuisée en pleine lecture

L'attaquant envoie un formulaire démesuré. PHP manque de mémoire et s'interrompt pendant qu'il prépare la requête. Il laisse derrière lui des données à moitié construites, que l'attaquant détourne pour faire exécuter ses commandes.

109619 · « la table mal débarrassée »

Restes de session réutilisés

Une première requête dépose des données en mémoire via le suivi de progression des envois. La mémoire est libérée, mais PHP en garde une trace. La requête suivante réutilise ces restes : l'attaquant en prend le contrôle.

Ce qui se passe dans le moteur

CVE-2026-109618 touche l'analyse des requêtes multipart/form-data (le code RFC 1867 de PHP). Lorsque la limite memory_limit est atteinte en plein traitement, la sortie d'erreur interrompt l'analyse par un saut non local et laisse des structures partiellement initialisées. Une requête suivante dans le même processus peut alors s'appuyer sur cet état corrompu. Les journaux montrent typiquement des erreurs Allowed memory size … exhausted sur rfc1867.c ou Unknown on line 0.

CVE-2026-109619 touche le mécanisme session.upload_progress : un état global n'est pas remis à zéro entre deux requêtes traitées par le même processus, d'où l'utilisation d'une donnée libérée. C'est la voie la plus tentée par les attaquants ; la seule compromission confirmée à ce jour passe pourtant par la 109618.

Pourquoi le modèle de processus compte : les chaînes publiques supposent qu'une requête de préparation et la requête d'exécution tombent sur le même processus PHP. Apache avec mod_php en mode prefork est le cas le plus favorable à l'attaquant ; un pool PHP-FPM chargé avec beaucoup de processus rend l'attaque plus aléatoire, sans la rendre impossible.

Une chaîne observée en conditions réelles, cohérente avec la 109618 (serveurs leurres du 24 octobre, PHP 8.4.26 sous Apache mod_php à un seul processus) : épuisement mémoire, fuite d'adresses via un cookie de session géant, nouvelle requête de préparation, puis exécution de commande. Quatre étapes, des corps de requête de 280 Ko à 33 Mo.

La troisième faille : CVE-2026-115560

Annoncée le 23 octobre, elle n'a pas de correctif. PHP la décrit comme exploitable dans une combinaison inhabituelle de configuration et de code applicatif, et n'a pas publié de version d'urgence. PHP comme Red Hat indiquent que désactiver session.upload_progress la neutralise.

Ce qui protège, et ce qui ne protège pas

MesureEffetCommentaire
Mettre à jour PHP (ou le paquet corrigé de la distribution)CorrigePuis redémarrer PHP-FPM ou Apache : sinon l'ancien PHP tourne toujours.
session.upload_progress.enabled = 0RéduitCouvre la 109619 et la troisième faille, pas la 109618. Selon PHP, aucun réglage ne protège complètement.
Pare-feu applicatif avec règles dédiéesRéduitBloque les attaques connues ; une variante inédite peut passer.
Interdire au serveur web de joindre InternetLimiteN'empêche pas l'intrusion, mais empêche de télécharger une charge ou d'appeler un serveur de commande. À faire après inventaire des flux légitimes (paiement, mises à jour, e-mail).
Mettre à jour le CMS, le thème ou les extensionsSans effetLa faille est dans PHP, avant le site.

04Qui est touché

Toutes les versions de PHP depuis la 5.4 de façon certaine, jusqu'à la 8.5 non corrigée. Ce qui change d'une version à l'autre, c'est l'existence d'un correctif.

4.x 5.0–5.3 5.4–5.6 7.0–7.3 7.4 8.0 8.1 8.2 8.3 8.4 8.5 abandonnées tiers (souvent payants) correctif source PHP versions corrigées officielles 8.2.358.3.368.4.278.5.12 encore maintenues par PHP 8.2 : fin de support au 31/12/2026
Selon le CERT-FR, les versions 5.x à 8.1 sont touchées, ainsi que les 8.2 à 8.5 non corrigées. Le code vulnérable est établi à partir de la 5.4 ; pour les versions antérieures, l'exposition n'est pas démontrée, mais aucun correctif n'existe de toute façon.
BrancheCorrectif disponibleVoie recommandée
8.3 · 8.4 · 8.58.3.36 · 8.4.27 · 8.5.12Mettre à jour, redémarrer PHP.
8.28.2.35Mettre à jour, puis viser 8.3 : plus aucun correctif après 2026.
7.4 · 8.0 · 8.1Correctif source PHPPaquet corrigé de la distribution, du panneau ou d'un tiers ; planifier la migration.
5.4 – 7.3Tiers (souvent payants)Paquets de tiers (CloudLinux alt-php, support étendu, rétroportages communautaires) ou isolement, et migration de l'application.
4.x · 5.0 – 5.3AucunExposition non établie, mais aucun correctif d'aucune sorte : réécrire l'application, isoler ou couper d'Internet en attendant.
Le numéro de version ne suffit pas. Les distributions corrigent souvent sans changer la version affichée : un PHP 7.4 peut être corrigé, un PHP 8.4 peut ne pas l'être. Seul le paquet installé, comparé à l'avis de sécurité de sa distribution, fait foi (voir la section Vérifier son correctif).

Red Hat et dérivées (Rocky, Alma, Oracle)

VersionPHP fourniCorrectif Red Hat (état au 23/10)
RHEL 108.3, 8.48.3 et 8.4 corrigés
RHEL 98.0 (base), 8.1 à 8.4 (flux)8.0, 8.2, 8.3 flux 8.1 en fin de vie (mai 2025) 8.4 en attente
RHEL 87.2 (base), 7.3 à 8.2 (flux)7.4 et 8.2 7.2, 7.3, 8.0 : aucun
RHEL 75.4 (base), 7.x en collectionsAucun correctif public au 23/10 une seule des deux failles concerne la 5.4 ; interroger le support étendu
RHEL 6 · 55.3 · 5.1Aucun, hors support
Le piège de RHEL 8 : son PHP par défaut, la 7.2, n'a reçu aucun correctif. Un serveur « à jour » reste vulnérable s'il n'a pas basculé sur le flux 7.4 ou 8.2. Les PHP installés depuis des dépôts tiers (Remi, compilations maison) ne sont pas corrigés par Red Hat : leur correctif vient de leur propre source.

Hébergeurs, panneaux et clouds

Hébergement mutualisé

Souvent déjà corrigé

OVHcloud, o2switch et Infomaniak ont déployé des correctifs jusqu'aux anciennes versions de PHP. Vérifiez quand même la version servie par votre site.

VPS et serveurs dédiés

C'est à vous d'agir

Sur un serveur que vous administrez, personne ne corrige à votre place, même chez un grand hébergeur.

Panneaux d'hébergement

cPanel, Plesk, CloudLinux

Correctifs publiés dans les heures suivantes : jusqu'à PHP 7.4 dans les paquets cPanel et Plesk, jusqu'aux versions 5 avec CloudLinux.

Grands clouds et CDN

Filtres, pas correctifs

Cloudflare a déployé des règles dès le 21 octobre à 3 h 02 UTC, quelques heures avant les correctifs. Azure ne corrige pas les versions hors support : à ses clients de migrer.

CMS : que peut-on migrer ?

ApplicationPoint de blocageEffort
WordPressRarement bloquant ; vérifier les extensions anciennes avant de passer en PHP 8.3+.Mise à jour
DrupalDrupal 7 est hors support depuis janvier 2025 ; viser Drupal 10 ou 11.Mise à jour à Projet
PrestaShop1.6 limité à PHP 7.1, 1.7 limité à 7.4 : aucune version PHP 8 possible sans changer de version majeure.Refonte
Applications maisonÉcrites pour PHP 4 ou 5 : aucune version cible n'existe sans réécriture.Réécriture

05État de l'exploitation

L'exploitation fonctionne, mais reste ciblée : à la date de ce guide, aucune victime réelle n'est confirmée publiquement et aucune vague de masse n'est observée.

Ce qui est confirmé

Des prises de contrôle réelles

Le 24 octobre, des serveurs leurres ont été compromis 35 fois par deux sources, dans une configuration volontairement favorable (PHP 8.4.26, Apache mod_php, un seul processus).

Ce qui ne l'est pas

Pas d'exploit public fiable sur une configuration standard

Selon Sansec, les exploits publics échouent sur une installation PHP standard. Des exploits privés fonctionnels existent (VulnCheck), et VulnCheck n'a confirmé aucune exploitation réussie en conditions réelles.

Ce que montrent les capteurs CrowdSec (21 au 25 octobre)

MesureValeurLecture
Adresses ayant tenté PHP2Shell1 187Sur un réseau de capteurs, surtout en Allemagne, France et États-Unis.
Nouvelles adresses par jour≈ 130Après un pic de 612 le 22 octobre, puis plateau.
Sources visant la voie de session (109619)429Contre 147 pour la faille mémoire : la voie de session est la plus tentée, mais les intrusions confirmées passaient par la 109618.
Sources ayant insisté (10 requêtes et plus)24La moitié des sources n'a envoyé qu'une requête : on teste plus qu'on ne récolte.

Les signaux qui feraient basculer vers l'exploitation de masse

  1. Un exploit public fiable sur un PHP standardC'est le déclencheur principal. Avec React2Shell, le nombre de sources attaquantes a été multiplié par 27 entre le deuxième et le sixième jour.
  2. Une hausse nette des nouvelles sourcesAu-delà du plateau d'environ 130 par jour.
  3. Plus d'attaquants insistantsUne vraie tentative se répète contre la même cible.
  4. La faille mémoire qui rattrape la voie de sessionLe signe d'outils plus aboutis.
À décider dès maintenant : ce que vous couperez d'Internet le jour où l'un de ces signaux bascule, pour tout ce qui ne peut pas être corrigé rapidement.

06Que faire maintenant

Un arbre de décision selon votre version de PHP, puis quatre actions valables pour tout le monde.

Quelle version de PHP ? 8.2 à 8.5 Mettre à jour vers la version corrigée, redémarrer PHP 7.4 à 8.1 Paquet corrigé (distribution, panneau, tiers), puis migrer 5.x à 7.3 et plus ancien Isoler ou couper d'Internet, support payant, puis migrer Pour tous, en parallèle 1. Durcir le php.ini : session.upload_progress.enabled = 0 2. Filtrer : pare-feu applicatif avec règles PHP2Shell 3. Chercher une compromission · 4. Renouveler les secrets exposés
Corriger reste la seule vraie solution ; le reste fait gagner du temps.
  1. InventorierLister tous les serveurs qui exécutent PHP, y compris les environnements de test exposés, les sites oubliés et les serveurs « considérés comme fermés ». Ce sont eux qui tombent.
  2. Corriger, puis redémarrerUn binaire corrigé ne protège rien tant que les processus PHP-FPM ou Apache tournent encore avec l'ancien. Vérifier ensuite la version réellement servie.
  3. Durcir et filtrer en attendantRéglage du php.ini, règles de pare-feu applicatif (patch virtuel), interdiction des connexions sortantes du serveur web.
  4. Isoler ce qui ne peut pas être corrigéLe blocage depuis l'extérieur est une mesure d'attente : chaque application coupée doit être corrigée et rouverte au plus vite.
  5. Chercher une compromissionSur tout serveur exposé et non corrigé depuis le 17 octobre (voir Détecter une intrusion).
  6. Renouveler les secrets« Aucune trace trouvée » ne veut pas dire « non compromis » : l'une des failles permet de lire la mémoire. Mots de passe de base de données, clés d'API et clés applicatives des serveurs exposés sont à changer.

07Vérifier son correctif

Trois questions : quelle version tourne vraiment, le paquet installé est-il corrigé, et a-t-on redémarré ?

Sur un hébergement mutualisé, une page phpinfo() temporaire (à supprimer aussitôt) ou l'interface de l'hébergeur indique la version. Sur un serveur, les commandes ci-dessous suffisent.

Red Hat, Rocky, Alma

bash
php -v                                   # version de la ligne de commande
rpm -qa 'php*' | sort                    # paquets installés (y compris collections rh-php / remi)
rpm -q --changelog php php8.4 2>/dev/null | grep -iE '109618|109619' | head   # nom du paquet selon le flux
dnf updateinfo list --all --cve CVE-2026-109618  # RHEL 8+ : avis installé ou à installer
systemctl restart php-fpm                # indispensable après la mise à jour
# avec mod_php (sans PHP-FPM) : systemctl restart httpd

Debian, Ubuntu

bash
php -v
dpkg -l 'php*' | awk '/^ii/{print $2, $3}'
zcat /usr/share/doc/php*-common/changelog.Debian.gz 2>/dev/null | grep -iE '109618|109619' | head
systemctl restart 'php*-fpm.service'     # avec mod_php : systemctl restart apache2
Vérifier la version réellement servie, pas celle de la ligne de commande

La commande php peut être une autre version que celle utilisée par le site (collections logicielles, plusieurs pools PHP-FPM, conteneurs). Vérifier chaque processus en cours :

bash
# binaire réel de chaque pool PHP-FPM et date de démarrage du processus
for p in $(pgrep -f 'php-fpm: master'); do
  echo "PID $p : $(readlink /proc/$p/exe)  démarré le $(ps -o lstart= -p $p)"
done
# un processus démarré AVANT la mise à jour tourne avec l'ancien binaire

Avec Apache et mod_php, c'est le module chargé par Apache qui compte : httpd -M | grep php, puis vérifier le paquet qui fournit le module.

08Durcir PHP en attendant

Une ligne coupe la voie la plus tentée et la troisième faille. Pour la 109618, aucun réglage ne protège complètement selon PHP : on réduit seulement la surface.

php.ini
; PHP2Shell — mesures d'attente (ne remplacent pas la mise à jour)
session.upload_progress.enabled = 0   ; 109619 et troisième faille (115560)
post_max_size = 8M                    ; 109618 : limiter la taille des envois au strict nécessaire
session.use_strict_mode = 1           ; refuse les identifiants de session inventés
session.serialize_handler = php       ; le MÊME réglage partout, aucun mélange par dossier

Avec PHP-FPM, imposer aussi le réglage dans chaque pool, pour qu'aucun site ne puisse le réactiver : php_admin_flag[session.upload_progress.enabled] = off. Red Hat recommande en complément de réduire post_max_size et de garder un memory_limit borné (jamais -1) : ces réglages limitent la 109618 sans la corriger. Adapter post_max_size si vos sites reçoivent des fichiers plus lourds.

Le suivi de progression des envois n'est utilisé que par de rares interfaces d'envoi de fichiers avec barre de progression côté serveur. Pour la plupart des sites, le désactiver n'a aucun effet visible. Redémarrer PHP-FPM ou Apache ensuite.

Pourquoi uniformiser le serialize_handler

Un dépôt de recherche publié après les correctifs affirme qu'une chaîne liée à la faille mémoire contourne la désactivation de session.upload_progress lorsque deux dossiers d'un même pool PHP-FPM utilisent des session.serialize_handler différents, et que l'application contient une classe exploitable (des bibliothèques courantes sont citées). Cette affirmation n'est pas confirmée par une seconde source. Mesure simple et sans risque : un seul réglage pour tout le pool, et vérifier qu'aucun .user.ini ou .htaccess ne le change localement.

bash
# réglages de session modifiés localement dans les sites
grep -rIE 'serialize_handler|upload_progress' --include=.user.ini --include=.htaccess /var/www 2>/dev/null
grep -rIE 'serialize_handler|upload_progress' /etc/php-fpm.d /etc/php/*/fpm/pool.d 2>/dev/null

Filtrer avec un pare-feu applicatif

Plusieurs éditeurs ont publié des règles dédiées : CrowdSec (crowdsecurity/vpatch-CVE-2026-109618 et -109619, en ligne avant même les correctifs), Cloudflare, Check Point, Sophos, Fortinet, ainsi que des règles ModSecurity et Suricata partagées dans des dépôts communautaires. Un filtre ne voit le contenu d'une requête HTTPS que là où elle est déchiffrée : sur le reverse proxy, ou avec une inspection HTTPS.

09Détecter une intrusion

Quatre endroits à regarder : les journaux, les fichiers, les processus et le réseau.

1 · Requête piégée formulaire multipart géant 2 · Commande exécutée avec les droits du serveur web 3 · Porte dérobée webshell, charge dans /tmp 4 · Rebond secrets, base, réseau interne erreurs mémoire PHP,plantages de processus sh, curl, wget lancéspar apache / www-data .php dans uploads/,fichiers x1, p1, nfs connexion sortante versun serveur de commande
Chaque étape laisse une trace différente. En gris : où la chercher.

1. Journaux web et PHP

bash
# outils connus : user-agents et URL (seuls éléments présents dans les journaux d'accès)
zgrep -hiE 'php2shell|php-session-startup-rce-poc|sess_p2sopchain' \
  /var/log/httpd/*access* /var/log/nginx/*access* /var/log/apache2/*access* 2>/dev/null | tail -50

# rafales d'erreurs mémoire caractéristiques de la faille 109618
zgrep -hE 'Allowed memory size.*rfc1867|Unknown on line 0|Failed to decode session object' \
  /var/log/php-fpm/* /var/log/php*-fpm.log /var/log/httpd/*error* /var/log/apache2/*error* /var/log/nginx/*error* 2>/dev/null | tail -50

# plantages de processus PHP (segfault) dans le journal noyau (journal persistant requis)
journalctl _TRANSPORT=kernel --since '2026-10-17' | grep -iE '(php|httpd|apache2).*segfault|segfault.*(php|httpd|apache2)' | tail
Les marqueurs d'exploit (frontières multipart, preuves d'exécution) sont dans le corps des requêtes, que les journaux d'accès n'enregistrent pas : on les retrouve dans les sessions PHP, les captures réseau ou les journaux d'un pare-feu applicatif.

2. Fichiers déposés

bash
# PHP récent dans les dossiers d'envoi (emplacement typique d'un webshell)
find /var/www -xdev -type f -name '*.ph*' -newermt 2026-10-17 \
  \( -path '*/upload*' -o -path '*/images/*' -o -path '*/files/*' -o -path '*/cache/*' \) -ls

# images contenant du code PHP
grep -rlaE '<\?php|eval\(' --include='*.jpg' --include='*.jpeg' --include='*.png' --include='*.gif' --include='*.webp' /var/www 2>/dev/null

# fichiers de preuve laissés par les outils d'attaque et charges connues
find /tmp /var/tmp /dev/shm -xdev \( -name x1 -o -name p1 -o -name nfs -o -name mountpoint -o -name cCmono \) -ls
ls -la /var/www/p1 /var/www/html/p1 2>/dev/null   # tentatives d'écriture observées sur les leurres

# sessions PHP contenant du code
grep -rlE '<\?php|system\(|base64_decode' /var/lib/php/session* /tmp/sess_* /tmp/systemd-private-*/tmp/sess_* 2>/dev/null
Piège systemd : sur RHEL 7 et suivantes, httpd et PHP-FPM ont souvent leur propre /tmp, rangé dans /tmp/systemd-private-*/tmp/. Une charge déposée « dans /tmp » par l'attaquant s'y trouve : chercher aussi dans ces dossiers.

3. Processus

bash
# shells et outils réseau lancés par le compte du serveur web
ps -eo user,pid,ppid,lstart,cmd --forest | grep -E '^(apache|nginx|www-data)' \
  | grep -E '(^|[ /])(sh|bash|dash|curl|wget|python[0-9.]*|perl|nc|ncat|socat)( |$)'

# programmes exécutés depuis /tmp ou dont le fichier a été supprimé
ls -l /proc/[0-9]*/exe 2>/dev/null | grep -E '/tmp/|/dev/shm/|\(deleted\)'
Avec des pools PHP-FPM par utilisateur (cPanel, Plesk), adapter les comptes du premier filtre. La mention (deleted) apparaît aussi pour tout processus non redémarré après une mise à jour : à recouper.

4. Réseau

bash
# connexions ouvertes par PHP ou Apache vers autre chose que les visiteurs (hors ports 80/443 locaux)
ss -tnp state established '( not sport = :80 and not sport = :443 )' | grep -E 'httpd|apache2|php-fpm'
# connexions vers les serveurs de commande du botnet Potassium
ss -tn dst 134.199.154.64 ; ss -tn dst 117.55.202.115
Les connexions vers la base de données, Redis ou une API métier sont légitimes : c'est une destination inconnue sur Internet qui doit alerter. Un curl lancé par l'attaquant apparaît sous son propre nom : le contrôle des processus le repère.
Surveillance continue : auditd et règle Sigma

Une règle auditd trace en temps réel tout programme lancé par le compte du serveur web. C'est le signal le plus fiable d'une exécution de commande, quelle que soit la variante d'exploit.

auditd
# /etc/audit/rules.d/php2shell.rules  (remplacer 48 par l'UID réel : id -u apache)
# (Debian : www-data = 33)
-a always,exit -F arch=b64 -S execve -F uid=48 -k php2shell_exec
-a always,exit -F arch=b32 -S execve -F uid=48 -k php2shell_exec
-a always,exit -F arch=b64 -S memfd_create -F uid=48 -k php2shell_memfd
# puis : augenrules --load ; recherche : ausearch -k php2shell_exec -i

Prévoir du volume si l'application lance des programmes de façon légitime (envoi d'e-mails, traitement d'images) : repérer ces commandes habituelles les premiers jours.

La CISA a publié le 23 octobre une règle Sigma pour la détection côté journaux. Côté réseau, des règles Suricata et Zeek partagées dans des dépôts communautaires repèrent le champ PHP_SESSION_UPLOAD_PROGRESS associé à des corps multipart anormalement volumineux.

Si vous trouvez quelque chose : ne pas éteindre le serveur (la mémoire et les processus sont des preuves), l'isoler du réseau, conserver les journaux, prévenir votre équipe ou votre prestataire de réponse à incident, puis reconstruire plutôt que nettoyer.

10Indicateurs de compromission

Les indicateurs publiés par les chercheurs et éditeurs, triés par force du signal. Une connexion sortante vers l'infrastructure d'attaque vaut compromission ; une requête entrante d'un scanner, une simple tentative.

Télécharger la liste (.txt)   Télécharger avec sources (.csv)

Infrastructure d'attaque · signal fort

IndicateurRôleSource
15.204.59.70Intrusions confirmées sur serveurs leurres, rappel :8081/ok33Honeypots A. Karimi
162.35.99.94Intrusions confirmées (32 shells), rappel :8080/pwn-*Honeypots A. Karimi
92.118.112.100Hébergement des charges (/nfs, /nfs-setup, /mountpoint)Sophos, Arctic Wolf
134.199.154.64Serveur de commande du botnet PotassiumSophos, ELLIO
117.55.202.115Serveur de commande PotassiumSophos
89.32.41.16 · 89.32.41.50Hébergement des binaires du botnetHunt.io
206.188.197.105Serveur d'outils et d'exploitation de masseSOCRadar, Hunt.io
45.115.26.26Charge :8000/cCmonoArctic Wolf
41.223.30.7 · 102.210.149.166 · 122.10.17.49 · 122.10.110.72 · 58.221.60.160 · 157.230.117.70 · 104.219.251.31 · 107.150.31.151Serveurs exposant des outils PHP2Shell (dossiers ouverts)Hunt.io
124.221.46.164 · 122.10.130.72Écouteurs et charges d'exploitation exposésCybersecurity News

Domaines, empreintes et réseau

IndicateurTypeSource
godofthunder.st (thunder.)Serveur de commande du botnetSophos, Hunt.io
botlesscucks.st · gettingheadfromduckysmom.stDomaines du botnetSophos, Hunt.io
maste.mangsud.orgTéléchargement de webshellsHunt.io
0c5486f06620e26e316f4b33f318b0d646d5e1133789331aa2fed012360d1486SHA-256, binaire PotassiumSophos, Arctic Wolf
e2529d4afa39ae4db2eb05d5176317c906289abf09660c75bdeec43e54c55aa3SHA-256, charge liéeArctic Wolf
b61a098fc62a2c2696e196dca78da71aMD5, binaire PotassiumSophos
TCP 50217 à 52645Ports de commande du botnet (14 ports, dont 50792)ELLIO

Marqueurs dans les requêtes et sur le système · signal moyen

IndicateurOù le chercher
php2shell-scan/109618 · php2shell-109618 · php-session-startup-rce-pocUser-agent des journaux web
B7kQpoc618 · CCCCCCCCCCFrontière multipart (corps des requêtes : pare-feu applicatif, capture réseau)
PHP2SHELL_CONFIRMED · RCE_noyzzg0YVLBU · JACKALPOCPreuve d'exécution de commande (journaux, sessions)
P2SMARK · P2SFNAME · P2SVALUE · P2SOP- · sess_p2sopchainMarqueurs d'outils de scan, sessions PHP
/tmp/x1 · /tmp/nfs · /var/www/p1 · /var/www/html/p1Fichiers de preuve et charges sur le disque (écritures dans /var/www tentées sur les leurres)
Allowed memory size … rfc1867.c · Unknown on line 0Journaux d'erreurs PHP (rafales = tentative)
Scanners connus (tentatives entrantes) et précautions d'usage

Sources de tentatives : 45.198.224.0/24, 85.11.167.243, 204.76.203.7, 5.175.189.76, 217.60.242.76, 144.48.4.242, 221.14.159.134, 87.121.84.174, 181.215.186.252, 185.196.220.132, 185.161.210.29, 152.233.51.69, 45.134.225.16, 107.189.14.87, 193.47.62.24, 103.147.220.17, ainsi que les listes d'Amazon et d'ELLIO (fichier téléchargeable). Les 55 adresses publiées par CYFIRMA sont des nœuds soupçonnés, possiblement eux-mêmes compromis : à chercher dans vos journaux, pas à présumer hostiles.

Précautions : Amazon recommande d'enquêter sur ses adresses plutôt que de les bloquer, car certaines relèvent d'infrastructures d'anonymisation partagées. Ne pas bloquer 134.154.64.199, leurre appartenant à une université. Les adresses d'infrastructures d'anonymisation connues sont signalées « enquêter, ne pas bloquer » ; les serveurs de laboratoires de recherche et d'audits cités dans les rapports sont exclus de nos listes. Un indicateur vieillit vite : une adresse propre aujourd'hui peut servir demain.

11Questions fréquentes

Mon site WordPress est à jour, suis-je protégé ?

Non. La faille est dans PHP, qui s'exécute avant WordPress. Il faut un PHP corrigé (ou un hébergeur qui l'a corrigé), quelle que soit la version de WordPress.

Je suis sur un hébergement mutualisé, dois-je faire quelque chose ?

Les grands hébergeurs français ont corrigé, souvent jusqu'aux anciennes versions. Vérifiez la version de PHP de votre site dans l'interface et passez sur une version maintenue (8.3 ou plus) si vous le pouvez.

Désactiver session.upload_progress casse-t-il mon site ?

Très rarement. Cette option ne sert qu'aux barres de progression d'envoi gérées côté serveur, peu utilisées. Testez sur un environnement de recette si vous avez un doute.

J'ai mis à jour PHP, c'est fini ?

Presque : redémarrez PHP-FPM ou Apache, vérifiez la version réellement servie, puis cherchez une compromission antérieure si le serveur était exposé depuis le 17 octobre, et renouvelez les secrets.

Mon application ne fonctionne qu'en PHP 5 ou 7, que faire ?

À court terme : réduire l'exposition (accès restreint, pare-feu applicatif, coupure d'Internet si possible) ou souscrire un support étendu payant. À moyen terme, il n'y a pas d'autre issue que la migration ou la réécriture.

Un pare-feu applicatif suffit-il ?

Non, il fait gagner du temps. Il bloque les attaques connues, mais une variante inédite peut passer. Il complète la correction, il ne la remplace pas.

Ma version affiche 7.4 mais mon hébergeur dit qu'elle est corrigée, qui croire ?

Les deux peuvent être vrais : les distributions et hébergeurs corrigent souvent sans changer le numéro de version. Seul le paquet installé, comparé à l'avis de sécurité du fournisseur, fait foi.

Besoin d'y voir clair sur votre exposition ?

Inventaire de vos serveurs PHP exposés, versions réelles, priorités de correction : FactualRisk et Digimoove vous accompagnent.

Découvrir l'Agent Vigie

12Sources

Ce guide est mis à jour au fil des publications. Les informations datent du 27 octobre 2026 ; un indicateur ou un état de correctif peut avoir évolué depuis. Vérifiez toujours auprès de l'éditeur de votre distribution.