Aller au contenu principal

Développement Web

Failles PHP CVE-2026-109618 et 109619 : quelle version installer sur Drupal

EN BREF

  • Le 21 octobre 2026, le projet PHP a publié les versions 8.5.12, 8.4.27, 8.3.36 et 8.2.35 pour corriger CVE-2026-109618 et CVE-2026-109619, deux failles critiques (CVSS v4.0 9,2) d'exécution de code à distance sans authentification.
  • Toute installation PHP qui sert des requêtes web est concernée, donc tous les sites Drupal : PHP-FPM, php-cgi, FrankenPHP, LiteSpeed et surtout Apache avec mod_php, le plus exposé.
  • Sur Drupal 11, installer PHP 8.3.36, 8.4.27 ou 8.5.12 ; sur Drupal 10.6, PHP 8.3.36 est la cible recommandée car elle prépare Drupal 11.
  • PHP 8.1 n'a aucune version officielle corrigée : un Drupal 10 en PHP 8.1 doit passer en PHP 8.3 ou utiliser un paquet rétroporté par sa distribution.
  • La version à vérifier est celle du rapport d'état Drupal (/admin/reports/status), pas celle du terminal, et tous les workers PHP doivent être redémarrés après la mise à jour.
  • Selon le projet PHP, aucune atténuation n'est complète : la mise à jour est la seule option sûre.

Quelle version de PHP installer selon votre version de Drupal

La réponse tient en une règle : restez sur une branche PHP maintenue et acceptée par votre version de Drupal, au minimum au niveau du correctif du 21 octobre 2026. Voici la correspondance, établie à partir de la matrice de compatibilité PHP de Drupal et de l'avis de sécurité PHP.

Drupal 11 (11.3 et 11.4)

  • PHP 8.3 : installer 8.3.36 ou plus. Branche en correctifs de sécurité uniquement, choix sûr pour un site en production.
  • PHP 8.4 : installer 8.4.27 ou plus. Branche en support actif, notre recommandation par défaut sur Drupal 11.
  • PHP 8.5 : installer 8.5.12 ou plus. Acceptée par Drupal 11.3 et 11.4, à réserver aux sites dont les modules contribués sont validés sur 8.5.
  • PHP 8.2 et inférieur : sans objet, Drupal 11 exige PHP 8.3 au minimum.

Drupal 10 (10.6)

  • PHP 8.3 : installer 8.3.36 ou plus. C'est la cible que nous recommandons, car c'est aussi le minimum de Drupal 11.
  • PHP 8.4 : installer 8.4.27 ou plus. Possible, à condition que tous les modules contribués suivent.
  • PHP 8.2 : installer 8.2.35. Corrigé aujourd'hui, mais la branche 8.2 sera en fin de vie le 31 décembre 2026.
  • PHP 8.1 : aucune version officielle corrigée. C'est le cas délicat, détaillé ci-dessous.
  • PHP 8.5 : non supporté par Drupal 10.

Drupal 10.5 et versions plus anciennes

Drupal 10.5 ne reçoit plus de correctifs de sécurité depuis le 17 juin 2026. Mettez d'abord à jour le core en 10.6, puis appliquez la règle ci-dessus. Un Drupal 7, 8 ou 9 tournant encore sur PHP 7.4 ou 8.0 cumule un core et un PHP sans support : la seule issue durable est une migration vers Drupal 11.

Ces numéros sont ceux du projet PHP. Si votre serveur utilise les paquets de sa distribution Linux (Debian, Ubuntu, RHEL et dérivés), le correctif peut être rétroporté dans un paquet qui affiche toujours un ancien numéro de version : c'est le changelog du paquet, et la mention des deux CVE, qui fait foi.

Drupal 10 en PHP 8.1 : pourquoi c'est le cas délicat

Oui, un site Drupal 10 en PHP 8.1 est vulnérable, et il n'existe aucune version officielle de PHP 8.1 corrigée. Les branches 7.4, 8.0 et 8.1 ne sont plus maintenues par le projet PHP. Vu la gravité des failles, l'équipe sécurité de PHP a tout de même publié des rétroportages minimaux, mais uniquement sous forme de code source sur GitHub, à compiler soi-même.

