Alle Sicherheitshinweise

mercure

Command Injection über unquotiertes SFTP-Passwort

Wenn mercure ein SFTP-Dispatch-Target testet, baut es ein sshpass-Shell-Kommando und interpoliert das konfigurierte Passwort des Targets ohne Quoting hinein. Ein Administrator kann das Passwort auf einen Wert mit Shell-Kommandosubstitution setzen; der Test des Targets führt dann beliebige Befehle als Benutzer mercure aus. Dies ist eine Einzelfeld-Instanz des breiteren Problems unquotierter Target-Felder, separat gehalten, weil es ein anderes Kommando (sshpass) erreicht.

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 mit SFTP-Target-Unterstützung (seit September 2021) 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. mercure kann verarbeitete Studien an ein SFTP-Target ausliefern, und die Weboberfläche bietet eine Schaltfläche "Test", um die Verbindung zu prüfen.

Der SFTP-Test baut ein sshpass-Kommando und interpoliert das konfigurierte Passwort ohne Quoting hinein:

app/dispatch/target_types/builtin.py:215-228

async def test_connection(self, target: SftpTarget, target_name: str):
ping_result, *_ = await async_run(f"ping -w 1 -c 1 {target.host}")
# ...
command = "sftp -o StrictHostKeyChecking=no " + f''' "{target.user}@{target.host}:{target.folder}" <<< "" '''
if target.password:
command = f"sshpass -p {target.password} " + command # unquotierte Injection
logger.debug(command) # Passwort wird auf DEBUG geloggt
result, stdout, stderr = await async_run(command, shell=True, executable="/bin/bash")

View source →

async_run() führt den String über eine Shell aus, sodass $(...)-Kommandosubstitution im Passwort ausgewertet wird, bevor sshpass überhaupt läuft:

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 Administrator, der das SFTP-Passwort auf einen Wert mit Kommandosubstitution setzt und Test klickt, führt dieses Kommando als Benutzer mercure aus; sshpass erhält dann ein leeres Passwort und die Verbindung schlägt fehl, aber das eingeschleuste Kommando ist bereits gelaufen. Der Test-Endpunkt erfordert nur eine authentifizierte Sitzung, sodass jeder angemeldete Benutzer ein gespeichertes bösartiges Target auslösen kann. Wir veröffentlichen keinen funktionsfähigen Payload.

Nur der Test-Pfad ist ausnutzbar. Der eigentliche Datei-Dispatch-Pfad baut das Kommando als Liste (über shlex.split), was die Injection neutralisiert. Die übrigen Target-Felder werden im Advisory zu unquotierten Target-Feldern behandelt.

Der rsync-Handler zeigt das sichere Muster: Er übergibt das Passwort als Listenelement und führt es mit async_run_exec() aus (keine Shell).

app/dispatch/target_types/rsync.py:31

sshpass_cmd=["sshpass", "-p", target.password], # Liste, keine Shell-Interpretation

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 ein SFTP-Target-Passwort auf einen Kommandosubstitutions-Payload setzt und das Target testet.
  • Der Test-Endpunkt erfordert nur eine authentifizierte Sitzung, sodass jeder angemeldete Benutzer die Injection auslösen kann, sobald ein bösartiges SFTP-Target gespeichert ist.
  • Der UI-Container erreicht das gemeinsame Konfigurationsvolume, Redis und das Docker-Netzwerk, sodass dies 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 Geheimnisse und andere Werte als Argumentvektor-Elemente mit create_subprocess_exec übergeben, niemals in einen Shell-String interpolieren; der rsync-Handler des Codes macht dies bereits.

Checkliste für Betreiber

  • Auf 0.4.1 oder neuer aktualisieren

    Das gepatchte Release ausrollen, das die Shell-Ausführung aus dem SFTP-Dispatch-Handler entfernt.

  • SFTP-Targets prüfen

    SFTP-Target-Passwörter in mercure.json auf Shell-Metazeichen oder Kommandosubstitutions-Syntax prüfen.

  • Administrator-Zugriff einschränken

    Administrator-Anmeldedaten begrenzen und sicherstellen, dass das Standard-Admin-Passwort geändert wurde.

Bewertung im Detail

AV:NDas Target wird über das Netzwerk über die Weboberfläche konfiguriert und getestet.AC:LDas Setzen des Passworts 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.