1 puntos por GN⁺ 2024-09-27 | 1 comentarios | Compartir por WhatsApp
  • 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 IPP Get-Printer-Attributes a 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, libppd y cups-filters hasta el flujo de ejecución de foomatic-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-browsed si 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-browsed 2.0.1 o anterior se enlaza a UDP INADDR_ANY:631 y, al confiar en paquetes de cualquier origen, dispara una solicitud IPP Get-Printer-Attributes hacia una URL controlada por el atacante
    • CVE-2024-47076: cfGetPrinterAttributes5 de libcupsfilters 2.1b1 o anterior pasa al sistema CUPS atributos recibidos desde el servidor IPP sin validarlos ni sanearlos
    • CVE-2024-47175: ppdCreatePPDFromIPP2 de libppd 2.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-rip de cups-filters 2.0.1 o anterior permite ejecutar comandos arbitrarios a través del parámetro FoomaticRIPCommandLine en el PPD

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 631 y 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
  • CUPS y cups-browsed están empaquetados en varios sistemas tipo UNIX
  • 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 -anu en una laptop Ubuntu, se detectó un puerto UDP escuchando en 0.0.0.0:631
  • Al verificar con lsof -i :631, se observó que TCP 631 era usado por cupsd y UDP 631 por cups-browsed
  • En ps aux, el proceso cups-browsed aparecía ejecutándose como root
  • cups-browsed forma 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 UDP y esperaba paquetes UDP con el formato HEX_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-browsed no 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_printer trata 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_entry y terminan en una llamada a cfGetPrinterAttributes de libcupsfilters
  • Si el atacante envía un paquete con la forma 0 3 http://<ATTACKER-IP>:<PORT>/printers/whatever, el cups-browsed objetivo 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-Attributes encapsulada 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_queue pasa los atributos IPP a la API ppdCreatePPDFromIPP2 de libppd
  • ppdCreatePPDFromIPP2 escribe en el archivo PPD atributos de texto controlados por el atacante, como printer-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 cupsFilter2 puede ejecutar como filtro un binario bajo /usr/lib/cups/filter cuando se procesa un trabajo de impresión
  • foomatic-rip se trata como un filtro capaz de ejecutar comandos mediante la directiva FoomaticRIPCommandLine del PPD
  • En el pasado, foomatic-filters tuvo 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 FoomaticRIPCommandLine es 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 FoomaticRIPCommandLine y cupsFilter2
  • El objetivo de la demostración fue Ubuntu 24.04.1 LTS completamente parchado con cups-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, libppd y cups-filters

Mitigación y recomendaciones

  • Si cups-browsed no 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-browsed para 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, libppd y cups-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.py inicial 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

 
GN⁺ 2024-09-27
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

    • Leyendo el artículo, sí, es bastante malo, pero se parece más a que el demonio cups-browsed debe desaparecer y a que el ecosistema Linux debe discutir seriamente el futuro de CUPS
      Los 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 justos, el autor también dijo: “por impacto no lo clasificaría como 9.9, pero la verdad qué sé yo”
    • También hay un desbordamiento de búfer explotable sin acción del usuario. La ruta de foomatic, que requiere un trabajo de impresión, era solo una de las más fáciles de escanear y explotar
    • Me reí mucho con el meme “Look at me, I'm the printer now”. Más allá de la evaluación de severidad, al menos salió un buen chiste
    • Heartbleed es una fuga de memoria, esto es ejecución remota de código completa sin acción del usuario. La ejecución remota de código obviamente implica divulgación total de información y más
      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

    • Parece que el servicio vulnerable en cuestión escucha en 0.0.0.0, y eso preocupa. Significa que, por defecto, es vulnerable a ataques en la LAN y que si el servidor está expuesto a Internet hay que bloquear explícitamente el puerto 631
      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
    • En este caso, “exponer CUPS a Internet” suena como “usar un escritorio Linux conectado a Internet”. Yo no lo haría, pero tampoco es una locura, y uno esperaría que una instalación de escritorio Debian por defecto fuera lo suficientemente segura incluso sin firewall
      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
    • Quien va a un café y usa Wi‑Fi público está exponiendo CUPS y puede ser explotado. Descartarlo así sin más no ayuda a nadie
    • De forma absurda, CUPS corre como demonio del sistema, no como un programa de usuario fuertemente aislado con sandbox
    • Aun así, para movimiento lateral y escalada de privilegios es una victoria completa
  • 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

    • En las universidades hay muchas personas con escritorios Linux con IP pública que imprimen constantemente, ya sean papers, textos propios o textos de otros
    • La cuota de Linux de escritorio, incluso excluyendo ChromeOS, ronda el 4.5%. Aunque la mayoría de nosotros no imprima, todavía debe haber una cantidad considerable de trabajos de impresión saliendo de hosts Linux
    • Heartbleed fue 7.5 y esto queda apenas 0.4 por debajo del incidente de xz; no entiendo cómo esto puede ser 9.6
  • 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

    • Debian es bastante conservador, pero siempre me molestó que al instalar cups normalmente cups-browsed venga incluido por defecto. Parece que se arregla con “no install recommends”, pero si no recuerdo mal, drivers adicionales como hplip también lo vuelven a traer
      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.

  • 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.

    • CUPS se introdujo en 1999, así que quizá en ese momento tenía sentido la instalación automática sin confirmación del usuario. Pero no sé por qué sigue existiendo hoy.
  • 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.

    • También hay un desbordamiento de búfer encontrado con fuzzing, y eso podría llevar a ejecución remota de código sin interacción del usuario. Sin embargo, el autor no tenía suficiente experiencia en esta área como para crear un exploit real.
    • Depende de la definición de “interacción”. Según entiendo, Alice no necesita imprimir un documento provisto por el atacante; basta con que imprima cualquier cosa.
  • 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.

    • Es curioso que el movimiento de la FSF haya empezado en buena medida porque Stallman se frustró con la calidad de los controladores de impresora. Y sin embargo, por alguna razón, en 40 años ese movimiento no logró mejorar de forma notable la calidad del software relacionado con impresoras.
    • Escribí código para impresoras durante más de 10 años. Entiendo lo difíciles que son los problemas técnicos, pero los proveedores empeoran muchísimo la situación. Detesto las impresoras, y creo que el punto máximo fue la LaserJet III.
    • Siento que las impresoras están mucho mejor que hace 10 años. Al menos en MacOS e iOS no tengo problemas para encontrar una impresora e imprimir. Hace 10 años era un sufrimiento, pero ahora, según mi experiencia, es fluido y no hace falta instalar controladores.
    • Última noticia: HP está agregando IA a los controladores de impresora. No es broma: https://hardware.slashdot.org/story/24/09/27/0030239/hp-is-a...
    • Pierdes control sobre el trabajo, pero si conviertes el documento a PostScript y luego lo envías con netcat al puerto de la impresora, funciona bien.
      pdf2ps - | nc 9001