Il reste trois issues réalistes, par ordre de préférence :

  • Passer en PHP 8.3.36, accepté par Drupal 10.6. C'est la meilleure option, car elle prépare la migration vers Drupal 11 qui exige PHP 8.3 au minimum : le travail de compatibilité (modules contribués, code personnalisé, composer.json) est fait une fois pour toutes.
  • Installer un paquet PHP 8.1 rétroporté par votre distribution ou par un fournisseur de support étendu. Ubuntu, Debian LTS, RHEL et les dépôts tiers maintenus ont reçu les correctifs en avance. Vérifiez la mention des CVE-2026-109618 et CVE-2026-109619 dans le changelog du paquet installé.
  • Compiler PHP 8.1 depuis les branches de rétroportage publiées sur GitHub. À réserver aux équipes qui savent maintenir un PHP compilé dans la durée.

Le passage de 8.1 à 8.3 n'est pas qu'un changement de paquet. Les points que nous vérifions systématiquement en TMA :

  • La contrainte config.platform.php de composer.json, souvent figée à 8.1 et qui bloque la résolution des dépendances.
  • Les modules contribués abandonnés ou figés sur une ancienne version, qui déclenchent des dépréciations voire des erreurs fatales en 8.3.
  • Le code personnalisé : propriétés dynamiques (dépréciées depuis PHP 8.2), appels à des fonctions retirées.
  • La version de PHP du CLI et du cron, à aligner sur celle du serveur web pour que Drush et les tâches planifiées tournent dans le même environnement.
# Vérifier quels paquets bloqueraient PHP 8.3 (à lancer depuis la racine du projet)
composer why-not php 8.3

# Simuler la résolution des dépendances avec la nouvelle plateforme
composer config platform.php 8.3.36
composer update --dry-run

Drupal 10 en PHP 8.2 : deux échéances en décembre 2026. PHP 8.2.35 corrige les failles, mais la branche 8.2 sera en fin de vie le 31 décembre 2026, et Drupal 10 le 9 décembre 2026. Mettre à jour en 8.2.35 aujourd'hui règle l'urgence ; planifier dès maintenant PHP 8.3 puis Drupal 11 évite de revivre la même situation dans deux mois sans aucun correctif disponible.

Les failles PHP du 21 octobre 2026 en chiffres

9,2
Score CVSS v4.0 de CVE-2026-109618 et de CVE-2026-109619
Exécution de code à distance sans authentification
4
Versions corrigées publiées par le projet PHP
8.5.12, 8.4.27, 8.3.36 et 8.2.35
9 déc. 2026
Fin de vie de Drupal 10, branche 10.6 comprise
31 déc. 2026
Fin de vie de PHP 8.2, plus aucun correctif de sécurité ensuite

Comment vérifier la version de PHP de votre site Drupal

Le piège le plus fréquent : vérifier la version de PHP dans le terminal et conclure que le site est à jour. Sur un même serveur cohabitent souvent plusieurs PHP, et le CLI n'est pas forcément celui qui sert vos pages.

La version servie par le web : le rapport d'état

Dans l'administration Drupal, ouvrez Rapports › Rapport d'état (/admin/reports/status). La ligne « PHP » affiche la version exécutée par le serveur web, c'est-à-dire celle qu'un attaquant atteint. C'est elle qui compte.

La version du CLI : Drush

# Version de PHP utilisée par Drush (le CLI), pas forcément celle de PHP-FPM
vendor/bin/drush php:eval 'echo PHP_VERSION, PHP_EOL;'

Si le rapport d'état affiche 8.3.30 et Drush 8.3.36, votre site n'est pas corrigé : le CLI a été mis à jour, pas le pool PHP-FPM ou le module Apache.

Sur le serveur : le paquet et son changelog

# Debian / Ubuntu : version et historique du paquet PHP-FPM installé
dpkg -l | grep -E 'php8\.[1-5]-(fpm|cli)|libapache2-mod-php'
apt changelog php8.3-fpm | grep -m5 -E 'CVE-2026-10961[89]'

# RHEL, AlmaLinux, Rocky Linux
rpm -q --changelog php-fpm | grep -m5 -E 'CVE-2026-10961[89]'

Si le changelog mentionne les deux CVE, le paquet est corrigé, quel que soit le numéro de version affiché. En hébergement mutualisé ou en PaaS, vous n'avez pas la main sur ce niveau : demandez à votre hébergeur une confirmation écrite que la version de PHP qui sert votre site intègre les correctifs, et à quelle date les workers ont été redémarrés.

