Situation actuelle : PHP2Shell. Deux failles PHP critiques (CVSS 9.2) permettent d'exécuter du code malveillant sans authentification. Correctifs disponibles depuis le 21 octobre 2026.Ce qu'il faut faire maintenant →

Bien régler memory_limit

memory_limit limite la mémoire par requête PHP. Après PHP2Shell, php.net conseille temporairement le contraire. Ce qui vaut en exploitation normale, en transition et après la mise à jour.

État 6 min de lectureDurcissement et configuration

En bref : memory_limit détermine la quantité de mémoire qu'une seule requête PHP peut occuper ; la valeur par défaut est 128M. En exploitation normale, vous définissez une valeur finie adaptée à l'application et vous la verrouillez avec php_admin_value. Tant que PHP2Shell n'est pas corrigé, php.net conseille temporairement memory_limit=-1, non écrasable et combiné avec une limite au niveau du conteneur ou de cgroup, et non via RLIMIT_AS ou RLIMIT_DATA. Après la mise à jour, une valeur finie s'applique de nouveau.

Un réglage de routine devenu soudain un sujet de sécurité

Pendant des années, memory_limit a été un bouton de réglage pour les développeurs. Quand un site signale « Allowed memory size exhausted », on augmente la valeur et le problème est réglé. Avec PHP2Shell, c'est devenu une question de sécurité, et la recommandation de php.net paraît paradoxale à première vue : pour la période transitoire, la limite mémoire propre à PHP doit disparaître complètement.

L'arrière-plan est CVE-2026-109618. Selon le projet PHP, un état de mémoire insuffisante peut interrompre PHP alors que les données de la requête ne sont qu'en partie initialisées. Le nettoyage de la requête peut alors traiter des données invalides comme valides. Les détails techniques figurent sous CVE-2026-109618, et ce qui se passe à l'intérieur de PHP en cas de manque de mémoire est expliqué dans memory_limit et Out-of-Memory. Pour les exploitants, la question qui compte est : quelle valeur s'applique quand, et où doit-elle figurer ?

Ce que fait memory_limit en exploitation normale

Selon le manuel PHP, memory_limit limite la mémoire qu'un script peut occuper et protège ainsi le serveur contre du code mal écrit. La valeur par défaut est 128M, -1 signifie aucune limite. Les notations abrégées comme 256M ou 1G sont autorisées.

Deux propriétés sont importantes pour la sécurité. Premièrement, la valeur peut être modifiée partout, y compris à l'exécution avec ini_set(). De nombreux CMS et boutiques l'augmentent eux-mêmes, par exemple pour des imports ou le traitement d'images. Pour imposer une valeur, il faut la définir avec php_admin_value ; selon le manuel, les valeurs ainsi définies ne peuvent pas être écrasées par ini_set(). Deuxièmement, le manuel recommande que memory_limit soit supérieur à post_max_size.

La valeur adaptée dépend de l'application. Un coup d'œil au journal d'erreurs montre si des messages de mémoire épuisée apparaissent et pour quels appels. Il est recommandé de définir la valeur site par site dans le pool FPM dédié : plus généreuse pour une boutique avec des imports, plus serrée pour un simple site d'entreprise. Une valeur très élevée appliquée à tous les sites sans distinction gaspille l'effet protecteur, car une seule requête défectueuse ou détournée peut alors mobiliser beaucoup de mémoire.

Depuis PHP 8.5, il existe en outre max_memory_limit. Ce paramètre ne peut être défini qu'au démarrage et limite la valeur maximale à laquelle memory_limit peut être fixé. Les valeurs plus élevées sont plafonnées avec un avertissement. La valeur par défaut -1 signifie aucune limite supérieure.

memory_limit après PHP2Shell : la mesure transitoire de php.net

Pour les serveurs qui ne sont pas encore mis à jour vers 8.5.12, 8.4.27, 8.3.36 ou 8.2.35, ni vers un backport confirmé, php.net indique les étapes suivantes dans son avis de sécurité du 21 octobre 2026. Elles réduisent le risque de certaines voies d'attaque, mais selon php.net ne rendent pas une installation sûre :

  1. Définir memory_limit=-1, si possible de façon à ce que les applications ne puissent pas écraser la valeur, par exemple avec php_admin_value dans le pool FPM ou dans la configuration d'Apache.
  2. Vérifier qu'une limite finie n'est redéfinie nulle part, ni dans un autre pool, ni dans une configuration de répertoire, ni dans l'application.
  3. Définir une limite mémoire au niveau du conteneur ou de cgroup, pour protéger la disponibilité, si possible de façon à ce que seul le worker concerné soit arrêté en cas de dépassement.
  4. Ne pas utiliser RLIMIT_AS ni RLIMIT_DATA. Selon php.net, ces limites peuvent provoquer précisément l'erreur vulnérable lors de l'allocation de mémoire.

