Une vulnérabilité récemment signalée, identifiée comme 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 utilisant NGINX, car NGINX ne dispose pas d’un environnement d’exécution PHP intégré. Au lieu de cela, NGINX agit comme un proxy inverse pour les serveurs d’applications et les gestionnaires de processus tels que PHP-FPM.
La vulnérabilité réside dans PHP-FPM lui-même, et non dans NGINX. La seule solution garantie est donc de mettre à niveau vers la version corrigée (ou ultérieure) de votre version PHP : PHP 7.1.33 , PHP 7.2.24 ou PHP 7.3.11 .
NGINX communique avec PHP-FPM en utilisant le protocole FastCGI. Chaque message FastCGI contient un ensemble de variables d'environnement. L’un d’entre eux, PATH_INFO
, est dérivé d’autres paramètres de requête. Si sa valeur est inopinément vide, cela peut finalement entraîner une corruption de la mémoire dans le binaire PHP-FPM . Il est possible d’exploiter cette situation et de faire en sorte que le binaire PHP-FPM exécute 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 diviser l'URI de la demande en deux parties. Une façon de déclencher la vulnérabilité consiste à intégrer un caractère de saut de ligne ( %0a
) ou de retour chariot ( %0d
) dans l'URI de la demande, qui n'est alors pas correctement géré par l'expression régulière.
Comme mentionné ci-dessus, le seul moyen sûr de remédier à cette vulnérabilité est de mettre à niveau vers la version corrigée (ou ultérieure) de votre version PHP : PHP 7.1.33 , PHP 7.2.24 ou PHP 7.3.11 .
Si vous n'êtes pas en mesure de mettre à niveau votre binaire PHP immédiatement, vous pouvez prendre plusieurs mesures d'atténuation partielles :
Diverses sources ont suggéré d'ajouter une directive try_files
à la configuration NGINX pour vérifier que la variable $uri
se résout en un fichier (le script PHP) et de rejeter la demande avec du code 404
(Non
trouvé)
sinon :
emplacement ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
try_files $uri =404;
#...
}
Notez que cette atténuation ne fonctionne que si NGINX et PHP-FPM partagent la même docroot sur le même hôte.
Les configurations PHP varient en fonction des besoins de l'application en amont. Veuillez tester des modifications comme celle-ci pour vérifier qu'elles n'ont pas d'impact sur votre application.
Utilisez F5 BIG-IP ASM (Application Security Manager) pour protéger l'application . Les ensembles de signatures « Exécution de commande » et « Injection de code côté serveur » existants incluent des signatures d’attaque qui bloquent la plupart des tentatives de découverte et d’exploitation de cette vulnérabilité PHP-FPM.
Éditeur – Depuis la publication de ce blog, l’équipe de sécurité F5 a publié une signature supplémentaire spécifique à cette vulnérabilité. Pour plus de détails, voir 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:minuscule,refuser"
Cette solution est décrite dans le rapport original de Wallarm sur la vulnérabilité ; elle peut provoquer des faux positifs et un attaquant pourrait toujours trouver d'autres moyens d'exploiter la vulnérabilité.
Plutôt que de compter 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 mettre à l'échelle automatiquement les applications PHP en réponse à la charge et exécuter simultanément des applications qui utilisent différents environnements d'exécution PHP. Nous fournissons gratuitement des binaires, des sources et des images Docker .
Consultez la documentation de NGINX Unit pour obtenir des instructions sur la configuration et l’utilisation de NGINX Unit pour WordPress, une application populaire, à fort trafic et basée sur PHP. Le déploiement tire parti de la prise en charge de la diffusion de fichiers statiques dans NGINX Unit 1.11.0 et versions ultérieures.
« Cet article de blog peut faire référence à des produits qui ne sont plus disponibles et/ou qui ne sont plus pris en charge. Pour obtenir les informations les plus récentes sur les produits et solutions F5 NGINX disponibles, explorez notre famille de produits NGINX . NGINX fait désormais partie de F5. Tous les liens NGINX.com précédents redirigeront vers un contenu NGINX similaire sur F5.com."