
Une faille critique dans le moteur de PHP lui-même, exploitable sans authentification, avant même que le code de votre application ne s’exécute : le scénario que tout développeur redoute est devenu réalité. Le 21 octobre 2026, l’équipe de PHP a publié une version de sécurité exceptionnelle pour corriger deux vulnérabilités surnommées PHP2Shell.
Chez AXOPEN, en tant qu'experts du développement, on sait que la sécurité n'attend pas. Le 21 octobre dernier, dès l’annonce de la faille PH2Shell, nous nous sommes très vite mobilisés pour sécuriser les projets de nos clients. Maintenant que le rush est passé, faisons le point étape par étape, avec des commandes et un script que vous pouvez appliquer immédiatement sur vos projets
Le projet PHP a publié un avis de sécurité concernant deux vulnérabilités critiques, toutes deux notées 9,2 sur l'échelle CVSS (Common Vulnerability Scoring System) v4.0 :
Ces failles se situent dans le moteur de PHP, pas dans un framework (Symfony, Laravel) ou un CMS. D'après les éditeurs de sécurité, elles ont été identifiées avec l'aide d'outils d'intelligence artificielle, puis corrigées en coordination avec la PHPLangage de programmation s’exécutant côté serveur et permettant la création dynamique de pages web ou d'APIs. Foundation. Leurs détails ayant fuité avant la date prévue, la publication a été avancée, et des tentatives d'exploitation ont été observées. L'agence américaine CISA recommande une mise à jour immédiate.
Les versions corrigées sont :
| Branche | Version corrigée |
|---|---|
| PHP 8.5 | 8.5.12 |
| PHP 8.4 | 8.4.27 |
| PHP 8.3 | 8.3.36 |
| PHP 8.2 | 8.2.35 |
Note : le projet PHP précise qu'il n'existe pas de solution de contournement complète. Seule la mise à jour règle le problème.
Selon l'avis officiel, toutes les installations de PHP qui servent des requêtes web sont concernées : PHP-FPM, Apache avec mod_php, php-cgi, FrankenPHP et LiteSpeed. Le risque est jugé le plus élevé avec mod_php. Si PHP ne sert que des commandes en ligne (tâches planifiées, workers), l'exposition directe est moindre, mais mettez-le à jour dans la foulée.
Pour connaître la version exacte utilisée par votre conteneur :
docker compose exec php php -v
Les versions PHP 8.1 et antérieures ne reçoivent plus de correctifs du projet. Seuls certains fournisseurs de support à long terme proposent des correctifs rétroportés : contactez le vôtre, ou migrez vers une version maintenue.
Étape 1 : reconstruire l'image
Si votre Dockerfile part d'une image officielle comme php:8.4-fpm, il faut forcer le téléchargement de la dernière version de l'image PHP et ignorer le cache :
docker compose build --pull --no-cache php
docker compose up -d php
Étape 2 : vérifier le résultat
docker compose exec php php -v
La sortie doit afficher une version égale ou supérieure à celles du tableau (par exemple PHP 8.4.27). Si ce n'est pas le cas, vérifiez que le tag de votre image pointe bien vers la dernière version, ou fixez-le explicitement (par exemple php:8.4.27-fpm).
Attention : si vous utilisez les paquets de votre distribution Linux, la version affichée peut rester inchangée malgré le correctif, car les éditeurs rétroportent souvent les corrections. Consultez alors le journal des changements du paquet.
La magie : plutôt que de vérifier à la main, faites bloquer votre pipeline si la version de PHP est trop ancienne. Créez le fichier bin/check-php-security.php :
<?php
// Versions minimales corrigées (avis de sécurité du 21 octobre 2026)
const PATCHED_VERSIONS = [
'8.5' => '8.5.12',
'8.4' => '8.4.27',
'8.3' => '8.3.36',
'8.2' => '8.2.35',
];
$branch = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;
if (!isset(PATCHED_VERSIONS[$branch])) {
fwrite(STDERR, sprintf(
"PHP %s : branche non maintenue. Vérifiez le correctif auprès de votre fournisseur ou migrez.\n",
PHP_VERSION
));
exit(1);
}
if (version_compare(PHP_VERSION, PATCHED_VERSIONS[$branch], '<')) {
fwrite(STDERR, sprintf(
"PHP %s vulnérable : mettez à jour vers %s ou supérieur.\n",
PHP_VERSION,
PATCHED_VERSIONS[$branch]
));
exit(1);
}
echo sprintf("PHP %s : version corrigée.\n", PHP_VERSION);
Testez-le en local :
docker compose exec php php bin/check-php-security.php
Puis ajoutez un job à votre pipeline, ici au format GitLab CI. Il doit s'exécuter dans l'image de votre application, et non dans une image générique :
check-php-security:
stage: test
image: mon-registre/mon-app:$CI_COMMIT_SHA
script:
- php bin/check-php-security.php
Le script renvoie un code d'erreur si la version est vulnérable : le déploiement s'arrête avant d'atteindre la production.
Le projet PHP liste des mesures qui réduisent l'exposition à certains chemins d'attaque, sans rendre l'installation sûre. À appliquer dans la configuration du serveur (php.ini ou pool PHP-FPM), et non avec ini_set() :
; php.ini : puis redémarrer tous les processus PHP
session.upload_progress.enabled = 0
; PHP 8.5 uniquement
fatal_error_backtraces = 0
; Pool PHP-FPM : valeurs non modifiables par les applications
php_admin_value[memory_limit] = -1
php_admin_value[post_max_size] = 8M
Avec memory_limit illimité, limitez les ressources au niveau du conteneur pour éviter qu'un processus n'épuise la machine. Si votre application a besoin d'envois de fichiers, l'avis recommande une limite post_max_size de 32 Mo plutôt que 8 Mo.
Cet incident montre que la sécurité ne s'arrête pas au code de votre application : le moteur qui l'exécute compte autant.
Envie de passer au niveau supérieur ? Profitez de cette mise à jour pour planifier la migration de vos projets vers PHP 8.4 ou 8.5, et ajoutez dès maintenant le script de vérification à votre pipeline ! Et si vous avez besoin d’aide, n’hésitez pas à nous contacter.
L’objectif de cet article est de montrer comment correctement répliquer des sessions PHP dans une application PHP distribuée entre n noeud.
Découvrez le rôle stratégique des DTO dans l'optimisation des échanges de données et la performance de vos applications. Notre guide complet vous explique en détail leur définition et leurs avantages pour une architecture logicielle moderne.
Il s’agit d’un modèle d’architecture qui s’appuie sur les concepts d’architecture centralisée (un core model partagé par toute une organisation) et d’architecture spécifique (des fonctionnalités spécifiques à un domaine sont implémentés afin de répondre à