Mettre à jour PHP et redémarrer tous les workers

Installer le paquet ne suffit pas. Un worker PHP-FPM ou un processus Apache démarré avant la mise à jour continue d'exécuter l'ancien binaire chargé en mémoire, potentiellement pendant des jours. Le redémarrage fait partie du correctif.

# Debian / Ubuntu avec PHP-FPM (adapter le numéro de branche)
sudo apt update && sudo apt install --only-upgrade 'php8.3-*'
sudo systemctl restart php8.3-fpm

# Apache avec mod_php : c'est Apache qui embarque PHP
sudo systemctl restart apache2   # httpd sur RHEL et dérivés

# Contrôle : tous les processus doivent avoir démarré après la mise à jour
ps -o pid,lstart,cmd -C php-fpm8.3

Quelques cas que l'on oublie :

  • Plusieurs branches installées côte à côte (par exemple php8.1-fpm et php8.3-fpm) : chaque service doit être mis à jour et redémarré, y compris celui d'un ancien site que l'on croyait éteint.
  • Docker : reconstruire l'image sur une image de base PHP corrigée puis redéployer ; mettre à jour le conteneur en place ne survit pas au prochain déploiement.
  • FrankenPHP et LiteSpeed : PHP est embarqué dans le serveur, c'est le binaire du serveur qu'il faut mettre à jour. Voir notre retour sur Drupal 11 avec FrankenPHP et Docker.
  • Après le redémarrage, revenir au rapport d'état Drupal : c'est la seule vérification qui prouve que la version servie a changé.

Ce que corrigent CVE-2026-109618 et CVE-2026-109619, et pourquoi mod_php est le plus exposé

Les deux failles, surnommées « PHP2Shell », se situent dans le moteur PHP lui-même, pas dans Drupal. Elles se déclenchent avant que la moindre ligne de Drupal ne s'exécute : aucun module de sécurité, aucun pare-feu applicatif côté Drupal ne peut les intercepter. Le projet PHP considère comme concernées toutes les installations qui servent des requêtes web : PHP-FPM, Apache avec mod_php, php-cgi, FrankenPHP et LiteSpeed.

CVE-2026-109618 : un dépassement mémoire pendant l'initialisation de la requête

Quand PHP manque de mémoire, il interrompt brutalement la requête. Pendant l'analyse automatique du corps d'une requête (formulaires multipart, téléversements), certaines structures sont encore incomplètes à ce moment-là ; la phase de nettoyage les traite ensuite comme valides. Un attaquant peut provoquer ce dépassement avec une requête multipart forgée qui reste sous les limites apparentes, par exemple sans Content-Length exploitable ou avec un grand nombre d'en-têtes par partie. Détails dans l'avis GHSA de CVE-2026-109618.

CVE-2026-109619 : un état qui survit d'une requête à l'autre dans le même worker

Un worker PHP sert de nombreuses requêtes successives. Si une erreur fatale ou un dépassement de temps d'exécution interrompt une requête avant la remise à zéro de certains états globaux, ceux-ci pointent vers une mémoire déjà libérée. La requête suivante traitée par ce worker peut alors réutiliser ce pointeur. Les chemins confirmés passent par la progression de téléversement des sessions (session.upload_progress, activée par défaut) et, en PHP 8.5, par les traces d'erreurs fatales. Détails dans l'avis GHSA de CVE-2026-109619.

Pourquoi Apache avec mod_php est le cas le plus grave

Avec mod_php, PHP exécute la phase de fin de requête même quand l'initialisation a échoué. C'est exactement ce dont la première faille a besoin : l'avis indique une exécution de code validée par HTTP contre mod_php, avec les limites par défaut et des workers en mode prefork. PHP-FPM, lui, arrête le processus enfant quand l'initialisation échoue, ce qui ferme ce chemin précis, sans rendre FPM sûr pour autant. Beaucoup de VPS installés il y a plusieurs années avec un Apache « tout-en-un » tournent encore en mod_php : c'est la première configuration à corriger.

Côté exploitation, la publication a été avancée d'un jour après la fuite des identifiants de CVE. Plusieurs acteurs (Cloudflare, watchTowr, Amazon) signalent des tentatives d'attaque depuis le 21 octobre. Au 22 octobre, aucune des deux CVE ne figurait au catalogue KEV de la CISA, mais attendre une confirmation officielle n'est pas une stratégie sur une faille de ce niveau.

