Las vulnerabilidades CVE-2024-47176, CVE-2024-47076, CVE-2024-47175 y CVE-2024-47177 han levantado todas las alarmas durante estos días, momento en el cual se ha publicado el fallo de seguridad en CUPS que provoca la posibilidad de que los atacantes ejecuten código remoto en los servidores.
Durante el jueves pasado se ha reportado en GitHub Advisories un fallo de seguridad en CUPS, desencadenado por 4 vulnerabilidades distintas de 4 librerías diferentes. En el reporte publicado por el auditor de seguridad, evilsocket (como se hace llamar en internet) explica cómo ha conseguido explotar en cadena las 4 vulnerabilidades, logrando ejecutar código remoto en un servidor que tenía expuesto el servicio de CUPS.
Comprendiendo los conceptos básicos de CUPS
CUPS (Common Unix Printing System) es el paquete predeterminado de Linux para la gestión, administración y compartición de impresoras en red. Es un software tan ampliamente usado que la mayoría de los sistemas operativos, como Ubuntu o Debian, lo traen instalado y habilitado por defecto.
Para entender el ataque debemos saber que CUPS expone por defecto el puerto 631, tanto TCP como UDP. Esto es la base del fallo de seguridad detectado, ya que tener el puerto UDP abierto es el vector para aprovecharse de la mala validación de las entradas del servicio para conseguir ejecutar comandos en la máquina víctima.
Otro aspecto a tener en cuenta es que CUPS usa habitualmente el protocolo IPP, conocido como Internet Printing Protocol. Este protocolo permite imprimir y administrar las colas de impresión en remoto, permitiendo configurar los tamaños de papel, resoluciones, calidad, etc.
Descubriendo las 4 vulnerabilidades
Lo especial de este caso tal vez no es el motivo de descubrir el fallo de seguridad ni por qué se produce, si no la cantidad de vulnerabilidades explotadas en cadena. Para explotar el fallo de seguridad de CUPS, es necesario aprovecharse de 4 vulnerabilidades 0-day descubiertas recientemente:
- CVE-2024-47176: Detectada en cups-browsed en versiones superiores o igual a la 2.0.1. Permite conectarse a cualquier petición que le llegue por su puerto 631 UDP desde cualquier origen para abusar del protocolo IPP (en concreto a Get-Printer-Attributes). Un atacante podría aprovecharse de esto para establecer una conexión con un servidor controlado por el atacante.
- CVE-2024-47076: Detectada en libcupsfilters en versiones superiores o igual a la 2.1b1. Esta vulnerabilidad viene dada por la falta de validación de los atributos IPP pasados a CUPS, permitiendo inyectar cualquier atributo en la vulnerabilidad anterior.
- CVE-2024-47175: Detectada en libppd en versiones superiores o igual a la 2.1b1. La vulnerabilidad no valida los atributos IPP al escribirlos en un archivo PPD temporal.
- CVE-2024-47177: Detectada en cups-filters en versiones superiores o igual a la 2.0.1. Tal vez la más crítica de las 4 (CVSS 9.1), la vulnerabilidad permite la ejecución arbitraria de comandos a través del parámetro PPD “FoomaticRIPCommandLine”.
Esto implicaría, en resumen, que aprovechando que los atributos IPP no se validan correctamente en la librería libcupsfilters debido a CVE-2024-47076 y que se puede generar un PPD sin validar, debido a CVE-2024-47075, podemos ejecutar código remoto usando la vulnerabilidad CVE-2024-47177 a través del puerto expuesto sin validar conexiones (CVE-2024-47176).
Estimando el alcance
Como CUPS es un software precargado en la mayoría de los sistemas Linux, ya que es la forma predeterminada de gestionar las impresiones a través de red, cualquier vulnerabilidad de relevancia siempre supone un alto alcance.
Para ajustar correctamente el alcance, debemos de verificar los servidores cups con el puerto 631 UDP abierto a internet y que use el protocolo IPP. Según un análisis en Shodan realizado el día del reporte de la vulnerabilidad por el equipo de Tenable, habría más de 75000 hosts vulnerables en internet.
Realizando una prueba de concepto del ataque
Desde el equipo de Ciberso, hemos realizado una prueba de concepto para poder mostrar un ejemplo de la vulnerabilidad y su explotación en un entorno controlado.
En primer lugar, usaremos un sistema operativo Ubuntu 18.04 LTS como servidor víctima. Para ello habilitaremos el servicio “cups” y, especialmente “cups-browsed”.
Una vez habilitados, confirmamos que el puerto 631 UDP está abierto y expuesto a través del firewall.
Para habilitar la exposición de CUPS a otras IPs de la red, debemos asegurar de que el puerto esté disponible a cualquier IP a través del fichero de configuración cupsd.conf:
Es importante destacar que la versión de cups-browsed, al igual que las demás librerías comentadas en este artículo, deben de estar en los rangos vulnerables.
Desde la máquina atacante, nos aseguramos de que el puerto esté correctamente abierto a través del análisis de puertos con Nmap:
Podemos apreciar cómo, efectivamente, el puerto 631 está abierto. En este punto, podemos verificar la explotabilidad de la vulnerabilidad CVE-2024-47176.
Si la vulnerabilidad es explotable, el atacante debería de poder enviar un paquete al puerto 631 UDP y poder conectarnos sin que se valide previamente la URL. Para ello, enviaremos el siguiente paquete a través del script de Python:
Enviamos al servidor de la víctima, a través del puerto 631, la URL de la máquina atacante a través de un puerto “1234”, el cual ponemos en escucha previamente usando Netcat.
Ejecutamos el script y obtenemos la siguiente respuesta en nuestro servidor levantado previamente:
Vemos que, a través de una URL no validada, hemos conseguido que el servicio se conecte a nuestro servidor.
En este momento, podemos aprovechar para servir desde ese puerto (en este caso 1234) una respuesta manipulando los atributos IPP e inyectando el código a ejecutar en el servidor. El siguiente código muestra un ejemplo de cómo levantar un servidor HTTP que envíe los atributos manipulados, creando un fichero “/var/exploited”:
En nuestro caso, haremos uso de una PoC de GitHub Cupshax, la cual crea un servidor IPP para explotar esta vulnerabilidad:
Por defecto, esta PoC levanta el servidor en el puerto 8631, por lo que editaremos la llamada anterior cambiando el puerto destino:
Con ello tenemos la vulnerabilidad explotada, permitiendo ejecutar código remoto en la víctima.
Remediando la vulnerabilidad
Para remediar la vulnerabilidad, existen distintas remediaciones temporales hasta que se publique una versión correctora en las librerías:
- Verifica que realmente se hace uso de la versión vulnerable: Existen pocas versiones afectadas y es posible que tu sistema no sea vulnerable.
- Denegar el acceso al puerto 631 UDP a Internet: No es común que esté accesible este servicio fuera de la red interna.
- Deshabilitar el servicio de cups-browsed: En caso de que no sea necesario, la medida más recomendable es deshabilitar el servicio de cups (pararlo y deshabilitar del arranque).
Conclusiones
Aunque la vulnerabilidad originalmente fue calculada con un score de 9.9 y ha generado una gran cantidad de dudas, el ataque ha sido realmente menos grave de lo que se ha mencionado en múltiples medios.
Realmente las versiones afectadas son menos de las esperadas, debido a que son rangos pequeños y recientes, y es necesario tener expuesto el puerto UDP, además de usar el protocolo IPP. Estas condiciones hacen que la mayoría de los sistemas no sean explotables.
Aun así, es importante seguir buenas prácticas en la configuración de los sistemas. Además, estas vulnerabilidades siempre hacen replantearnos la necesidad de la seguridad en los componentes open-source y la necesidad de la seguridad en los desarrollos.
Desde Ciberso buscamos mejorar en la detección de vulnerabilidades en terceros, creando un flujo de desarrollo seguro y ágil, también ayudamos a las empresas en la implementación de soluciones de seguridad para reaccionar a este tipo de vulnerabilidades de forma rápida y eficiente. Por último y como compromiso desde Ciberso a las posibles vulnerabilidades que puedan tener este tipo de códigos Open Source, vamos a publicar una herramienta gratuita que permite analizar y al menos conocer el riesgo que conlleva utilizar este tipo proyectos.