Si vous ne pouvez pas mettre à jour aujourd’hui
Atténuations temporaires
Ces mesures réduisent l’exposition à certains chemins d’attaque connus pendant que vous déployez la mise à jour. Aucune n’est complète, et certaines ont un vrai coût. Testez avant de déployer.
Dernière vérification 2026-10-22
Il n’existe pas de correction complète par configuration
Les deux avis de PHP le disent explicitement. Servez-vous-en pour gagner des heures ou des jours, pas des semaines. Guide de mise à jour →
Ce que fait chaque mesure
| Mesure | Effet | CVE | Coût / effets secondaires |
|---|---|---|---|
Principale | La principale atténuation de configuration de l’avis. Supprime l’interruption OOM propre à PHP, sur laquelle reposent la plupart des chemins d’attaque. | Les deux | C’est alors l’OS qui tue les workers incontrôlés, ce qui interrompt des requêtes. Sans plafond cgroup, une seule requête peut épuiser l’hôte. |
Partielle | Bloque les chemins de session confirmés, « mais pas les autres variantes » (php.net). À définir dans php.ini, le pool FPM ou la configuration serveur — pas dans .user.ini ni via ini_set(). | …619 | Casse les barres de progression d’envoi qui en dépendent (rare). À laisser désactivé après correction si inutilisé. |
Partielle | Bloque uniquement le chemin confirmé via les backtraces d’erreur fatale — le cas démontré le plus solide de CVE-2026-109619. | …619 | Les erreurs fatales n’incluent plus de backtrace. |
Abaisser Partielle | Moins de pression mémoire pilotée par l’attaquant pendant l’analyse multipart, avant que votre application ne s’exécute. php.net recommande 8M sans envoi de fichiers, 32M avec. | …618 | Limite aussi les envois — testez les parcours d’envoi légitimes. |
Borner les entrées : Partielle | Limite les autres croissances mémoire dues au parseur. | …618 | Les formulaires volumineux ou très imbriqués peuvent échouer. |
Supprimer les erreurs fatales déclenchables par un attaquant et les réglages invalides/obsolètes appliqués par requête Partielle | Supprime les sources de l’état résiduel derrière CVE-2026-109619 : diagnostics émis avant l’initialisation, erreurs fatales et délais dépassés dans les callbacks, envois, imports et nettoyages. | …619 | Effort de revue du code et de la configuration. |
Abaisser Partielle | Recycle les workers pour qu’un état corrompu survive à moins de requêtes. 1 est la valeur extrême évoquée par l’avis. | …619 | Coût réel en CPU et en latence ; inutile contre les attaques en une seule requête. |
Limite l’impact | Empêche l’affichage d’erreurs de divulguer des détails aux visiteurs. Attention : masquer les diagnostics n’arrête pas le déclencheur de CVE-2026-109619. | Impact | Aucun en production. |
Confinement SELinux / AppArmor du worker PHP Limite l’impact | Limite ce que le code injecté peut exécuter ou lire. | Impact | Travail sur les politiques ; n’empêche pas la divulgation de mémoire. |
Règles gérées WAF / CDN Partielle | Bloque les formes de charges connues en bordure. Cloudflare couvre aussi les offres Free. | Les deux | Les attaquants modifient déjà les charges ; la couverture varie selon le fournisseur. |
À ne pas faire
Ne remplacez pas memory_limit par RLIMIT_AS / RLIMIT_DATA
C’est-à-dire ulimit -v / ulimit -d, LimitAS= / LimitDATA= de systemd ou les astuces rlimit_*. Elles font échouer mmap() dans PHP, ce qui déclenche le même chemin OOM vulnérable. Utilisez plutôt une limite cgroup (MemoryMax=, --memory côté conteneur).
Configuration à copier-coller
; /etc/php/8.3/fpm/conf.d/99-php2shell.ini (path varies)
; TEMPORARY PHP2Shell mitigations — revisit after upgrading.
; Tune every number to what your application really needs.
session.upload_progress.enabled = 0
fatal_error_backtraces = 0 ; PHP 8.5 only, ignored elsewhere
display_errors = 0
post_max_size = 8M ; php.net: 8M without uploads, 32M with
upload_max_filesize = 6M ; keep below post_max_size
max_input_nesting_level = 32 ; default 64
max_input_vars = 1000
max_file_uploads = 5 ; default 20
max_multipart_body_parts = 200; /etc/php/8.3/fpm/pool.d/www.conf (one block per pool)
; php_admin_* cannot be overridden by ini_set() in application code.
; WordPress and others call ini_set('memory_limit', ...) — a plain
; php.ini value would be silently replaced with a finite limit again.
php_admin_value[memory_limit] = -1
php_admin_flag[session.upload_progress.enabled] = off
; Recycle workers more often (performance cost — measure it)
pm.max_requests = 50# Apache + mod_php (VirtualHost or global config)
php_admin_value memory_limit -1
php_admin_flag session.upload_progress.enabled off
# 32 MiB request body cap (match post_max_size)
LimitRequestBody 33554432
# nginx in front of PHP-FPM
client_max_body_size 32m;# Cap total PHP-FPM memory with cgroup v2 (systemd's MemoryMax = memory.max)
sudo systemctl edit php8.3-fpm
# [Service]
# MemoryHigh=3G
# MemoryMax=4G
sudo systemctl restart php8.3-fpm
systemctl show php8.3-fpm -p MemoryMax
# Containers: set a memory limit on the container instead
docker run --memory=4g ...Redémarrez PHP-FPM / Apache après chaque modification. Vérifiez la valeur effective avec php-fpm8.3 -i | grep -E 'memory_limit|upload_progress' — en gardant à l’esprit que -i lit php.ini mais pas les surcharges de pool ; vérifiez donc aussi phpinfo() depuis le site.
Après la mise à jour
- Remettez
memory_limità une valeur finie adaptée à votre application. Le PHP corrigé ajoute une limite stricte au-dessus. - Gardez
post_max_sizenettement sous le budget mémoire, etmax_input_nesting_levelà ce dont vous avez réellement besoin. - Laissez
session.upload_progress.enabled = 0si vous ne l’utilisez pas. Moins de surface d’attaque, aucun coût. - Remettez
pm.max_requestsà sa valeur habituelle. - Facultatif :
expose_php = 0masque votre version aux scanners. C’est de l’hygiène, pas une correction.