Drupal 11.4.11, 11.3.20 et 10.6.20 : pourquoi le .htaccess change le même jour

Le 21 octobre 2026, Drupal a aussi publié 11.4.11, 11.3.20 et 10.6.20. Ce ne sont pas des correctifs de sécurité, mais elles modifient le fichier .htaccess : la directive php_value assert.active 0, dépréciée depuis PHP 8.3, est remplacée par php_value zend.assertions 0.

Le lien avec les failles n'est pas écrit dans les notes de version Drupal, mais il est direct. L'avis de CVE-2026-109619 cite, parmi les déclencheurs possibles, les diagnostics émis par des réglages INI appliqués à chaque requête, notamment via php_value dans un .htaccess sous mod_php. Et l'avis PHP recommande de supprimer les réglages invalides ou dépréciés appliqués par requête. Un site Drupal servi en mod_php avec l'ancien .htaccess coche précisément cette case.

Le .htaccess fait partie des fichiers d'échafaudage : selon votre configuration drupal/core-composer-scaffold, il est réécrit automatiquement à la mise à jour du core, ou conservé tel quel si vous l'avez personnalisé. Vérifiez le résultat :

  <IfModule mod_php.c>
-   php_value assert.active                   0
+   php_value zend.assertions                 0
  </IfModule>

Profitez du passage dans php.ini pour régler les assertions au niveau du serveur. La valeur -1, recommandée par Drupal en production pour les performances, ne peut pas être définie depuis un .htaccess : elle doit figurer dans php.ini ou dans la configuration du pool, avec un redémarrage.

; php.ini de production (Drupal 10.6 / 11.x)
zend.assertions = -1

Si vous ne pouvez pas mettre à jour aujourd'hui : les atténuations officielles et leurs limites

L'avis du projet PHP liste des mesures qui réduisent certains chemins d'attaque, en précisant qu'elles ne rendent pas l'installation sûre. Elles servent à tenir quelques heures ou quelques jours, le temps de planifier la mise à jour, pas à la remplacer.

Contre CVE-2026-109619

  • Désactiver session.upload_progress.enabled. Drupal n'utilise pas cette fonctionnalité pour ses propres téléversements ; vérifiez seulement qu'aucun module personnalisé ne s'appuie dessus. L'avis GHSA juge même prudent de la laisser désactivée après la mise à jour.
  • En PHP 8.5 uniquement, désactiver fatal_error_backtraces.
  • Supprimer les réglages INI dépréciés appliqués par requête, comme l'ancien assert.active du .htaccess Drupal. Masquer les messages avec display_errors ou error_reporting ne suffit pas.

Contre CVE-2026-109618

  • Abaisser post_max_size (8M sans téléversement de fichiers, 32M sinon) et garder upload_max_filesize en dessous.
  • Limiter au niveau du serveur web ou du proxy la taille des requêtes décodées, le nombre de champs, de parties multipart et d'en-têtes, y compris pour les requêtes sans Content-Length exploitable.
  • Encadrer la mémoire par une limite de conteneur ou de cgroup, jamais par RLIMIT_AS ou RLIMIT_DATA, qui peuvent justement provoquer l'échec d'allocation vulnérable.
  • L'avis mentionne aussi memory_limit=-1, imposé via php_admin_value. Sans limite de cgroup, une seule requête peut alors saturer la mémoire du serveur : ne l'appliquer qu'avec cette protection en place.

Où écrire ces réglages

Dans php.ini, dans le pool PHP-FPM ou dans la configuration Apache, c'est-à-dire un endroit lu avant l'analyse de la requête. Jamais dans un .user.ini ni via ini_set() dans settings.php : appliqués trop tard, ils ne protègent de rien. Puis redémarrer tous les workers.

; /etc/php/8.3/fpm/pool.d/www.conf (Debian / Ubuntu, adapter la branche)
php_admin_flag[session.upload_progress.enabled] = off
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 24M
; PHP 8.5 uniquement
; php_admin_flag[fatal_error_backtraces] = off

