Les gobelets débordent : Lorsque votre imprimante déborde d'encre

Elastic Security Labs présente des stratégies de détection et d'atténuation des vulnérabilités du système d'impression CUPS, qui permettent à des attaquants non authentifiés d'exploiter le système via IPP et mDNS, ce qui entraîne l'exécution de code à distance (RCE) sur les systèmes basés sur UNIX tels que Linux, macOS, BSD, ChromeOS et Solaris.

Débordement d'overflow : lorsque votre imprimante renverse plus que de l'encre

Update October 2, 2024

The following packages introduced out-of-the-box (OOTB) rules to detect the exploitation of these vulnerabilities. Please check your "Prebuilt Security Detection Rules" integration versions or visit the Downloadable rule updates site.

  • Stack Version 8.15 - Package Version 8.15.6+
  • Stack Version 8.14 - Package Version 8.14.12+
  • Stack Version 8.13 - Package Version 8.13.18+
  • Stack Version 8.12 - Package Version 8.12.23+

Principaux points abordés dans cet article

  • On September 26, 2024, security researcher Simone Margaritelli (@evilsocket) disclosed multiple vulnerabilities affecting the cups-browsed, libscupsfilters, and libppd components of the CUPS printing system, impacting versions <= 2.0.1.
  • Ces vulnérabilités permettent à un attaquant distant non authentifié d'exploiter le système d'impression via IPP (Internet Printing Protocol) et mDNS pour réaliser une exécution de code à distance (RCE) sur les systèmes concernés.
  • L'attaque peut être lancée sur l'internet public ou le réseau local, en ciblant le port UDP 631 exposé par cups-browsed sans aucune exigence d'authentification.
  • La chaîne de vulnérabilité comprend le filtre foomatic-rip, qui permet l'exécution de commandes arbitraires via la directive FoomaticRIPCommandLine, un problème connu(CVE-2011-2697, CVE-2011-2964) mais non corrigé depuis 2011.
  • Les systèmes concernés comprennent la plupart des distributions GNU/Linux, BSD, ChromeOS et Solaris, dont beaucoup ont le service cups-browsed activé par défaut.
  • D'après le titre de la publication, "Attacking UNIX Systems via CUPS, Part I", Margaritelli s'attend probablement à publier d'autres recherches sur le sujet.
  • Elastic a fourni des protections et des conseils pour aider les organisations à détecter et à atténuer l'exploitation potentielle de ces vulnérabilités.

Le RCE CUPS en un coup d'œil

On September 26, 2024, security researcher Simone Margaritelli (@evilsocket) uncovered a chain of critical vulnerabilities in the CUPS (Common Unix Printing System) utilities, specifically in components like cups-browsed, libcupsfilters, and libppd. These vulnerabilities — identified as CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, and CVE-2024-47177 — affect widely adopted UNIX systems such as GNU/Linux, BSDs, ChromeOS, and Solaris, exposing them to remote code execution (RCE).

Au cœur du problème se trouve l'absence de validation des entrées dans les composants de CUPS, ce qui permet aux attaquants d'exploiter le protocole d'impression Internet (IPP). Les attaquants peuvent envoyer des paquets malveillants au port UDP 631 de la cible via Internet (WAN) ou usurper des annonces DNS-SD/mDNS au sein d'un réseau local (LAN), forçant ainsi le système vulnérable à se connecter à un serveur IPP malveillant.

Pour rappel, l'IPP est un protocole de couche d'application utilisé pour envoyer et recevoir des travaux d'impression sur le réseau. Ces communications comprennent l'envoi d'informations sur l'état de l'imprimante (bourrages papier, manque d'encre, etc.) et sur l'état des travaux. IPP est pris en charge par tous les principaux systèmes d'exploitation, y compris Windows, macOS et Linux. Lorsqu'une imprimante est disponible, elle diffuse (via DNS) un message indiquant qu'elle est prête, y compris son identifiant de ressource uniforme (URI). Lorsque les postes de travail Linux reçoivent ce message, de nombreuses configurations Linux par défaut ajoutent et enregistrent automatiquement l'imprimante pour l'utiliser dans le système d'exploitation. Dans ce cas, l'imprimante malveillante sera automatiquement enregistrée et rendue disponible pour les travaux d'impression.

