Alle Sicherheitshinweise

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.

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 Versionenmercure 0.4.0-beta.1 bis 0.4.0-beta.9, nur systemd-(Bare-Metal-)Deployments. Docker-Deployments sind nicht betroffen. Der Parameter wurde im 0.4.x-Zweig eingeführt.Behoben in0.4.1. Der subservice-Parameter wird gegen die konfigurierte Service-Liste validiert, und die Shell-Injection-Klasse wurde im gesamten Code beseitigt, indem Kommandos über Listen-Form-Ausführung statt einer Shell geführt werden.CVEAusstehendGHSAAusstehend

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

View source →

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, stderr

View source →

Ein 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 subservice des Log-Viewers beliebige OS-Befehle als Benutzer mercure ausführen. Docker-Deployments sind nicht betroffen.
  • Der Benutzer mercure besitzt 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

AV:NDer Log-Viewer wird über das Netzwerk über die Weboberfläche erreicht. Dieser Pfad betrifft systemd-Deployments; Docker-Deployments nutzen einen anderen, nicht verwundbaren Code-Pfad.AC:LEine einzige präparierte Anfrage löst die Injection aus.PR:HDer Log-Viewer erfordert eine Administrator-Sitzung.UI:NKeine Benutzerinteraktion.S:UDie Ausführung bleibt im Scope des mercure-Dienstkontos.C/I/A:HDie Befehlsausführung als Benutzer mercure legt die ihm gehörenden Daten und die Konfiguration offen, erlaubt deren Änderung und kann Dienste 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.