Alle Sicherheitshinweise

mercure

Pickle-Deserialisierung über nicht authentifiziertes Redis

Die Job-Queue von mercure (RQ) speichert Jobs in Redis und deserialisiert sie mit Pythons Pickle. In der Standardinstallation hat Redis keine Authentifizierung und ist von jedem Container im Docker-Netzwerk erreichbar. Ein Angreifer, der bereits einen Fuß in diesem Netzwerk hat, kann einen präparierten Job in Redis ablegen; wenn der Worker ihn aus der Queue nimmt, führt die Pickle-Deserialisierung den Code des Angreifers auf dem Worker aus.

Verfasst vonVolker Schönefeld, Simon Weber2026-05-30
SchweregradHochCVSS 7.8CVSS-3.1-VektorAV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HCWECWE-502 (Deserialization of Untrusted Data)ProduktmercureBetroffene VersionenAlle Releases von 0.2.0-beta.1 bis 0.4.0-beta.9.Behoben in0.4.1. Redis erfordert nun Authentifizierung (die Anwendung startet ohne Passwort nicht) und läuft in einem internen Docker-Netzwerk ohne zum Host exponierten Port, was den Zugang über nicht authentifiziertes Redis schließt.CVEAusstehendGHSAAusstehend

Beschreibung

mercure ist eine quelloffene DICOM-Orchestrierungsplattform; wir schätzen die schnelle, konstruktive Reaktion der Maintainer auf diesen Bericht. mercure verteilt Hintergrundarbeit über RQ, eine Redis-gestützte Job-Queue.

RQs Standard-Serializer ist Pythons pickle, und mercure erstellt seine Queues, ohne ihn zu überschreiben:

app/webinterface/common.py:23-26

from redis import Redis
from rq import Queue
redis = Redis.from_url(os.getenv("REDIS_URL", "redis://localhost:6379/0"))
rq_slow_queue = Queue(name="mercure_slow", connection=redis) # kein serializer=
rq_fast_queue = Queue(name="mercure_fast", connection=redis) # kein serializer=

View source →

Der Worker wird ohne --serializer-Flag gestartet und deserialisiert daher jeden Job mit Pickle, und im Standard-Compose läuft Redis ohne Passwort und ohne Netzwerkisolierung, erreichbar von jedem Container am Docker-Bridge:

docker/docker-compose.yml (Redis)

redis:
image: redis
restart: always
command: redis-server --save 20 1

View source →

Die Deserialisierung mit Pickle ist konstruktionsbedingt unsicher: Ein präpariertes Objekt führt über Pythons __reduce__-Protokoll Code aus, sobald es geladen wird. Ein Angreifer mit Netzwerkzugriff auf Redis schreibt einen Job, dessen gepickeltes Feld ein solches Objekt enthält, und schiebt dessen ID in die Queue; wenn der Worker Job.restore() aufruft, wird der Payload als Benutzer mercure auf dem Worker ausgeführt. Wir veröffentlichen keinen funktionsfähigen Payload.

Redis ist in der Standardinstallation nicht zum Host exponiert, daher wird dies durch einen Pivot von einem anderen Container erreicht, etwa der nicht authentifizierten Receiver-RCE. Einmal im Docker-Netzwerk sind keine Anmeldedaten erforderlich.

Die Befehlsausführung auf dem Worker wird durch die Ausgabe eines eingeschleusten id-Kommandos bestätigt:

Proof-of-Concept-Ausgabe

uid=1000(mercure) gid=1000(mercure) groups=1000(mercure)

