Alle Sicherheitshinweise

dcm4chee-arc-light

Remote Code Execution über Storage-Descriptor File Write

Eine Storage-Location legt fest, wohin das Archiv die empfangenen Objekte schreibt. Sowohl ihr Wurzelverzeichnis als auch ihre Pfadvorlage stammen aus der Konfiguration, und geprüft wurde weder gegen eine Positivliste von Schemata noch gegen eine Eingrenzungsgrenze. Damit bestimmte allein die Konfiguration das Ziel eines gespeicherten Objekts. Wer die Archivkonfiguration schreiben kann, richtet eine Storage-Location auf ein Verzeichnis, das der Applikationsserver auf Deployments überwacht, und speichert anschließend ein gewöhnliches DICOM-Objekt, dessen Nutzlast eine deploybare Webanwendung ist. Der Server nimmt sie auf und führt sie im Dienstkonto des Archivs aus.

Verfasst vonVolker Schönefeld, Simon WeberErstveröffentlichung 2026-08-18Vollständige Offenlegung 2026-08-31
SchweregradKritischCVSS 9.8CVSS-3.1-VektorAV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HCWECWE-22 (Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal'))Produktdcm4chee-arc-lightBetroffene VersionenAlle 5.x-Releases bis einschließlich 5.34.3.Behoben in5.35.0CVEAusstehendGHSAGHSA-rf29-xp3v-4wp3

Beschreibung

Ein Storage-Descriptor legt fest, wohin das Archiv die empfangenen Objekte legt. Zwei seiner Felder bestimmen das Ziel: die Storage-URI als Wurzelverzeichnis im Dateisystem und das Storage-Path-Format, eine Vorlage, die gegen die Attribute des gespeicherten Objekts ausgewertet wird. Beide sind gewöhnliche Konfiguration. Der Setter für das Wurzelverzeichnis übernimmt, was er bekommt, ohne Positivliste zulässiger Schemata und ohne Prüfung, ob das Ergebnis den vorgesehenen Bereich verlässt:

StorageDescriptor.java:128-131

public void setStorageURIStr(String str) {
    this.storageURI = URI.create(StringUtils.replaceSystemProperties(str));
    this.storageURIStr = str;
}

View source →

Beim Schreiben werden Wurzelverzeichnis und ausgewertete Pfadvorlage zusammengesetzt und direkt geöffnet:

FileSystemStorage.java:174-181

protected OutputStream openOutputStreamA(WriteContext ctx) throws IOException {
    Path path = Paths.get(rootURI.resolve(ctx.getStoragePath()));
    Path dir = path.getParent();
    createDirectories(dir);
    while (true)
        try {
            ctx.setStoragePath(rootURI.relativize(path.toUri()).toString());
            return Files.newOutputStream(path, descriptor.getFileOpenOptions());

View source →

Es gibt nichts, woraus man ausbrechen müsste, weshalb in diesem Fund an keiner Stelle eine Traversal-Sequenz vorkommt. Wer die Konfiguration schreiben kann, setzt das Wurzelverzeichnis auf das gewünschte Verzeichnis und die Pfadvorlage auf den gewünschten Dateinamen, und das Archiv schreibt dorthin, weil es genau das angewiesen bekommen hat. Die Pfadvorlage greift auf Attribute des gespeicherten Objekts zu, die derselbe Aufrufer liefert, sodass auch Dateiname und Endung steuerbar sind.

Der Schritt vom gesteuerten Schreibvorgang zur Codeausführung nutzt dieselbe Eigenschaft des Applikationsservers wie der im verwandten Advisory beschriebene Vendor-Data-Fund: Ein Archiv, das im Deployments-Verzeichnis auftaucht, wird aufgenommen und deployt. Damit dort eine deploybare Datei landet, braucht es zwei Eigenschaften des Speicherpfads. Ein Encapsulated-PDF-Objekt trägt sein Dokument in einem Bulk-Data-Attribut, und das Archiv kodiert das Objekt beim Speichern zwar neu, reicht dieses Attribut aber unverändert durch, statt es durch einen Bild-Codec zu schicken. Ein eingebettetes Archiv übersteht das also unversehrt, und als Element mit der höchsten Nummer folgt ihm im geschriebenen Dataset nichts mehr. Auf der Platte landet damit das vollständige DICOM-Objekt und nicht nur das Archiv. Deploybar bleibt es trotzdem, weil ein Archiv-Reader das ZIP-Inhaltsverzeichnis vom Dateiende her sucht und die vorangestellte DICOM-Präambel samt Element-Headern deshalb als führender Ballast toleriert wird.

Dieser Ballast kostet den Angreifer allerdings etwas, und das gehört zur genauen Darstellung dazu: Der Deployment-Scanner des Applikationsservers führt eine Vollständigkeitsprüfung durch und liest eine Datei mit vorangestelltem Ballast als noch im Kopiervorgang befindlich. Der erste Schreibvorgang deployt also für sich genommen nicht. Dazu kommt es erst, wenn eine passende Marker-Datei den Scanner zum Fortfahren veranlasst, die dasselbe Primitiv aus Konfiguration und Speichervorgang erzeugen kann. Die Kette besteht aus zwei Schreibvorgängen statt aus einem, weshalb die Angriffskomplexität niedrig bleibt, der Fund aber kein einzelner Request ist.

Codeausführung ist der schwerste, aber nicht der einzige Ausgang. Dasselbe Primitiv schreibt ohne den Deployment-Schritt wohlgeformte und vollständig lesbare DICOM-Studien an gewählte Orte, was genügt, um Bildmaterial in ein Archiv zu legen, das kein bildgebendes Gerät erzeugt hat. Die File-Open-Options sind selbst ein Konfigurationsfeld; werden sie über dieselbe Schnittstelle von der Voreinstellung (nur anlegen, wenn nicht vorhanden) auf einen überschreibenden Modus umgestellt, wird aus dem Anlegen neuer Dateien das Überschreiben bestehender.

Der Fix löst jeden Speicherpfad gegen sein Wurzelverzeichnis auf und weist jedes Ergebnis zurück, das dieses verlässt. Zusätzlich verweigert er ein Wurzelverzeichnis, das innerhalb des Home-Verzeichnisses des Applikationsservers außerhalb des nun dafür vorgesehenen Speicherbereichs liegt. Die Standard-Storage-Location wurde im selben Release in diesen Bereich verschoben.

dcm4chee-arc-light ist das DICOM-Archiv und der Image Manager des dcm4che-Projekts und wird von Kliniken, Forschungsgruppen und Herstellern als offene Infrastruktur für Speicherung und Austausch medizinischer Bilddaten eingesetzt. Wir schätzen die langjährige Arbeit des Projekts an dieser Infrastruktur und die Sorgfalt, mit der die Maintainer diesen Bericht behandelt haben. Wir haben den Fund im Juni 2026 vertraulich an J4Care gemeldet; das Projekt hat konstruktiv reagiert und einen Fix veröffentlicht.

Auswirkung

  • Codeausführung im Archivprozess bringt den Zugriff mit sich, den das Archiv selbst auf den von ihm verwalteten Bildbestand hat. Gespeicherte Studien und die daran hängenden Patientenkennungen lassen sich lesen, verändern oder löschen. Unabhängig von der Codeausführung legt dasselbe Schreibprimitiv wohlgeformte Studien an gewählten Orten ab, sodass ein Archiv Bildmaterial vorhalten und später ausliefern kann, das kein bildgebendes Gerät erzeugt hat. Was das klinisch bedeutet, hängt davon ab, wie die empfangende Einrichtung das Archiv nutzt, und ist von dieser zu bewerten.
  • Die Bewertung bezieht sich auf die Bereitstellung, die die Projektdokumentation zuerst vorstellt und in der die Konfigurationsschnittstelle ohne Authentifizierung antwortet. Wird stattdessen der abgesicherte Build betrieben, verlangt die Konfigurationsschnittstelle lediglich die Basisrolle, die das mitgelieferte Konto mit geringen Rechten ohnehin besitzt. Die Kette bleibt dort für jeden authentifizierten Nutzer erreichbar und ist nicht geschlossen.

Abhilfe

Auf dcm4chee-arc-light 5.35.0 oder neuer aktualisieren, wo jeder Speicherpfad in seinem Wurzelverzeichnis gehalten wird und ein Wurzelverzeichnis innerhalb des Applikationsserver-Homes außerhalb des nun für Speicherung vorgesehenen Bereichs abgelehnt wird. Bis dahin lässt sich die Angriffsfläche verringern, indem Konfigurations- und Steuerungsschnittstellen sowie das LDAP-Konfigurationsbackend auf vertrauenswürdige Netze beschränkt und die konfigurierten Storage-Locations gegen die tatsächlich vorgesehenen Pfade geprüft werden.

Checkliste für Betreiber

  • Jeden konfigurierten Storage-Descriptor prüfen.

    Die Storage-Locations des Archivgeräts auflisten und jede Storage-URI gegen die Pfade halten, die die Installation tatsächlich nutzen soll. Dabei ist genau zu unterscheiden, was tatsächlich falsch ist: Der vom Release für Speicherung vorgesehene Bereich ist zulässig, und auch die Standardeinstellung vor 5.35.0 lag innerhalb des Applikationsserver-Homes unterhalb des Server-Datenverzeichnisses. Wer diese vorfindet, hat eine nicht migrierte Installation und keinen Einbruch. Aussagekräftig ist ein Wurzelverzeichnis, das auf das Deployments-Verzeichnis zeigt. Pfadvorlage und File-Open-Options derselben Descriptors gleich mitprüfen.

  • Den Deployment-Scanner abschalten, wo er nicht gebraucht wird.

    Der Schritt, der aus einem Schreibvorgang Codeausführung macht, ist die Aufnahme eines Archivs aus dem Deployments-Verzeichnis durch den Applikationsserver. Installationen, die einmal deployen und kein Hot-Deployment nutzen, können den Scanner abschalten. Das entfernt diesen Schritt für diesen Fund und für die im verwandten Advisory beschriebene Vendor-Data-Extraktion.

  • Konfigurations- und Steuerungsschnittstellen einschränken.

    Die Kette beginnt mit einem Konfigurationsschreibzugriff. Das Archiv bietet keine Möglichkeit, seine Geräteressource getrennt von gewöhnlichen Nutzern auf Administratoren zu beschränken, weshalb die Grenze außerhalb der Anwendung gezogen werden muss, an einem Reverse Proxy oder im Netz. Das LDAP-Konfigurationsbackend braucht dieselbe Behandlung.

  • Auf Studien prüfen, die kein Gerät gesendet hat.

    Die Integritätsseite dieses Funds hinterlässt gültiges, lesbares DICOM statt eines Absturzes. War die Konfigurationsschnittstelle exponiert, sollten gespeicherte Studien gegen die erwarteten Modalitäten und Sender abgeglichen werden, statt anzunehmen, dass alles, was das Archiv ausliefert, von einem bildgebenden Gerät stammt.

  • Ein exponiertes Archiv als offengelegt behandeln.

    War die Konfigurationsschnittstelle aus einem nicht vertrauenswürdigen Netz erreichbar, ist davon auszugehen, dass die in der Archivkonfiguration hinterlegten Zugangsdaten für Datenbank, Storage-Backends und LDAP-Backend bekannt sind. Diese sollten gewechselt werden.

Bewertung im Detail

AV:NDie Konfigurationsschnittstelle, über die der Storage-Descriptor gesetzt wird, ist eine HTTP-Ressource des Archivs, und der Schreibvorgang wird anschließend durch einen Speichervorgang aus dem Netz ausgelöst.AC:LKeine zeitlichen oder umgebungsabhängigen Voraussetzungen. Der Deployment-Scanner und das unveränderte Durchreichen binärer Bulk-Data gehören beide zum Standardverhalten.PR:NBewertet gegen die Bereitstellung, die das Projekt zuerst dokumentiert und in der die Konfigurationsschnittstelle ohne Authentifizierung antwortet. Auf dem abgesicherten Build wird daraus PR:L und damit 8.8.UI:NDen Speichervorgang, der den Schreibzugriff ausführt, setzt der Angreifer selbst ab; eine Handlung des Betreibers ist nicht nötig.S:UDie Auswirkung bleibt auf das Dienstkonto des Archivs und dessen Reichweite begrenzt.C:HCodeausführung legt gespeicherte Bilddaten, die Index-Datenbank und die Zugangsdaten offen, die das Archiv für seine Backend-Dienste hält.I:HUnabhängig von der Codeausführung legt das Schreibprimitiv lesbare Studien ab und überschreibt bei geänderten File-Open-Options bestehende.A:HDasselbe Primitiv überschreibt Dateien, die das Archiv zum Betrieb braucht, und Codeausführung kann den Dienst anhalten.

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.