
Dépôt pour la recherche d'exposition PHP2Shell et les analyses associées
Chasse aux expositions dans Defender XDR pour PHP2Shell (CVE-2026-109618 / CVE-2026-109619).
v3.3 · 22 oct. 2026
Objectif : Identifier les appareils intégrés exécutant activement PHP et susceptibles d'être exposés à PHP2Shell.
Périmètre : Chasse avancée Defender XDR · points de terminaison Windows et Linux intégrés · fenêtre d'analyse de 30 jours par défaut · PHP actif uniquement. Non couvert : installations dormantes et appareils non gérés. Non exécutable dans Sentinel, car la table des logiciels installés (TVM) n'est interrogeable que dans Defender XDR.
| Chasse | Windows | Linux | Question |
|---|---|---|---|
| 1 | windows/01-any-php.kql | linux/01-any-php.kql | Du PHP ? Oui/non par appareil. |
| 2 | windows/02-evidence-breakout.kql | linux/02-evidence-breakout.kql | Extraction des preuves avec les versions. |
| 3 | windows/03-safety-net.kql | linux/03-safety-net.kql | Filet de sécurité : appareils servant sur des ports web, processus en écoute et statut PHP. |
Toutes les vérifications d'événements utilisent une seule fenêtre d'analyse, let Lookback = 30d; en tête de chaque chasse. Les adresses IP proviennent du dernier rapport par adaptateur sur les 7 derniers jours. Les logiciels installés correspondent à l'instantané TVM actuel. Seuls les points de terminaison intégrés sont vérifiés (OnboardingStatus == "Onboarded", DeviceCategory == "Endpoint").
Un appareil est considéré comme PHP détecté si l'une de ces conditions est remplie.
Mode de correspondance des noms :
^…$), elle doit donc correspondre au nom de fichier complet, jamais à une partie.startswith "php", plus frankenphp sur les deux OS et lsphp sur Linux. La regex ne s'exécute ensuite que sur ce qui reste.php9.dll) correspondent automatiquement.patterns.test.js exécute chaque regex sur ces exemples. Si vous modifiez une regex, mettez à jour les exemples correspondants.Windows
| Vérification | Table | Correspondances | Pourquoi c'est important |
|---|---|---|---|
| Exécutables PHP démarrés | DeviceProcessEvents | Regex ^(php(-cgi|-win)?|frankenphp)\.exe$, qui autorise exactement quatre noms : php.exe (CLI), php-cgi.exe (worker FastCGI), php-win.exe (CLI, sans console), frankenphp.exe (PHP intégré dans un serveur web). phpstorm64.exe et les autres outils php* ne correspondent pas | Prouve que PHP s'est exécuté. La chasse 2 affiche la version à partir des informations de version du binaire (ProcessVersionInfoProductVersion) |
| DLL du moteur PHP chargées | DeviceImageLoadEvents | Regex ^php\d*(ts|isapi|apache[\w_]*)?\.dll$ : php, un numéro de version éventuel, un suffixe facultatif ts / isapi / apache…, puis .dll. Les exemples figurent dans le tableau des DLL ci-dessous. Les DLL d'extension (php_curl.dll et autres php_*.dll) ne correspondent pas, car le tiret bas n'est pas autorisé juste après php | Le seul moyen de voir PHP s'exécuter dans un autre processus, tel qu'IIS ou Apache, où aucun php*.exe ne démarre. La chasse 2 affiche la DLL et le processus qui l'a chargée |
| Logiciels installés | DeviceTvmSoftwareInventory | Pas une regex : SoftwareName has "php" (php en tant que mot entier dans le nom) ou SoftwareVendor =~ "php" (exact, insensible à la casse) | Détecte les installations enregistrées. Les installations par zip (la méthode Windows habituelle) ne s'enregistrent généralement pas |
Exemples de DLL du moteur PHP correspondant au motif Windows
| DLL | Ce que c'est | Processus hôte typique (affiché dans la chasse 2) |
|---|---|---|
php8.dll, php7.dll | Moteur, build non thread-safe | php-cgi.exe (FastCGI sous IIS, nginx ou Apache mod_fcgid), php.exe |
php8ts.dll, php7ts.dll, php5ts.dll | Moteur, build thread-safe | httpd.exe (module Apache), php.exe |
php8apache2_4.dll, php7apache2_4.dll, php5apache2_2.dll | Chargeur de module Apache | httpd.exe |
php5isapi.dll | Module IIS ISAPI hérité (PHP 5.2 et antérieur, non pris en charge) | w3wp.exe |
Le tableau liste des noms courants, pas une liste d'autorisation : tout nom correspondant au motif est retenu. Le nom de la DLL ne donne que la version majeure. La version exacte provient d'une ligne de processus php-cgi.exe ou php.exe, ou des logiciels installés, sur le même appareil.
Linux
| Vérification | Table | Correspondances | Pourquoi c'est important |
|---|---|---|---|
| Binaires PHP démarrés | DeviceProcessEvents | Regex ^(php[\d.]*|php-(fpm|cgi)[\d.]*|lsphp[\d.]*|frankenphp)$ : php, php-fpm, php-cgi ou lsphp (LiteSpeed), chacun avec une version facultative composée de chiffres et de points, plus frankenphp. Exemples : php, php8.3, php83, php-fpm8.3, php-cgi8.2, lsphp83. Des outils comme phpunit, phpize et php-config ne correspondent pas, car seuls des chiffres et des points peuvent suivre le nom de base | Prouve que PHP a été exécuté. La chasse 2 affiche un indice majeur.mineur, extrait du nom, du chemin ou de la ligne de commande par une seconde regex, php-?(?:fpm|cgi)?/?(\d+\.\d+) (par exemple php-fpm8.3 ou /etc/php/8.3/ donne 8.3.x) |
| Paquets installés | DeviceTvmSoftwareInventory | Pas une regex : SoftwareName contains "php" (sous-chaîne, donc les noms versionnés comme php8.3-fpm et libapache2-mod-php8.3 correspondent) ou SoftwareVendor =~ "php" | La seule vérification pour Apache mod_php et pour php-fpm en cours d'exécution depuis avant la fenêtre : Linux n'a pas de vérification de chargement de bibliothèque ici, et les workers php-fpm forked ne créent pas de démarrages de processus |