mercure
Command Injection über den subservice-Log-Parameter
Auf Bare-Metal-Deployments (systemd) baut der Log-Viewer von mercure ein journalctl-Shell-Kommando und interpoliert den Query-Parameter subservice ohne Quoting oder Validierung hinein. Ein Administrator kann Shell-Metazeichen in diesem Parameter platzieren, um beliebige Befehle als Benutzer mercure auszuführen. Docker-Deployments nehmen einen anderen Code-Pfad (einen Docker-API-Aufruf, keine Shell) und sind nicht betroffen.
Beschreibung
mercure ist eine quelloffene DICOM-Orchestrierungsplattform; wir schätzen die schnelle, konstruktive Reaktion der Maintainer auf diesen Bericht. Die Weboberfläche enthält einen Log-Viewer für die Dienste von mercure.
Wenn die systemd-Unit eines Dienstes als Liste konfiguriert ist (der Dienst "workers" in der Standardkonfiguration), liest der Log-Viewer einen Query-Parameter subservice und interpoliert ihn in ein über eine Shell ausgeführtes journalctl-Kommando:
app/webgui.py:296-313
service_name_or_list = services.services_list[requested_service]["systemd_service"]if isinstance(service_name_or_list, list): service_name = request.query_params.get("subservice", "missing") # ... sub_services = service_name_or_list
run_result = await async_run( f"sudo journalctl -n 1000 -u " f'{service_name} ' f"{start_date_cmd} {end_date_cmd} " "-o short-iso --no-hostname")async_run() führt sein Argument immer über eine Shell aus, sodass Metazeichen im Parameter interpretiert werden:
app/webinterface/common.py:67-74
async def async_run(cmd, **params) -> Tuple[Optional[int], bytes, bytes]: proc = await asyncio.create_subprocess_shell( cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, **params ) stdout, stderr = await proc.communicate() return proc.returncode, stdout, stderrEin Semikolon im Wert von subservice teilt das Kommando; der eingeschleuste Teil läuft unabhängig als Benutzer mercure, unabhängig davon, ob journalctl erfolgreich ist. Der Endpunkt gibt 200 zurück und die Log-Ansicht erscheint leer, sodass es keinen sichtbaren Hinweis gibt. Wir veröffentlichen keinen funktionsfähigen Payload.
Dies betrifft nur systemd-Installationen. Der Docker-Code-Pfad liest denselben Parameter, übergibt ihn aber an einen Docker-SDK-Aufruf statt an eine Shell und ist daher nicht injizierbar. Auf systemd-Installationen besitzt der Benutzer mercure zudem NOPASSWD-sudo für journalctl und systemctl auf mercure-Diensten, sodass die eingeschleuste Shell Dienste stoppen oder neu starten und die Daten und Anmeldedaten lesen kann, die dem Benutzer gehören.
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
- Auf einem systemd-Deployment kann ein Administrator durch Shell-Metazeichen im Parameter
subservicedes Log-Viewers beliebige OS-Befehle als Benutzermercureausführen. Docker-Deployments sind nicht betroffen. - Der Benutzer
mercurebesitzt die DICOM-Datenverzeichnisse und die Konfiguration, sodass die Befehlsausführung durchlaufende Bilddaten und gespeicherte Ziel-Anmeldedaten offenlegt, und die NOPASSWD-sudo-Rechte erlauben das Stoppen oder Neustarten von mercure-Diensten.
Abhilfe
Aktualisieren Sie auf mercure 0.4.1, das den subservice-Wert gegen die konfigurierte Service-Liste validiert und Service-Kommandos über Listen-Form-Ausführung statt einer Shell führt. Allgemein externe Kommandos als Argumentvektoren bauen (keine Shell) und jeden Wert, der eine Unit oder einen Dienst benennen muss, per Allowlist beschränken.
Checkliste für Betreiber
Auf 0.4.1 oder neuer aktualisieren
Das gepatchte Release ausrollen, das den subservice-Wert validiert und die Shell-Ausführung entfernt.
systemd-Scope beachten
Auf Bare-Metal/systemd das Update priorisieren; Docker-Deployments sind von diesem Pfad nicht betroffen.
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.
