Si está ejecutando un sitio web basado en PHP en el servidor NGINX y tiene habilitada la función PHP-FPM para un mejor rendimiento, debe tener cuidado con una nueva vulnerabilidad que permitiría que atacantes no autorizados accedan a su servidor de forma remota. PHP-FPM es una implementación alternativa de PHP FastCGI que ofrece un procesamiento avanzado y altamente eficiente para scripts escritos en lenguaje de programación PHP.
La vulnerabilidad, rastreada como CVE-2019-11043, afecta a sitios web con ciertas configuraciones de PHP-FPM que, según los informes, no es infrecuente y podría explotarse fácilmente. El problema radica en corrupción de memoria en la función “env_path_info” en el módulo PHP-FPM, y encadenarlo junto con otros problemas podría permitir a los atacantes ejecutar de forma remota código arbitrario en servidores web vulnerables.
Andrew Danau, un investigador de seguridad de Wallarm, descubrió la vulnerabilidad mientras buscaba bugs en una competencia de Capture The Flag. Luego, dos de sus colegas, los investigadores, Omar Ganiev y Emil Lerner, desarrollaron un exploit de ejecución de código remoto (RCE) totalmente funcional.
Sitios web PHP vulnerables
Aunque el exploit PoC lanzado públicamente está diseñado para apuntar específicamente a servidores vulnerables que ejecutan versiones de PHP 7+, el error de desbordamiento PHP-FPM también afecta a versiones anteriores de PHP y podría ser armado de una manera diferente.
En resumen, un sitio web es vulnerable si:
- NGINX está configurado para reenviar solicitudes de páginas PHP al procesador PHP-FPM;
- La directiva fastcgi_split_path_info está presente en la configuración e incluye una expresión regular que comienza con un símbolo ‘^’ y termina con un símbolo ‘$’;
- La variable PATH_INFO se define con la directiva fastcgi_param;
- No hay comprobaciones como try_files $uri =404 or if (-f $uri) para determinar si un archivo existe o no.
Esta configuración vulnerable de NGINX y PHP-FPM se parece al siguiente ejemplo:
Aquí, la directiva fastcgi_split_path_info se usa para dividir la URL de las páginas web PHP en dos partes, el valor de un motor PHP-FPM de ayuda para aprender el nombre del script y el otro contiene su información de ruta.
¿Cómo funciona la PoC para PHP FPM?
Según los investigadores, la expresión regular de muestra, que define la directiva fastcgi_split_path_info, puede manipularse utilizando el carácter de nueva línea de manera que la función de división eventualmente establezca la información de ruta en vacía o NULL.
Ahora, dado que hay un puntero aritmético en el código FPM que asume incorrectamente que env_path_info tiene un prefijo igual a la ruta del script PHP sin verificar realmente la existencia del archivo en el servidor, el atacante puede explotar el problema para sobrescribir los datos en la memoria solicitando URL especialmente diseñadas de los sitios web específicos.
En segundo plano, los investigadores crearon PoC [1, 2], para manipular la memoria y agregar valores a php.ini personalizados, en el archivo de configuración PHP-FPM y finalmente ejecutar código arbitrario utilizando un shell web.
Actualizaciones de PHP 7 lanzadas para corregir la falla de FPM
La lista de condiciones previas para una explotación exitosa, como se mencionó anteriormente, no es infrecuente porque algunos de los proveedores de alojamiento web están utilizando las configuraciones vulnerables y están disponibles en Internet como parte de muchos tutoriales PHP FPM.
Nextcloud, uno de los proveedores de alojamiento web afectados, lanzó ayer un aviso advirtiendo a sus usuarios que “la configuración predeterminada de Nextcloud NGINX también es vulnerable a este ataque” y recomendó a los administradores del sistema que tomen medidas inmediatas.
Ayer se lanzó un parche para esta vulnerabilidad, casi un mes después de que los investigadores lo informaron al equipo de desarrolladores de PHP. Dado que el exploit ya está disponible y el parche ya fue lanzado, es probable que los atacantes ya hayan comenzado a escanear Internet para buscar sitios web vulnerables. Por lo tanto, se recomienda encarecidamente a los usuarios que actualicen PHP a los últimos PHP 7.3.11 y PHP 7.2.24.