Lors de la connexion, le serveur malveillant renvoie des attributs IPP élaborés qui sont injectés dans les fichiers PPD (PostScript Printer Description), utilisés par CUPS pour décrire les propriétés de l'imprimante. Ces fichiers PPD manipulés permettent à l'attaquant d'exécuter des commandes arbitraires lorsqu'un travail d'impression est déclenché.

L'une des principales vulnérabilités de cette chaîne est le filtre foomatic-rip, qui est connu pour permettre l'exécution de commandes arbitraires via la directive FoomaticRIPCommandLine. Bien qu'il soit vulnérable depuis plus de dix ans, il n'est toujours pas corrigé dans de nombreuses implémentations modernes de CUPS, ce qui aggrave encore le risque.

Bien que ces vulnérabilités soient hautement critiques avec un score CVSS aussi élevé que 9.9, elles peuvent être atténuées en désactivant cups-browsed, en bloquant le port UDP 631 et en mettant à jour CUPS avec une version corrigée. Ce service est activé par défaut sur de nombreux systèmes UNIX, ce qui fait de ce problème une question urgente à résoudre pour les organisations concernées.

Analyse POC d'Elastic

Les ingénieurs d'Elastic chargés de la recherche sur les menaces ont d'abord localisé la preuve de concept originale rédigée par @evilsocket, qui avait fait l'objet d'une fuite. Cependant, nous avons choisi d'utiliser la preuve de concept cupshax (PoC) en raison de sa capacité à s'exécuter localement.

Pour commencer, le PoC a utilisé une classe Python personnalisée chargée de créer et d'enregistrer le faux service d'impression sur le réseau à l'aide de mDNS/ZeroConf. Pour ce faire, il suffit de créer une entrée de service ZeroConf pour la fausse imprimante IPP (Internet Printing Protocol).

Lors de l'exécution, le PoC diffuse une fausse annonce d'imprimante et écoute les requêtes IPP. Lorsqu'un système vulnérable voit la diffusion, la victime demande automatiquement les attributs de l'imprimante à partir d'une URL fournie dans le message de diffusion. Le PoC répond avec des attributs IPP, y compris le paramètre FoomaticRIPCommandLine, qui est connu pour ses antécédents de CVE. La victime génère et enregistre un fichier de description d'imprimante PostScript (PPD) à partir de ces attributs IPP.

À ce stade, la poursuite de l'exécution nécessite une interaction de l'utilisateur pour lancer un travail d'impression et choisir de l'envoyer à la fausse imprimante. Lorsqu'un travail d'impression est envoyé, le fichier PPD indique à CUPS comment traiter le travail d'impression. La directive FoomaticRIPCommandLine incluse permet l'exécution de commandes arbitraires sur la machine victime.

Au cours de notre examen et de nos tests des exploits avec le PoC Cupshax, nous avons identifié plusieurs obstacles notables et des détails clés sur ces points finaux vulnérables et les processus d'exécution.

Lors de l'exécution de commandes arbitraires pour créer des fichiers, nous avons remarqué que lp est l'utilisateur et le groupe signalés pour l'exécution de commandes arbitraires, le groupe d'impression par défaut sur les systèmes Linux qui utilisent les utilitaires CUPS. Ainsi, le PoC/exploit de Cupshax nécessite que les vulnérabilités de CUPS et l'utilisateur lp aient des permissions suffisantes pour récupérer et exécuter une charge utile malveillante. Par défaut, sur de nombreux systèmes, l'utilisateur lp dispose de ces autorisations pour exécuter des charges utiles efficaces telles que des shells inversés. Toutefois, une autre solution consiste à restreindre lp de manière à ce que ces charges utiles soient inefficaces grâce à des contrôles natifs disponibles dans Linux, tels que les politiques AppArmor ou SELinux, ainsi que les politiques d'application des pare-feu ou des IPtables.

Dans de nombreuses configurations par défaut, l'utilisateur lp a accès à des commandes qui ne sont pas nécessaires au service d'impression, par exemple telnet. Pour réduire la surface d'attaque, nous recommandons de supprimer les services inutiles et d'y ajouter des restrictions, le cas échéant, afin d'empêcher l'utilisateur de lp de les utiliser.

Nous avons également noté que les reverse shells interactifs ne sont pas immédiatement pris en charge par cette technique, puisque l'utilisateur lp ne dispose pas d'un shell de connexion ; cependant, grâce à quelques tactiques créatives, nous avons été en mesure d'y parvenir dans le cadre du PoC. Les PoC typiques testent l'exploit en écrivant un fichier sur /tmp/, ce qui est trivial à détecter dans la plupart des cas. Notez que l'utilisateur qui écrit ce fichier sera lp. Un comportement similaire sera donc présent pour les attaquants qui téléchargent et enregistrent une charge utile sur le disque.

