Cómo abordar la vulnerabilidad de PHP-FPM (CVE-2019-11043) con NGINX

NGINX | 29 de octubre de 2019

Una vulnerabilidad detectada recientemente, identificada como CVE-2019-11043, puede afectar a los sitios web que utilizan PHP‑FPM para ejecutar páginas PHP. El uso de PHP‑FPM es especialmente habitual en sitios web basados en NGINX, ya que NGINX no dispone de un entorno de ejecución de PHP integrado en el proceso. En su lugar, NGINX actúa como proxy inverso para servidores de aplicaciones y gestores de procesos como PHP‑FPM.

La vulnerabilidad reside en el propio PHP‑FPM, no en NGINX, por lo que la única solución garantizada es actualizar a la versión corregida (o una posterior) de PHP: PHP 7.1.33, PHP 7.2.24 o PHP 7.3.11.

¿Cuál es la naturaleza de la vulnerabilidad?

NGINX se comunica con PHP‑FPM mediante el protocolo FastCGI. Cada mensaje FastCGI contiene un conjunto de variables de entorno. Una de ellas, PATH_INFO, se obtiene a partir de otros parámetros de la solicitud. Si su valor está vacío de forma inesperada, esto puede acabar provocando daños en la memoria del binario de PHP‑FPM. Es posible aprovechar esta situación para hacer que el binario de PHP‑FPM ejecute comandos arbitrarios en el servidor local.

Esta vulnerabilidad puede activarse mediante una configuración habitual de NGINX, en la que NGINX utiliza una expresión regular en la directiva fastcgi_split_path_info para dividir el URI de la solicitud en dos partes. Una forma de activar la vulnerabilidad consiste en insertar un carácter de salto de línea (%0a) o de retorno de carro (%0d) en el URI de la solicitud, que la expresión regular no procesa correctamente.

Mitigación de la vulnerabilidad

Como se ha mencionado anteriormente, la única forma segura de solucionar esta vulnerabilidad es actualizar la versión de PHP a la versión corregida (o a una posterior): PHP 7.1.33, PHP 7.2.24 o PHP 7.3.11.

Si no puede actualizar inmediatamente el binario de PHP, puede aplicar varias medidas de mitigación parciales:

  1. Diversas fuentes han sugerido añadir una directiva «try_files» a la configuración de NGINX para comprobar que la variable «$uri» se resuelve en un archivo (el script PHP) y, de no ser así, rechazar la solicitud con el código 404 (No encontrado):
location ~ [^/]\.php(/|$) {    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_param           PATH_INFO $fastcgi_path_info;
    try_files               $uri =404;
    #...
}
  1. Tenga en cuenta que esta medida de mitigación solo funciona si NGINX y PHP‑FPM comparten el mismo directorio raíz de documentos en el mismo host. Las configuraciones de PHP varían según las necesidades de la aplicación de origen. Pruebe este tipo de cambios para comprobar que no afecten a su aplicación.
  2. Utilice F5 BIG-IP ASM (Application Security Manager) para proteger la aplicación. Los conjuntos de firmas existentes «Command Execution» y «Server Side Code Injection» incluyen firmas de ataque que bloquean la mayoría de los intentos de detectar y explotar esta vulnerabilidad de PHP‑FPM.Nota del editor: Desde la publicación de este blog, el equipo de seguridad de F5 ha publicado una firma adicional específica para esta vulnerabilidad. Para obtener más información, consulte F5 DevCentral.
  3. Añada una regla de ModSecurity para bloquear las solicitudes que contengan el carácter sospechoso %0a o %0d:
SecRule REQUEST_URI "@rx %0(a|A|d|D)" "id:1,phase:1,t:lowercase,deny"
  1. Esta solución se describe en el informe original de Wallarm sobre la vulnerabilidad; puede generar falsos positivos y es posible que un atacante aún encuentre otras formas de explotar la vulnerabilidad.

Uso de un gestor de procesos PHP diferente

En lugar de depender de PHP‑FPM, puede utilizar NGINX Unit para ejecutar sus aplicaciones PHP. NGINX Unit es un servidor de aplicaciones y gestor de procesos de código abierto y alto rendimiento que, además de PHP, admite numerosos lenguajes y frameworks. Puede escalar automáticamente las aplicaciones PHP en función de la carga y ejecutar simultáneamente aplicaciones que utilicen diferentes entornos de ejecución de PHP. Ofrecemos de forma gratuita archivos binarios, código fuente e imágenes de Docker.

Consulte la documentación de NGINX Unit para obtener instrucciones sobre cómo configurar y utilizar NGINX Unit con WordPress, una popular aplicación basada en PHP y con un gran volumen de tráfico. La implementación aprovecha la compatibilidad con la publicación de archivos estáticos de NGINX Unit 1.11.0 y versiones posteriores.


Compartir

Sobre el autor

Owen Garrett
Owen GarrettDirector sénior de Gestión de Producto

Más artículos de Owen Garrett

Artículos relacionados del blog

Únete a F5 NGINX en AppWorld 2024
NGINX | 04/01/2024

Únete a F5 NGINX en AppWorld 2024

Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
NGINX | 26/09/2023

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source

La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.

Exposición de APIs en Kubernetes
NGINX | 10/03/2022

Exposición de APIs en Kubernetes

La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
NGINX | 23/08/2021

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto

Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.

Presentamos NGINX Plus R22
NGINX | 09/06/2020

Presentamos NGINX Plus R22

NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.

Presentamos NGINX Plus R17
NGINX | 11/12/2018

Presentamos NGINX Plus R17

NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.