Une vulnérabilité récemment signalée, référencée sous le nom CVE-2019-11043, peut affecter les sites web qui utilisent PHP‑FPM pour exécuter des pages PHP. L’utilisation de PHP‑FPM est particulièrement courante sur les sites web reposant sur NGINX, car NGINX ne dispose pas d’un environnement d’exécution PHP intégré à son processus. NGINX fait plutôt office de proxy inverse pour les serveurs d’applications et les gestionnaires de processus tels que PHP‑FPM.
La vulnérabilité se situe dans PHP‑FPM lui-même, et non dans NGINX. La seule solution garantie consiste donc à mettre à niveau votre version de PHP vers la version corrigée (ou une version ultérieure) : PHP 7.1.33, PHP 7.2.24, ou PHP 7.3.11.
Quelle est la nature de la vulnérabilité ?
NGINX communique avec PHP‑FPM à l’aide du protocole FastCGI. Chaque message FastCGI contient un ensemble de variables d’environnement. L’une d’elles, PATH_INFO, est dérivée d’autres paramètres de la requête. Si sa valeur est vide de manière inattendue, cela peut finir par provoquer une corruption de la mémoire dans le binaire PHP‑FPM. Il est possible d’exploiter cette situation pour amener le binaire PHP‑FPM à exécuter des commandes arbitraires sur le serveur local.
Cette vulnérabilité peut être déclenchée par une configuration NGINX courante, dans laquelle NGINX utilise une expression régulière dans la directive fastcgi_split_path_info pour scinder l’URI de la requête en deux parties. L’un des moyens de déclencher cette vulnérabilité consiste à insérer un caractère de saut de ligne (%0a) ou de retour chariot (%0d) dans l’URI de la requête, lequel n’est alors pas correctement traité par l’expression régulière.
Atténuation de la vulnérabilité
Comme indiqué ci-dessus, la seule façon certaine de corriger cette vulnérabilité consiste à mettre à niveau votre version de PHP vers la version corrigée (ou une version ultérieure) : PHP 7.1.33, PHP 7.2.24 ou PHP 7.3.11.
Si vous ne pouvez pas mettre à niveau votre binaire PHP immédiatement, vous pouvez mettre en place plusieurs mesures d’atténuation partielles :
- Diverses sources ont suggéré d’ajouter une directive «
try_files» à la configuration de NGINX afin de vérifier que la variable «$uri» correspond à un fichier (le script PHP) et, dans le cas contraire, de rejeter la requête avec le code404(NotFound):
location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
try_files $uri =404;
#...
}- Notez que cette mesure d’atténuation ne fonctionne que si NGINX et PHP‑FPM partagent la même racine de documents sur le même hôte. Les configurations PHP varient en fonction des besoins de l’application en amont. Veuillez tester ce type de modifications afin de vérifier qu’elles n’ont aucune incidence sur votre application.
- Utilisez F5 BIG-IP ASM (Application Security Manager) pour protéger l’application. Les ensembles de signatures « Command Execution » et « Server Side Code Injection » existants comprennent des signatures d’attaque qui bloquent la plupart des tentatives visant à détecter et à exploiter cette vulnérabilité de PHP‑FPM.Note de l’éditeur – Depuis la publication de cet article, l’équipe de sécurité de F5 a publié une signature supplémentaire propre à cette vulnérabilité. Pour plus de détails, consultez F5 DevCentral.
- Ajoutez une règle ModSecurity pour bloquer les requêtes contenant le caractère suspect «
%0a» ou «%0d» :
SecRule REQUEST_URI "@rx %0(a|A|d|D)" "id:1,phase:1,t:lowercase,deny"- Cette solution est décrite dans le rapport initial de Wallarm sur la vulnérabilité ; elle peut générer des faux positifs, et un attaquant pourrait malgré tout trouver d’autres moyens d’exploiter la vulnérabilité.
Utiliser un autre gestionnaire de processus PHP
Au lieu de vous appuyer sur PHP‑FPM, vous pouvez utiliser NGINX Unit pour exécuter vos applications PHP. NGINX Unit est un serveur d’applications et un gestionnaire de processus open source hautes performances qui prend en charge de nombreux langages et frameworks en plus de PHP. Il peut adapter automatiquement la capacité des applications PHP en fonction de la charge et exécuter simultanément des applications utilisant différentes versions de l’environnement d’exécution PHP. Nous fournissons gratuitement des fichiers binaires, le code source et des images Docker.
Consultez la documentation de NGINX Unit pour savoir comment configurer et exploiter NGINX Unit pour WordPress, une application populaire à fort trafic basée sur PHP. Ce déploiement tire parti de la prise en charge des fichiers statiques dans NGINX Unit 1.11.0 et les versions ultérieures.
À propos de l’auteur

Articles de blog associés

Tendances actuelles des technologies cloud natives, de l’ingénierie de plateforme et de l’IA
Découvrez les principaux enseignements tirés des réponses à l’enquête annuelle F5 NGINX sur les dernières tendances en matière de technologies cloud natives, de sécurité, d’ingénierie de plateforme et d’IA.
Quels contrôleurs Ingress NGINX sont affectés par les vulnérabilités CVE-2022-4886, CVE-2023-5043 et CVE-2023-5044 ?
Lorsque de nouvelles CVE sont signalées, il est facile de ne plus savoir si elles concernent un outil de contrôleur Ingress NGINX particulier, car il existe plusieurs projets. Cet article présente les CVE et explique comment distinguer les différents projets de contrôleurs Ingress afin de dissiper toute confusion.
Votre API est-elle en temps réel ? Testez sa latence avec l’outil rtapi de NGINX
Votre API répond-elle aux requêtes en moins de 30 ms ? Si ce n’est pas le cas, il ne s’agit pas d’une API en temps réel offrant la faible latence exigée par la grande majorité des organisations. Mesurez la latence de votre API avec l’outil rtapi de NGINX et découvrez comment NGINX peut l’aider à offrir une réactivité en temps réel.

Un testeur d’expressions régulières pour NGINX et NGINX Plus
Le testeur d’expressions régulières (regex) pour NGINX et NGINX Plus vous évite de tâtonner en vous indiquant si une expression régulière utilisée dans un bloc location ou map correspond aux valeurs comme prévu. Il génère la configuration appropriée et affiche les valeurs des groupes de capture.
Caches partagés avec les clusters de cache NGINX Plus, partie 1
Optimisez la capacité de votre cache web en le répartissant entre plusieurs serveurs de cache web NGINX ou NGINX Plus. Découvrez comment procéder dans cet article.
Introduction aux microservices
Les microservices suscitent actuellement beaucoup d’intérêt. Cet article de blog est le premier d’une série de sept consacrée à la conception, au développement et au déploiement de microservices.