Parallèlement à ces observations, le processus parent, foomatic-rip, a été observé dans notre télémétrie en train d'exécuter un shell, ce qui est très rare

Exécution du POC "Cupshax

Pour démontrer l'impact de ces vulnérabilités, nous avons tenté de réaliser deux scénarios différents : utiliser une charge utile pour un "reverse shell" en utilisant des techniques de survie sur le terrain et récupérer et exécuter une charge utile à distance. Ces actions sont souvent courantes pour les groupes adverses qui tentent de tirer parti de l'identification d'un système vulnérable. Bien qu'elle n'en soit qu'à ses débuts, l'exploitation généralisée n'a pas été observée, mais elle reproduira probablement certains des scénarios décrits ci-dessous.

Nos premières tentatives d'exécution du PoC Cupshax se sont heurtées à un certain nombre d'obstacles mineurs dus aux groupes d'utilisateurs par défaut assignés à l'utilisateur lp - à savoir des restrictions autour de la connexion interactive, un attribut commun aux utilisateurs qui ont besoin d'un accès à distance aux systèmes. Cela n'a toutefois pas eu d'incidence sur notre capacité à télécharger une charge utile à distance, à la compiler et à l'exécuter sur le système hôte concerné :

Les tests se sont poursuivis autour de l'invocation inversée de l'interpréteur de commandes, comme le montre la démonstration ci-dessous :

Évaluer l'impact

  • Gravité : Ces vulnérabilités se voient attribuer des scores CVSS controversés allant jusqu'à 9,9, ce qui indique une gravité critique. L'utilisation répandue de CUPS et la possibilité d'exploiter ces vulnérabilités à distance en font un problème à haut risque.
  • Qui est concerné? La vulnérabilité affecte la plupart des systèmes basés sur UNIX, y compris les principales distributions GNU/Linux et d'autres systèmes d'exploitation tels que ChromeOS et BSD qui utilisent les composants CUPS concernés. Les systèmes publics ou exposés au réseau sont particulièrement à risque. D'autres conseils et notifications seront probablement fournis par les fournisseurs au fur et à mesure que des correctifs seront disponibles, ainsi que d'autres mesures correctives. Même si CUPS écoute généralement sur localhost, le rapport Shodan souligne que plus de 75 000 services CUPS sont exposés sur l'internet.
  • Dommages potentiels : Une fois exploités, les attaquants peuvent prendre le contrôle du système et exécuter des commandes arbitraires. Selon l'environnement, cela peut conduire à l'exfiltration de données, à l'installation de ransomware ou à d'autres actions malveillantes. Les systèmes connectés à des imprimantes par le biais d'un réseau étendu (WAN) sont particulièrement menacés, car les attaquants peuvent les exploiter sans avoir besoin d'un accès au réseau interne.

Remédiations

Comme l'a souligné @evilsocket, il existe plusieurs recommandations de remédiation.

  • Désactivez et désinstallez le service cups-browsed. Consultez par exemple les recommandations de Red Hat et Ubuntu.
  • Assurez-vous que vos paquets CUPS sont mis à jour avec les dernières versions disponibles pour votre distribution.
  • Si la mise à jour n'est pas possible, bloquez le port UDP 631 et le trafic DNS-SD à partir des hôtes potentiellement concernés, et étudiez les recommandations susmentionnées pour renforcer davantage la configuration de l'utilisateur et du groupe lp sur l'hôte.

Protections élastiques

Dans cette section, nous examinons les requêtes de détection et de chasse conçues pour découvrir les activités suspectes liées aux vulnérabilités actuellement publiées. En se concentrant sur les comportements des processus et les modèles d'exécution des commandes, ces requêtes permettent d'identifier les tentatives d'exploitation potentielles avant qu'elles ne se transforment en véritables attaques.

exécution du shell cupsd ou foomatic-rip

La première règle de détection cible les processus des systèmes Linux qui sont créés par foomatic-rip et qui lancent immédiatement un shell. Cette méthode est efficace car les travaux d'impression légitimes nécessitent rarement l'exécution d'un shell, ce qui fait de ce comportement un indicateur fort d'une activité malveillante. Remarque : un shell n'est pas toujours l'objectif d'un adversaire si l'exécution de commandes arbitraires est possible.

