Una vulnerabilidad reportada recientemente, identificada como CVE-2019-11043 , puede afectar sitios web que usan PHP‑FPM para ejecutar páginas PHP. El uso de PHP‑FPM es particularmente común en sitios web que utilizan NGINX porque NGINX no tiene un tiempo de ejecución de PHP en proceso. En cambio, NGINX actúa como un proxy inverso para servidores de aplicação y administradores 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 parcheada (o posterior) de su versión de PHP: PHP 7.1.33 , PHP 7.2.24 o PHP 7.3.11 .
NGINX se comunica con PHP‑FPM utilizando el protocolo FastCGI. Cada mensaje FastCGI contiene un conjunto de variables de entorno. Uno de ellos, PATH_INFO
, se deriva de otros parámetros de solicitud. Si su valor está inesperadamente vacío, esto puede causar en última instancia una corrupción de memoria en el binario PHP‑FPM . Es posible aprovechar esta situación y hacer que el binario PHP‑FPM ejecute comandos arbitrarios en el servidor local.
Esta vulnerabilidad puede ser activada por una configuración común de NGINX, mediante la cual NGINX utiliza una expresión regular en la directiva fastcgi_split_path_info
para dividir la URI de la solicitud en dos partes. Una forma de desencadenar la vulnerabilidad es insertar un carácter de salto de línea ( %0a
) o de retorno de carro ( %0d
) en la URI de la solicitud, que luego no es manejada correctamente por la expresión regular.
Como se mencionó anteriormente, la única forma segura de abordar esta vulnerabilidad es actualizar a la versión parcheada (o posterior) de su versión de PHP: PHP 7.1.33 , PHP 7.2.24 o PHP 7.3.11 .
Si no puede actualizar su binario PHP inmediatamente, existen varias mitigaciones parciales que puede realizar:
Varias fuentes han sugerido agregar una directiva try_files
a la configuración de NGINX para verificar que la variable $uri
se resuelva en un archivo (el script PHP) y rechazar la solicitud con código. 404
(No
encontrado)
si no:
ubicación ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
try_files $uri =404;
#...
}
Tenga en cuenta que esta mitigación solo funciona si NGINX y PHP‑FPM comparten el mismo docroot en el mismo host.
Las configuraciones de PHP varían según las necesidades de la aplicação ascendente. Pruebe cambios como éste para verificar que no afecten a su aplicação.
Utilice F5 BIG-IP ASM (Administrador de seguridad de aplicação ) para proteger la aplicação . Los conjuntos de firmas existentes de “Ejecución de comandos” e “Inyección de código del lado del servidor” incluyen firmas de ataque que bloquean la mayoría de los intentos de descubrir y explotar esta vulnerabilidad de PHP‑FPM.
Editor: Desde que se publicó este blog, el equipo de seguridad de F5 ha publicado una firma adicional que es específica para esta vulnerabilidad. Para obtener más detalles, consulte F5 DevCentral .
Agregue una regla de ModSecurity para bloquear solicitudes que contengan el carácter sospechoso %0a
o %0d
:
SecRule REQUEST_URI "@rx %0(a|A|d|D)" "id:1,fase:1,t:minúsculas,denegar"
Esta solución se describe en el informe original de Wallarm sobre la vulnerabilidad ; puede causar falsos positivos y un atacante aún podría encontrar otras formas de explotar la vulnerabilidad.
En lugar de confiar en PHP‑FPM, puede utilizar NGINX Unit para ejecutar sus aplicações PHP. NGINX Unit es un servidor de aplicação y administrador de procesos de código abierto y alto rendimiento que admite numerosos lenguajes y marcos además de PHP. Puede escalar automáticamente aplicações PHP en respuesta a la carga y ejecutar simultáneamente aplicações que utilizan diferentes tiempos de ejecución de PHP. Proporcionamos binarios, fuentes e imágenes de Docker de forma gratuita.
Consulte la documentación de NGINX Unit para obtener instrucciones sobre cómo configurar y operar NGINX Unit para WordPress, una aplicação popular, de alto tráfico y basada en PHP. La implementación aprovecha el soporte para servir archivos estáticos en NGINX Unit 1.11.0 y versiones posteriores.
"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.