Ataque a sistemas UNIX a través de CUPS
(evilsocket.net)- Si la ruta de descubrimiento automático de impresoras de CUPS se combina con la falta de validación de atributos IPP, un atacante remoto no autenticado puede inyectar una configuración de impresora maliciosa e incluso provocar la ejecución de comandos arbitrarios al imprimir
- El punto de partida del ataque es el comportamiento de
cups-browsed, que acepta paquetes de cualquier origen en el puerto UDP 631 y envía una solicitud IPPGet-Printer-Attributesa una URL controlada por el atacante - Las vulnerabilidades se dividen en CVE-2024-47176, CVE-2024-47076, CVE-2024-47175 y CVE-2024-47177, y abarcan desde la generación de PPD en
libcupsfilters,libppdycups-filtershasta el flujo de ejecución defoomatic-rip - El alcance del impacto incluye la mayoría de las distribuciones GNU/Linux, algunos BSD, Oracle Solaris e incluso una posible afectación a Chromium/ChromeOS; en escaneos públicos de IPv4 se observaron callbacks de cientos de miles de dispositivos y un pico de 200 mil a 300 mil clientes simultáneos
- En la práctica, se recomienda desactivar o eliminar
cups-browsedsi no es necesario y actualizar los paquetes de CUPS; si actualizar es difícil, debe considerarse bloquear UDP 631 y, si hace falta, el tráfico DNS-SD
Puntos clave de la cadena de vulnerabilidades
- Esta cadena comienza en la función de descubrimiento automático de impresoras de CUPS y continúa por el procesamiento de atributos IPP, la generación de archivos PPD y la ejecución de filtros
- Las vulnerabilidades principales encajan en cuatro etapas
- CVE-2024-47176:
cups-browsed2.0.1 o anterior se enlaza aUDP INADDR_ANY:631y, al confiar en paquetes de cualquier origen, dispara una solicitud IPPGet-Printer-Attributeshacia una URL controlada por el atacante - CVE-2024-47076:
cfGetPrinterAttributes5delibcupsfilters2.1b1 o anterior pasa al sistema CUPS atributos recibidos desde el servidor IPP sin validarlos ni sanearlos - CVE-2024-47175:
ppdCreatePPDFromIPP2delibppd2.1b1 o anterior escribe atributos IPP en un archivo PPD temporal sin validación ni saneamiento, permitiendo insertar datos controlados por el atacante - CVE-2024-47177:
foomatic-ripdecups-filters2.0.1 o anterior permite ejecutar comandos arbitrarios a través del parámetroFoomaticRIPCommandLineen el PPD
- CVE-2024-47176:
Punto de entrada del ataque y alcance del impacto
- Un atacante remoto no autenticado puede cambiar silenciosamente la URL IPP de una impresora existente por una maliciosa o hacer que se instale una impresora nueva
- La ejecución real del comando ocurre cuando se inicia un trabajo de impresión en ese equipo
- Hay dos puntos de entrada
- WAN / Internet pública: el atacante remoto envía paquetes al puerto
UDP 631y no necesita autenticación - LAN: un atacante local puede falsificar anuncios zeroconf, mDNS y DNS-SD para llegar al mismo camino de código y lograr RCE
- WAN / Internet pública: el atacante remoto envía paquetes al puerto
- CUPS y
cups-browsedestán empaquetados en varios sistemas tipo UNIX- La mayoría de las distribuciones GNU/Linux
- Algunos BSD
- Posible impacto en Google Chromium / ChromeOS
- Oracle Solaris
- Como resultado de escanear varias veces al día durante semanas todo el rango público IPv4 de Internet, tras enviar paquetes UDP hubo cientos de miles de dispositivos que hicieron callback, con picos de 200 mil a 300 mil clientes simultáneos
La puerta abierta por cups-browsed
- Al ejecutar
netstat -anuen una laptop Ubuntu, se detectó un puerto UDP escuchando en0.0.0.0:631 - Al verificar con
lsof -i :631, se observó que TCP 631 era usado porcupsdy UDP 631 porcups-browsed - En
ps aux, el procesocups-browsedaparecía ejecutándose como root cups-browsedforma parte del sistema CUPS y se encarga de descubrir impresoras nuevas y agregarlas automáticamente al sistema- Al revisar el código fuente, se confirmó que el servicio estaba enlazado a
INADDR_ANY:631 UDPy esperaba paquetes UDP con el formatoHEX_NUMBER HEX_NUMBER TEXT_DATA - Como el archivo de configuración predeterminado está casi todo comentado, en la práctica las restricciones de acceso quedan debilitadas
Problemas de parsing y errores adicionales
- Aunque el paquete CUPS en sí está incluido en oss-fuzz, parece que
cups-browsedno tiene cobertura de fuzzing - Al crear un objetivo de fuzzing basado en AFL alrededor de
process_browse_data, 5 entradas dispararon un stack-buffer-overflow - Se señaló como causa un flujo en el que se desreferencian punteros antes de verificar la condición de término en dos bucles
- Más adelante también se descubrieron una race condition y un posible DoS en una zona de manejo de locks
- Estos problemas se reportaron a los desarrolladores y a CERT, pero según el investigador no habían sido reconocidos ni parchados en ese momento
Solicitudes IPP e inyección en PPD
found_cups_printertrata como URL uno de los campos de texto parseados desde el paquete UDP- Esa URL y los datos relacionados pasan por el flujo
examine_discovered_printer_record,create_remote_printer_entryy terminan en una llamada acfGetPrinterAttributesdelibcupsfilters - Si el atacante envía un paquete con la forma
0 3 http://<ATTACKER-IP>:<PORT>/printers/whatever, elcups-browsedobjetivo se conecta a la URL del atacante - Durante la conexión, el encabezado User-Agent incluía la versión del kernel y la arquitectura, y en algunas solicitudes también se observó el nombre de usuario del objetivo
- El Internet Printing Protocol es un protocolo de comunicación entre clientes y una impresora o servidor de impresión, y se usa para consultar el estado de la impresora y enviar trabajos de impresión, entre otras cosas
- El sistema objetivo reconoce el servidor del atacante como si fuera una impresora y envía una solicitud
Get-Printer-Attributesencapsulada dentro de HTTP - Al responder con atributos controlables usando el paquete de Python ippserver, la impresora falsa se agregó como impresora local sin notificar al usuario
Ruta de ejecución de PPD y foomatic-rip
- En los logs de depuración aparecía el proceso de creación de la cola de impresión, generación del archivo PPD temporal y uso/edición del PPD
- La función
create_queuepasa los atributos IPP a la APIppdCreatePPDFromIPP2delibppd ppdCreatePPDFromIPP2escribe en el archivo PPD atributos de texto controlados por el atacante, comoprinter-make-and-model, sin validación ni escape- Un archivo PostScript Printer Description es un archivo de texto que describe las funciones y capacidades de una impresora, y en CUPS sirve para definir las características de la impresora y cómo usarla
- Entre varias directivas del PPD, la extensión de CUPS
cupsFilter2puede ejecutar como filtro un binario bajo/usr/lib/cups/filtercuando se procesa un trabajo de impresión foomatic-ripse trata como un filtro capaz de ejecutar comandos mediante la directivaFoomaticRIPCommandLinedel PPD- En el pasado,
foomatic-filterstuvo correcciones relacionadas con CVE-2011-2964 y CVE-2011-2697, pero se confirmó que esas correcciones no se portaron durante la integración con CUPS - En la vulnerabilidad más reciente CVE-2024-35235 también se menciona la ejecución de comandos arbitrarios mediante
FoomaticRIPCommandLine - Según la explicación de los desarrolladores de CUPS, restringir lo que puede proporcionarse a
FoomaticRIPCommandLinees muy difícil sin romper drivers existentes, y es posible que cientos de modelos antiguos de impresoras previos a 2010 dependan únicamente de Foomatic
Flujo de reproducción del RCE
- La cadena de RCE se compone de tres etapas
- Hacer que el sistema objetivo se conecte al servidor IPP malicioso del atacante
- Devolver cadenas de atributos IPP controladas por el atacante para insertar directivas en el archivo PPD temporal
- Cuando se envía un trabajo de impresión a la impresora falsa, se ejecutan la directiva del PPD y el comando
- La ejecución del comando se construye cerrando la cadena PPD en la configuración del servidor IPP, insertando una nueva línea y luego agregando las directivas
FoomaticRIPCommandLineycupsFilter2 - El objetivo de la demostración fue
Ubuntu 24.04.1 LTScompletamente parchado concups-browsed 2.0.1, y se logró la ejecución de comandos desde la máquina atacante - Este flujo solo se cumple cuando encajan varias etapas de procesamiento de
cups-browsed,libcupsfilters,libppdycups-filters
Mitigación y recomendaciones
- Si
cups-browsedno es necesario, se recomienda desactivar el servicio y eliminarlo - Deben actualizarse los paquetes de CUPS del sistema
- Si no es posible actualizar y el servicio es necesario, debe bloquearse el tráfico
UDP 631 - Según el entorno, también puede bloquearse el tráfico DNS-SD, aunque esto puede ser difícil en ambientes que usan zeroconf
- Como recomendación personal, el investigador dijo que eliminaría de sus sistemas el servicio, binarios y bibliotecas de CUPS, y que no volvería a imprimir hacia sistemas UNIX
- También añadió que quitaría los listeners de zeroconf, Avahi y Bonjour
Proceso de divulgación y trabajo posterior
- Aunque la investigación en sí tomó unos pocos días, desde que el 5 de septiembre abrió un security advisory en el repositorio OpenPrinting de
cups-browsedpara comenzar una divulgación responsable hasta la publicación pasaron 22 días - Las discusiones relacionadas se extendieron a advisories de seguridad para
cups-browsed,libcupsfilters,libppdycups-filters - La investigación tomó 2 días, el exploit funcional 249 líneas, y el proceso de divulgación generó discusiones, correos, mensajes y más de 100 páginas de texto
- Sobre la controversia por la puntuación CVSS de 9.9, se explicó que el valor inicial de 9.9 fue una estimación hecha por un ingeniero de RedHat en un reporte de VINCE y revisada por otro ingeniero
- El investigador considera que el RCE es fácil de explotar y que el alcance del paquete es amplio, lo que explicaría ese 9.9 inicial, aunque añadió que por impacto él mismo no lo clasificaría como 9.9
- También indicó que se filtraron el reporte exacto en Markdown y el exploit que solo había compartido con CERT VINCE
- El
exploit.pyinicial solo enviaba el paquete UDP y levantaba un servidor IPP malicioso, pero luego se convirtió en una herramienta al añadir función de anuncios zeroconf - Más adelante lo reescribió en Go e integró el trabajo en bettercap, agregando funciones para hacerse pasar de forma transparente por servicios anunciados en la LAN mediante zeroconf, Bonjour y Avahi, además del manejo relacionado con IPP
- En el próximo artículo planea cubrir ataques a Apple macOS con un módulo de bettercap aún no publicado, aunque la fecha sigue indefinida por otros procesos de divulgación
1 comentarios
Opiniones de Hacker News
Pensé que era una broma. Dice que “un atacante remoto no autenticado puede cambiar la URL IPP de una impresora existente por una URL maliciosa, o instalar una nueva, y ejecutar comandos arbitrarios cuando se inicia un trabajo de impresión en esa computadora”; pero Heartbleed fue 7.5, así que no veo cómo esto podría ser 9.9
El tuit original decía “ejecución remota de código no autenticada contra todos los sistemas GNU/Linux, etc.”, pero en realidad, en muchas distribuciones CUPS está enlazado solo a loopback o ni siquiera viene instalado
También dice que escaneó todo el IPv4 público varias veces al día durante semanas y recibió callbacks de cientos de miles de dispositivos; si lo entendí bien, eso significa que había alrededor de 300 mil instancias de CUPS abiertas en todo el IPv4 público, y para que ocurra la ejecución remota de código ese servidor CUPS tendría que recibir un trabajo de impresión, así que parece que en la mayoría de los casos eso no pasaría
cups-browseddebe desaparecer y a que el ecosistema Linux debe discutir seriamente el futuro de CUPSLos bugs parecen sorprendentemente simples y al final son un problema de seguridad bastante serio, pero no es el nivel de respuesta upstream que uno esperaría de un paquete de Linux de escritorio instalado por defecto
Aun así, definitivamente no es un pánico CVSS 9.9 como para detener el mundo
Para ser precisos, la ejecución queda diferida hasta la próxima vez que el usuario imprima con su impresora usando la configuración que el atacante modificó, y la vulnerabilidad no está en cupsd sino en cupsd-browser
Puede haber problemas con la actitud del autor, pero la vulnerabilidad en sí sí es un asunto grave
Quien expone CUPS a Internet está en un nivel de despreocupación al que los CVE ya no llegan
Claro, para dispararlo el usuario tendría que imprimir algo, y personalmente creo que nunca he impreso nada desde Linux, pero la afirmación de que recibió callbacks de cientos de miles de máquinas Linux suena plausible
Como mínimo, creo que una laptop Linux no debería quedar muy vulnerable frente a todos los demás dispositivos en lugares como el Wi‑Fi de un aeropuerto
Según cómo se interprete la métrica Scope de CVSSv3, parece ser más exactamente 8.8 o 9.6
En resumen, en algunas variantes de Linux de escritorio, CUPS expuesto a la LAN está levantado en 0.0.0.0, se ejecuta como root y es vulnerable a ejecución remota de código no autenticada. En la mayoría de los Linux orientados a servidores, como Ubuntu Server o CentOS, no es un servicio predeterminado, pero en la mayoría de los Linux de escritorio parece iniciarse por defecto
Para disparar la ejecución remota de código, el usuario de la máquina Linux vulnerable debe imprimir un documento después de la explotación
evilsocket dijo que recibió cientos de miles de callbacks, y aunque la mayoría de nosotros casi no imprima desde Linux, ese nivel de impacto podría bastar para crear una botnet grande
Tenía cupsd abierto a Internet y entré un poco en pánico al escuchar la noticia, pero como sugiere el título aquí, este tema también se comunicó mal. El problema no está en el cupsd central, sino en cups-browsed, que es un paquete/componente separado
Gentoo Linux, que uso para servidores, ofrece cups-browsed como paquete separado, y como no lo instalé no estoy afectado. La mayoría de los usuarios de CUPS que no hayan instalado este paquete adicional tampoco están afectados por este bug
Decir que todos los sistemas que ejecutan CUPS pueden ser hackeados es describir mal el alcance
En casa simplemente desactivé el servicio, pero es bastante irritante que cada vez más software se salga de su alcance y convierta en obligatorios componentes que deberían ser opcionales
Un ejemplo parecido es avahi-daemon. Si intentas quitarlo en Debian/Ubuntu de escritorio, probablemente también se elimine otro software que te hace preguntarte por qué avahi tendría que ser una dependencia fuerte
Entiendo la parte de que “se espera demasiado de los investigadores y se da por sentado, por culpa de triagers que actúan como si investigadores como tú tuvieran que ‘demostrar que vale la pena escucharlos’”, pero también hay una realidad lamentable.
Por cada reporte bien investigado como este, llegan 57 reportes spam de baja calidad de gente que intenta sacarle jugo a una recompensa de bug bounty o poner en su CV que descubrió un CVE. Y con el aumento de los LLM, ese spam puede engañar con facilidad.
Es una situación triste, pero es difícil culpar por completo a los desarrolladores por mostrarse escépticos.
0: https://daniel.haxx.se/blog/2024/01/02/the-i-in-llm-stands-f...
En resumen, cups-browsed escucha en el puerto UDP 631 y puede instalar impresoras automáticamente sin confirmación del usuario.
Un atacante usa esta “función” para instalar, sin confirmación del usuario, una impresora falsa con un controlador personalizado que puede descargarse desde un host arbitrario, y especifica un comando para ejecutar cuando se envíe un trabajo de impresión.
Si el usuario imprime algo en esa impresora falsa, se ejecuta ese comando.
En este caso parece que las distribuciones incluyeron cups-browsed como funcionalidad, pero siempre me ha parecido malo que Ubuntu/Debian, y probablemente todas las distribuciones basadas en deb, levanten automáticamente casi todos los servicios al instalarse.
Significa que, por el simple hecho de instalar un paquete, podría quedar expuesto por accidente otro servicio de red instalado como dependencia.
exim4 ya es un caso conocido, aunque para ser justos su valor predeterminado solo escucha en localhost, así que quizá no sea un gran problema. Acabo de instalar cups-browsed en una máquina Debian y se levantaron dos servicios que escuchan en 0.0.0.0 (cups-browsed y avahi).
En Arch/Gentoo y en las distribuciones de la familia CentOS esto no pasa.
La puntuación CVSS original publicada en Twitter decía que no se necesitaba interacción del usuario. Pero al leer la cadena de ejecución remota de código de la página, dice que “espera a que se envíe un trabajo de impresión a la impresora falsa para que se ejecuten la directiva PPD y el comando correspondiente”.
Si Alice no presiona el botón de imprimir, parecería que no se dispara ningún trabajo de impresión; me pregunto qué se me está escapando. No es que dude de evilsocket, solo quiero comprobar si entendí bien.
Cada vez que tengo que imprimir algo en MacOS, recuerdo cuánto odio las impresoras y el software relacionado con impresoras. Llevo 40 años usando computadoras y, de verdad, cada década las impresoras se vuelven más problemáticas.
pdf2ps - | nc 9001