mercure
Command Injection über unquotierte Target-Felder in Verbindungstests
Wenn mercure die Verbindung eines Dispatch-Targets testet, baut es Shell-Kommandos (ping, echoscu, sftp), indem es die konfigurierten Felder des Targets in einen String interpoliert und über eine Shell ausführt. Keines der Felder wird quotiert oder validiert, über DICOM-, DICOM+TLS- und SFTP-Targets hinweg, sodass ein Administrator in jedem davon Shell-Metazeichen platzieren und beliebige Befehle als Benutzer mercure ausführen kann. Das sichere Muster existiert bereits im Code: Der rsync-Handler baut Kommandos als Argumentlisten.
Beschreibung
mercure ist eine quelloffene DICOM-Orchestrierungsplattform; wir schätzen die schnelle, konstruktive Reaktion der Maintainer auf diesen Bericht. Wenn ein Administrator ein Dispatch-Target (ein Ziel für verarbeitete Studien) konfiguriert, bietet die Weboberfläche eine Schaltfläche "Test", die die Konnektivität prüft.
Der Test jedes Target-Typs baut Shell-Kommandos aus den Feldern des Targets und führt sie über eine Shell aus. Der DICOM-Test interpoliert vier Felder ohne Quoting in ping und echoscu:
app/dispatch/target_types/builtin.py:105-131
async def test_connection(self, target: DicomTarget, target_name: str): target_ip = target.ip or "" target_port = target.port or "" target_aec = target.aet_target or "ANY-SCP" target_aet = target.aet_source or "ECHOSCU"
if target_ip and target_port and not loopback_mode: ping_result, *_ = await async_run(f"ping -w 1 -c 1 {target_ip}") # unquotiert # ... cecho_result, *_ = await async_run( f"echoscu -to 2 -aec {target_aec} -aet {target_aet} {target_ip} {target_port}" )DICOM+TLS fügt Schlüssel-, Zertifikats- und CA-Pfade hinzu, also sieben injizierbare Felder; SFTP interpoliert Host, Benutzer und Ordner. async_run() nutzt immer eine Shell, sodass Metazeichen in jedem Feld interpretiert werden:
| Feld | DICOM | DICOM+TLS | SFTP |
|---|---|---|---|
ip / host | ja | ja | ja |
port | ja | ja | — |
aet_target / aet_source | ja | ja | — |
tls_key / tls_cert / ca_cert | — | ja | — |
user / folder | — | — | ja |
Ein Administrator, der ein beliebiges Feld auf einen Wert mit Shell-Kommandosubstitution setzt und Test klickt, führt dieses Kommando als Benutzer mercure aus; der Test gibt weiterhin Erfolg zurück, sodass es keinen sichtbaren Hinweis gibt. Der Test-Endpunkt selbst erfordert nur eine authentifizierte Sitzung, sodass jeder angemeldete Benutzer ihn auslösen kann, sobald ein bösartiges Target existiert. Wir veröffentlichen keinen funktionsfähigen Payload. Das SFTP-Passwort ist eine separate Instanz desselben Musters, behandelt im Advisory zur SFTP-Passwort-Injection.
Das sichere Muster ist bereits vorhanden: Der rsync-Handler baut Kommandos als Argumentlisten und führt sie mit async_run_exec() aus (keine Shell).
app/dispatch/target_types/rsync.py:139
result, stdout, stderr = await async_run_exec(*c) # create_subprocess_exec, keine ShellDie Befehlsausführung als Benutzer mercure 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 Administrator kann beliebige OS-Befehle als Benutzer
mercureim UI-Container ausführen, indem er Shell-Metazeichen in ein beliebiges Target-Feld platziert und das Target testet. Das betrifft jedes Feld über DICOM-, DICOM+TLS- und SFTP-Targets hinweg. - Der Test-Endpunkt erfordert nur eine authentifizierte Sitzung, sodass jeder angemeldete Benutzer die Injection auslösen kann, sobald ein bösartiges Target gespeichert ist.
- Der UI-Container erreicht das gemeinsame Konfigurationsvolume, Redis und das Docker-Netzwerk, sodass die Befehlsausführung dort ein Ausgangspunkt in den Rest des Deployments ist.
Abhilfe
Aktualisieren Sie auf mercure 0.4.1, das Dispatch-Kommandos über Listen-Form-Ausführung statt über gebaute Shell-Strings führt. Allgemein externe Kommandos als Argumentvektoren mit create_subprocess_exec bauen (das async_run_exec des Codes), niemals nicht vertrauenswürdige Werte in einen Shell-String interpolieren und Target-Felder (AE-Titel, IPs, Ports) gegen ihre erwarteten Formate validieren.
Checkliste für Betreiber
Auf 0.4.1 oder neuer aktualisieren
Das gepatchte Release ausrollen, das die Shell-Ausführung aus den Dispatch-Handlern entfernt.
Konfigurierte Targets prüfen
Target-Felder in
mercure.jsonauf Shell-Metazeichen in IP, AE-Titel, Zertifikatspfad, Host, Benutzer oder Ordner prüfen.Administrator-Zugriff einschränken
Administrator-Anmeldedaten begrenzen und sicherstellen, dass das Standard-Admin-Passwort geändert wurde.
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.
