Contexte et portée

Les versions PHP 8.5.12, 8.4.27, 8.3.36 et 8.2.35 viennent d’être publiées pour combler deux failles classées critiques (CVE‑2026‑109618 et CVE‑2026‑109619). Les deux vulnérabilités permettent une exécution de code à distance (RCE) sans authentification, ce qui rend chaque installation PHP exposée aux requêtes HTTP, que ce soit via PHP‑FPM, Apache mod_php, php‑cgi, FrankenPHP ou LiteSpeed. Le risque est jugé le plus élevé pour le module mod_php, où un exploit démontré peut être déclenché avant même le chargement du code applicatif.

Mécanismes des vulnérabilités

La première faille (CVE‑2026‑109618) exploite une corruption de mémoire lors d’une situation d’« out‑of‑memory » (OOM). Lorsque PHP interrompt une requête parce que l’allocation échoue, les structures internes de la requête ne sont que partiellement initialisées. La phase de nettoyage subséquente traite ces données partielles comme valides, ouvrant ainsi une voie d’injection d’instructions arbitraires. La seconde faille (CVE‑2026‑109619) repose sur un état global persistant : un objet interne lié à une requête est libéré, mais son pointeur reste accessible à un worker qui traite une requête suivante. Si ce worker utilise cet état avant que l’initialisation normale ne le réinitialise, du code contrôlé par l’attaquant peut être exécuté.

Mesures d'atténuation et mise à jour

La solution définitive consiste à mettre à jour les paquets vers les versions corrigées : 8.5.12, 8.4.27, 8.3.36 ou 8.2.35. Les distributions Linux et les fournisseurs LTS ont déjà intégré les correctifs, il suffit donc de vérifier les dépôts officiels. Pour les environnements qui ne peuvent pas appliquer immédiatement la mise à jour, plusieurs réglages limitent l’exposition :

• Pour la vulnérabilité OOM, désactiver la limite de mémoire PHP (memory_limit=-1) au niveau du serveur (php_admin_value dans le pool FPM ou la configuration Apache) empêche le déclenchement du chemin vulnérable, même si une allocation échoue. Un post_max_size restreint (8 Mo pour les sites sans upload, 32 Mo sinon) réduit la surface d’attaque liée aux corps de requête volumineux.

php_admin_value[memory_limit] = -1
post_max_size = 32M
upload_max_filesize = 30M

• Pour la faille d’état global, désactiver le suivi de progression des uploads (session.upload_progress.enabled=0) et redémarrer chaque worker élimine le chemin confirmé. Sur PHP 8.5, désactiver les backtraces d’erreurs fatales (fatal_error_backtraces=0) bloque également le vecteur exploité.

Il est également recommandé d’appliquer des limites au niveau du serveur ou du proxy (nombre d’en‑têtes, profondeur de nesting, taille totale décodée) et d’utiliser des cgroups ou des conteneurs pour isoler les workers, sans se reposer sur RLIMIT_AS ou RLIMIT_DATA, qui peuvent déclencher le même scénario d’allocation défaillante.

Les versions antérieures à PHP 8.2 ne reçoivent plus de correctifs officiels, mais les fournisseurs LTS offrent des backports pour PHP 7.4, 8.0 et 8.1. Dans la mesure du possible, migrer vers une version supportée minimise le risque d’exposition future.