php.net explique à ce sujet que -1 supprime l'atteinte de la limite mémoire de PHP, qui peut être provoquée de façon ciblée, mais qu'une erreur de mémoire à un niveau plus bas peut toujours atteindre le chemin vulnérable. L'aperçu de toutes les mesures transitoires figure dans Mesures immédiates si vous ne pouvez pas encore appliquer le correctif.

; Pool FPM, par ex. /etc/php/8.3/fpm/pool.d/www.conf (jusqu'à la mise à jour seulement)
php_admin_value[memory_limit] = -1
# Où memory_limit est défini (lecture seule)
grep -rn 'memory_limit' /etc/php/ /etc/apache2/ 2>/dev/null
grep -rn --include='*.php' -E "ini_set\s*\(\s*['\"]memory_limit" /var/www | head -20
grep -rn --include='.user.ini' 'memory_limit' /var/www

La façon de définir la limite cgroup pour le service FPM est décrite dans Définir des limites de mémoire avec systemd et cgroups. Sans cette limite externe, une seule requête peut mettre tout le serveur en manque de mémoire.

Important

Après chaque modification, redémarrer tous les workers PHP. Un worker en cours d'exécution conserve ses anciennes valeurs.

Ce qui vaut après la mise à jour

Avec les versions corrigées, selon le manuel PHP, le comportement de memory_limit a également changé. À partir de 8.5.12, 8.4.27, 8.3.36 et 8.2.35, c'est une limite souple : une demande de mémoire qui la dépasse peut, dans la plupart des cas, encore aboutir avant que l'erreur ne soit déclenchée. Un nouveau paramètre, memory_hard_limit_percent, définit une limite stricte qui n'est jamais dépassée.

Paramètre Valeur Effet selon le manuel
memory_hard_limit_percent non défini ou -1 par défaut limite stricte égale au double de memory_limit jusqu'à 1G, au-delà memory_limit plus 1G
memory_hard_limit_percent = 150 exemple avec memory_limit=128M, limite stricte de 192M
memory_limit = -1 aucune limite il n'y a alors pas non plus de limite stricte

Le manuel indique un point de contrôle pratique : si memory_hard_limit_percent n'est pas reconnu, la version de PHP utilisée est concernée et doit être mise à jour. Pour les backports des distributions, vérifiez en plus l'état via le journal des modifications du paquet.

# Le binaire FPM connaît-il le nouveau paramètre ? (adapter le numéro de version)
php-fpm8.3 -i | grep -E 'memory_hard_limit_percent|memory_limit'

Après la mise à jour, memory_limit=-1 a rempli son rôle. Revenez à une valeur finie adaptée à l'application et verrouillez-la avec php_admin_value. La limite cgroup peut rester comme couche de protection supplémentaire.

Comment PHP SOS aide-t-il concrètement ?

  • Nous déterminons où memory_limit est défini et écrasé sur votre serveur, y compris par les applications.
  • Nous mettons en œuvre les mesures transitoires de php.net au bon endroit et ajoutons une limite cgroup pour le service FPM.
  • Avec le service de correctifs PHP, nous amenons PHP à une version corrigée et redémarrons tous les workers.
  • Ensuite, nous redéfinissons une valeur finie adaptée et documentons les paramètres.

Questions fréquentes

Quelle est la valeur par défaut de memory_limit ?

Selon le manuel PHP, 128M. La valeur limite la mémoire qu'un script individuel peut occuper. Elle peut être modifiée dans php.ini, dans la configuration du serveur, dans le pool FPM et à l'exécution avec ini_set(), tant qu'elle n'est pas verrouillée avec php_admin_value.

Pourquoi php.net conseille-t-il memory_limit=-1 pour PHP2Shell ?

L'une des failles, CVE-2026-109618, est liée à l'état de manque de mémoire. Selon php.net, memory_limit=-1 supprime l'atteinte de la limite mémoire de PHP, qui peut être provoquée de façon ciblée, mais pas toutes les erreurs de mémoire. La mesure n'est pas une protection complète et doit être combinée avec une limite mémoire au niveau du conteneur ou de cgroup.

Puis-je fixer la limite avec ulimit à la place ?

Non. php.net déconseille expressément d'utiliser RLIMIT_AS ou RLIMIT_DATA en remplacement, car ces limites peuvent provoquer précisément l'erreur vulnérable lors de l'allocation de mémoire. Une limite au niveau du conteneur ou de cgroup est recommandée.

Que vaut-il après la mise à jour vers une version corrigée de PHP ?

Selon le manuel, dans les versions corrigées, memory_limit est une limite souple, complétée par une limite stricte via memory_hard_limit_percent. La mesure transitoire avec -1 a alors rempli son rôle, et une valeur finie, adaptée à l'application, devrait de nouveau s'appliquer.

Sources

Contact immédiat

Chaque heure compte. Écrivez-nous maintenant.

Décrivez brièvement votre système, votre version de PHP et ce que vous avez observé. Nous vous répondons, faisons le point et travaillons à distance jusqu'à la clôture et la documentation de l'incident.

Aide immédiate