process where host.os.type == "linux" and event.type == "start" and
 event.action == "exec" and process.parent.name == "foomatic-rip" and
 process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish") 
 and not process.command_line like ("*/tmp/foomatic-*", "*-sDEVICE=ps2write*")

Cette requête a permis de détecter toutes les tentatives de PoC 33 que nous avons effectuées :

https://github.com/elastic/detection-rules/blob/a3e89a7fabe90a6f9ce02b58d5a948db8d231ee5/rules/linux/execution_cupsd_foomatic_rip_shell_execution.toml

Exécution du shell de l'utilisateur d'imprimante (lp)

Cette règle de détection suppose que l'utilisateur de l'imprimante par défaut (lp) gère les processus d'impression. En spécifiant cet utilisateur, nous pouvons réduire le champ d'application tout en élargissant la liste des processus parents pour inclure cupsd. Bien qu'il n'y ait actuellement aucune indication que le RCE puisse être exploité par le biais de cupsd, nous ne pouvons pas exclure cette possibilité.

process where host.os.type == "linux" and event.type == "start" and
 event.action == "exec" and user.name == "lp" and
 process.parent.name in ("cupsd", "foomatic-rip", "bash", "dash", "sh", 
 "tcsh", "csh", "zsh", "ksh", "fish") and process.name in ("bash", "dash", 
 "sh", "tcsh", "csh", "zsh", "ksh", "fish") and not process.command_line 
 like ("*/tmp/foomatic-*", "*-sDEVICE=ps2write*")

En nous concentrant sur le nom d'utilisateur lp, nous avons élargi notre champ d'action et détecté, comme précédemment, toutes les exécutions du PoC 33 :

https://github.com/elastic/detection-rules/blob/a3e89a7fabe90a6f9ce02b58d5a948db8d231ee5/rules/linux/execution_cupsd_foomatic_rip_lp_user_execution.toml

Connexion au réseau par CUPS foomatic-rip child

Cette règle identifie les connexions réseau initiées par les processus enfants de foomatic-rip, ce qui constitue un comportement suspect. Étant donné que les opérations légitimes n'impliquent généralement pas que ces processus établissent des connexions sortantes, toute activité détectée doit être examinée de près. Si de telles communications sont prévues dans votre environnement, assurez-vous que les adresses IP de destination sont correctement exclues afin d'éviter les alertes inutiles.

