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.
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")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, stderrEin 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-InterpretationDie 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 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.jsonauf 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
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.
