Alle Sicherheitshinweise

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.

Verfasst vonVolker Schönefeld, Simon Weber2026-05-30
SchweregradHochCVSS 7.2CVSS-3.1-VektorAV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:HCWECWE-78 (OS Command Injection)ProduktmercureBetroffene VersionenAlle Releases von 0.2.0-beta.1 bis 0.4.0-beta.9.Behoben in0.4.1. Die Shell-Injection-Klasse wurde im gesamten Dispatch-Code beseitigt, indem Kommandos über Listen-Form-Ausführung (keine Shell) statt String-Interpolation geführt werden.CVEAusstehendGHSAAusstehend

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}"
)

View source →

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:

FeldDICOMDICOM+TLSSFTP
ip / hostjajaja
portjaja
aet_target / aet_sourcejaja
tls_key / tls_cert / ca_certja
user / folderja

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 Shell

View source →

Die 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 mercure im 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.json auf 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

AV:NTargets werden über das Netzwerk über die Weboberfläche konfiguriert und getestet.AC:LDas Setzen eines Feldes und das Auslösen des Tests genügt.PR:HDas Anlegen oder Bearbeiten eines Targets erfordert eine Administrator-Sitzung.UI:NKeine Benutzerinteraktion über die eigene Anfrage des Angreifers hinaus.S:UDie Ausführung bleibt im Scope des UI-Dienstkontos.C/I/A:HDie Befehlsausführung als Benutzer mercure legt die erreichbaren Daten und die Konfiguration offen, erlaubt deren Änderung und kann den Dienst stören.

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.