Aucune atténuation n'est complète. Le projet PHP l'écrit dans les notes de version de 8.5.12, 8.4.27, 8.3.36 et 8.2.35 : la mise à jour est la seule option sûre. Ces réglages bloquent les chemins d'attaque confirmés, pas leurs variantes.

Questions fréquentes sur les failles PHP d'octobre 2026 et Drupal

Faut-il mettre à jour Drupal pour corriger CVE-2026-109618 et CVE-2026-109619 ?

Non, les failles sont dans PHP et seule la mise à jour de PHP les corrige. La Drupal Security Team l'a rappelé dans le PSA-2026-10-20 : PHP relève de l'hébergement, pas du périmètre de Drupal. Mettre à jour le core en 11.4.11, 11.3.20 ou 10.6.20 reste utile pour corriger la directive dépréciée du .htaccess.

Mon site Drupal en PHP 8.1 est-il vulnérable ?

Oui. PHP 8.1 n'est plus maintenu et aucune version officielle corrigée n'a été publiée. Il faut soit installer un paquet rétroporté par votre distribution ou un fournisseur de support étendu, soit passer en PHP 8.3.36, accepté par Drupal 10.6 et requis par Drupal 11.

Le pare-feu applicatif de mon hébergeur suffit-il ?

Non. Un WAF peut filtrer certaines charges connues, mais Cloudflare a déjà observé des variantes conçues pour contourner ses règles. Les failles se déclenchent dans le moteur PHP avant tout code applicatif : la mise à jour de PHP et le redémarrage des workers restent indispensables.

Ma distribution affiche toujours PHP 8.3.6 après la mise à jour, est-ce normal ?

Oui, si votre distribution rétroporte les correctifs sans changer de numéro de version, comme Ubuntu ou Debian. Consultez le changelog du paquet installé : s'il mentionne CVE-2026-109618 et CVE-2026-109619, le paquet est corrigé. Vérifiez ensuite que les workers ont été redémarrés.

Mon site est en hébergement mutualisé, que dois-je faire ?

Vous n'avez pas la main sur PHP : demandez par écrit à votre hébergeur la version servie par votre site, la date d'application des correctifs et la date de redémarrage des processus PHP. Contrôlez ensuite la version affichée dans le rapport d'état Drupal.

Faut-il laisser session.upload_progress désactivé après la mise à jour ?

C'est ce que l'avis GHSA de CVE-2026-109619 juge prudent si la fonctionnalité n'est pas utilisée. Drupal core ne s'en sert pas : sauf module personnalisé qui l'exploite, vous pouvez conserver session.upload_progress.enabled = 0 en production.

Votre plan d'action cette semaine

  • Relever la version de PHP dans le rapport d'état Drupal de chaque site, pas dans le terminal.
  • Mettre à jour vers 8.5.12, 8.4.27, 8.3.36 ou 8.2.35, ou vers un paquet de distribution dont le changelog cite les deux CVE.
  • Redémarrer tous les pools PHP-FPM et Apache, puis revérifier le rapport d'état.
  • En mutualisé ou en PaaS, obtenir la confirmation écrite de l'hébergeur.
  • Mettre à jour le core Drupal en 11.4.11, 11.3.20 ou 10.6.20 et contrôler le .htaccess.
  • Pour un Drupal 10 en PHP 8.1 ou 8.2, planifier PHP 8.3 puis Drupal 11 avant le 9 décembre 2026.

Ces failles rappellent qu'un site Drupal à jour ne suffit pas si la couche en dessous ne l'est pas. Si personne ne sait aujourd'hui qui surveille PHP sur votre serveur, c'est précisément le rôle d'une maintenance applicative qui couvre le core, les modules et l'environnement d'exécution.

Découvrir notre offre de maintenance TMA Drupal · Préparer la migration vers Drupal 11 · Demander un diagnostic de votre serveur

Cyprien Prouvot

Cyprien Prouvot

Associé & Directeur Technique

Associé de l'agence, Cyprien pilote la vision technique et garantit la qualité des développements web. Il encadre les équipes internes et conseille les clients sur les choix d'architecture ou d'outils digitaux les plus pertinents. Il intervient également sur ce blog pour décrypter l'écosystème web, les tendances tech et les bonnes pratiques de conception.


Prêt ? Partez.

Que ce soit pour vous aider à faire le point sur vos besoins ou vous présenter les avantages et fonctionnalités de nos solutions, nous sommes là.
 

Back to top