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.
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 Redisfrom 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=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 1Die 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
Referenzen
So können wir helfen
Wer wir sind
Die Sicherheitsforscher hinter diesem Sicherheitshinweis.

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

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.