Auswirkung

  • Ein Angreifer mit Zugriff auf einen beliebigen Container im Docker-Netzwerk kann Code auf den Worker-Containern ausführen, die die gemeinsamen Konfigurations- und Datenvolumes halten. In der Standardinstallation sind keine Anmeldedaten erforderlich, um Redis zu erreichen.
  • Die Ausführung ist lautlos: Der Payload läuft während der Job-Wiederherstellung, vor jeglichem Logging auf Job-Ebene, und der Worker arbeitet normal weiter.
  • Verkettet mit der nicht authentifizierten Receiver-RCE erreicht ein entfernter Angreifer, der den DICOM-Port erreichen kann, die Codeausführung auf dem Worker ohne Authentifizierung in irgendeiner Phase.
  • Für ein Krankenhaus oder eine Klinik bedeutet das: Ein Angreifer, der bereits Fuß im Deployment gefasst hat, kann die Worker übernehmen, die Bildgebungs-Jobs verarbeiten, ganz ohne Passwort.

Abhilfe

Aktualisieren Sie auf mercure 0.4.1, das ein Redis-Passwort erfordert (die Anwendung startet ohne eines nicht) und Redis in ein internes Docker-Netzwerk ohne exponierten Port stellt, was den nicht authentifizierten Zugang schließt. Als zusätzliche Schutzmaßnahme in jeder RQ-Installation Queue und Worker auf RQs JSON-Serializer umstellen, sodass Job-Daten nie entpickelt werden, und Redis in einem isolierten Netzwerk halten, das nur von den benötigten Diensten erreichbar ist.

Checkliste für Betreiber

  • Auf 0.4.1 oder neuer aktualisieren

    Das gepatchte Release ausrollen; sicherstellen, dass Redis passwortgeschützt und von außerhalb seines Netzwerks nicht erreichbar ist.

  • Redis isolieren

    Sicherstellen, dass Redis in einem internen Netzwerk ohne Host-Port-Mapping liegt und nur von den benötigten Diensten erreichbar ist.

  • JSON-Serialisierung erwägen

    Wo möglich RQ mit seinem JSON-Serializer betreiben, sodass Worker-Jobs nie entpickelt werden.

Bewertung im Detail

AV:LRedis ist nicht zum Host exponiert; der Angriff erfordert einen bestehenden Fuß im Docker-Netzwerk, modelliert als lokaler Zugriff.AC:LEin einziger präparierter Job genügt; keine besonderen Bedingungen.PR:LDas Erreichen von Redis erfordert eine Position im Docker-Netzwerk, aber keine Anwendungs-Anmeldedaten.UI:NDer Worker deserialisiert den Job automatisch beim Entnehmen aus der Queue.S:UDer Code läuft im Scope des Workers.C/I/A:HDie Codeausführung auf dem Worker gewährt vollständigen Lese-, Änderungs- und Verweigerungszugriff auf die gehaltenen Daten und Volumes.

Referenzen

So können wir helfen

Wer wir sind

Die Sicherheitsforscher hinter diesem Sicherheitshinweis.

Dr. Simon Weber Profile

Dr. rer. nat. Simon Weber

Senior Pentester & MedSec-Forscher

Ich evaluiere Ihr SaMD mit derselben branchenprägenden Sicherheitsexpertise, die ich dem BAK MV für die Überarbeitung des B3S-Standards beigetragen habe.

  • Promotion über Krankenhaus-Cybersicherheit
  • Kritische Schwachstellen in Krankenhaussystemen gefunden
  • Alumni der THB MedSec-Forschungsgruppe
  • gematik Security Hero
Volker Schönefeld Profile

Dipl.-Inf. Volker Schönefeld

Senior Application Security Expert

Als ehemaliger CTO und Entwickler, der zum Pentester wurde, arbeite ich mit Ihrem Team zusammen, um Schwachstellen aufzudecken und Lösungen zu finden, die zu Ihrer Architektur passen.

  • 20+ Jahre als CTO, 50+ Mio. App-Downloads
  • Architektur und Absicherung großer IoT-Flotten
  • Certified Web Exploitation Specialist
  • gematik Security Hero

Penetrationstest gesucht?

Machine Spirits ist spezialisiert auf Sicherheitsbewertungen für Medizinprodukte und Gesundheits-IT. Von MDR-Penetrationstests bis C5-Cloud-Compliance helfen wir MedTech-Unternehmen, regulatorische Anforderungen zu erfüllen.