sequence by host.id with maxspan=10s
  [process where host.os.type == "linux" and event.type == "start" 
   and event.action == "exec" and
   process.parent.name == "foomatic-rip" and
   process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish")] 
   by process.entity_id
  [network where host.os.type == "linux" and event.type == "start" and 
   event.action == "connection_attempted"] by process.parent.entity_id

En capturant la relation parent/enfant, nous nous assurons que les connexions réseau proviennent de l'application potentiellement compromise.

https://github.com/elastic/detection-rules/blob/a3e89a7fabe90a6f9ce02b58d5a948db8d231ee5/rules/linux/command_and_control_cupsd_foomatic_rip_netcon.toml

Création de fichiers par l'enfant CUPS foomatic-rip

Cette règle détecte les événements suspects de création de fichiers initiés par les processus enfants de foomatic-rip. Comme toutes les preuves de concept actuelles ont une charge utile de test par défaut qui consiste à écrire dans un fichier à l'adresse /tmp/, cette règle permettrait d'y remédier. En outre, il peut détecter les scénarios dans lesquels un attaquant télécharge une charge utile malveillante et crée ensuite un fichier.

sequence by host.id with maxspan=10s
  [process where host.os.type == "linux" and event.type == "start" and 
   event.action == "exec" and process.parent.name == "foomatic-rip" and 
   process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish")] by process.entity_id
  [file where host.os.type == "linux" and event.type != "deletion" and
   not (process.name == "gs" and file.path like "/tmp/gs_*")] by process.parent.entity_id

La règle exclut /tmp/gs_* pour tenir compte du comportement par défaut de cupsd, mais pour une sécurité accrue, vous pouvez choisir de supprimer cette exclusion, tout en gardant à l'esprit qu'elle peut générer plus de bruit dans les alertes.

https://github.com/elastic/detection-rules/blob/a3e89a7fabe90a6f9ce02b58d5a948db8d231ee5/rules/linux/execution_cupsd_foomatic_rip_file_creation.toml

Exécution suspecte de foomatic-rip ou du parent cupsd

Cette règle détecte les lignes de commande suspectes exécutées par les processus enfants de foomatic-rip et cupsd. Il se concentre sur l'identification des activités potentiellement malveillantes, notamment les mécanismes de persistance, les téléchargements de fichiers, les opérations de codage/décodage, les shells inversés et le chargement d'objets partagés par l'intermédiaire de GTFOBins.

process where host.os.type == "linux" and event.type == "start" and 
 event.action == "exec" and process.parent.name in 
 ("foomatic-rip", "cupsd") and process.command_line like (
  // persistence
  "*cron*", "*/etc/rc.local*", "*/dev/tcp/*", "*/etc/init.d*", 
  "*/etc/update-motd.d*", "*/etc/sudoers*",
  "*/etc/profile*", "*autostart*", "*/etc/ssh*", "*/home/*/.ssh/*", 
  "*/root/.ssh*", "*~/.ssh/*", "*udev*", "*/etc/shadow*", "*/etc/passwd*",
    // Downloads
  "*curl*", "*wget*",

  // encoding and decoding
  "*base64 *", "*base32 *", "*xxd *", "*openssl*",

  // reverse connections
  "*GS_ARGS=*", "*/dev/tcp*", "*/dev/udp/*", "*import*pty*spawn*", "*import*subprocess*call*", "*TCPSocket.new*",
  "*TCPSocket.open*", "*io.popen*", "*os.execute*", "*fsockopen*", "*disown*", "*nohup*",

  // SO loads
  "*openssl*-engine*.so*", "*cdll.LoadLibrary*.so*", "*ruby*-e**Fiddle.dlopen*.so*", "*Fiddle.dlopen*.so*",
  "*cdll.LoadLibrary*.so*",

  // misc. suspicious command lines
   "*/etc/ld.so*", "*/dev/shm/*", "*/var/tmp*", "*echo*", "*>>*", "*|*"
)

En faisant une exception pour les lignes de commande, comme nous l'avons fait dans la règle ci-dessus, nous pouvons élargir le champ d'application pour détecter également le parent cupsd, sans craindre de faux positifs.

https://github.com/elastic/detection-rules/blob/a3e89a7fabe90a6f9ce02b58d5a948db8d231ee5/rules/linux/execution_cupsd_foomatic_rip_suspicious_child_execution.toml

Découverte de l'attaque d'Elastic

En plus du contenu préconstruit publié, Attack Discovery d'Elastic peut fournir un contexte et des informations en analysant les alertes dans votre environnement et en identifiant les menaces à l'aide de grands modèles de langage (LLM). Dans l'exemple suivant, Attack Discovery fournit un bref résumé et une chronologie de l'activité. Les comportements sont ensuite mis en correspondance avec une chaîne d'attaque afin de mettre en évidence les étapes touchées et de faciliter le tri des alertes.

Conclusion

La récente divulgation de la vulnérabilité de CUPS met en évidence l'évolution du paysage des menaces et souligne l'importance de sécuriser des services tels que l'impression. Avec un score CVSS élevé, ce problème nécessite une action immédiate, notamment en raison de la facilité avec laquelle ces failles peuvent être exploitées à distance. Bien que le service soit installé par défaut sur certains systèmes d'exploitation UNIX (en fonction de la chaîne d'approvisionnement), une interaction manuelle de l'utilisateur est nécessaire pour déclencher le travail d'impression. Nous recommandons aux utilisateurs de rester vigilants, de continuer à chasser et de ne pas sous-estimer le risque. Bien que la menace nécessite une interaction avec l'utilisateur, si elle est associée à un document de spear phishing, elle peut contraindre les victimes à imprimer à l'aide de l'imprimante vérolée. Ou pire encore, remplacer silencieusement les imprimantes existantes ou en installer de nouvelles comme indiqué par @evilsocket.

Nous nous attendons à ce que d'autres informations soient révélées, la première divulgation ayant été qualifiée de "partie 1". En fin de compte, les capacités de visibilité et de détection restent au premier plan des stratégies défensives pour ces systèmes, en veillant à ce que les attaquants ne puissent pas exploiter les vulnérabilités ignorées.

Références clés

La publication et la date de publication de toute fonctionnalité ou fonction décrite dans le présent article restent à la seule discrétion d'Elastic. Toute fonctionnalité ou fonction qui n'est actuellement pas disponible peut ne pas être livrée à temps ou ne pas être livrée du tout.

Partager cet article