Alle Sicherheitshinweise

dcm4chee-arc-light

Remote Code Execution über Vendor-Data-Extraktion

Das Archiv kann ein Vendor-Data-ZIP in seiner eigenen Konfiguration mitführen und entpackt es, sobald Konfiguration geladen wird. Weder die Namen der Einträge in diesem ZIP noch das Verzeichnis, in das sie entpackt werden, waren eingegrenzt: Der Eintragsname wurde ohne Eingrenzungsprüfung gegen das Entpackverzeichnis aufgelöst, und das Entpackverzeichnis ist selbst ein Konfigurationswert, der über dieselbe Schnittstelle geschrieben wird. Wer die Archivkonfiguration schreiben kann, legt damit eine Datei an einem Pfad seiner Wahl ab und lässt sie, indem er das vom Applikationsserver überwachte Deployments-Verzeichnis anvisiert, im Dienstkonto des Archivs deployen und ausführen.

Verfasst vonVolker Schönefeld, Simon Weber2026-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.35.0.Behoben in5.35.1CVEAusstehendGHSAGHSA-hxq8-xgh3-4f76

Beschreibung

Ein dcm4che-Gerät kann beliebige binäre Vendor-Data in seiner Konfiguration mitführen. Ist der Konfigurationswert dcmUnzipVendorDataToURI gesetzt, behandelt das Archiv diesen Blob als ZIP und entpackt ihn in das benannte Verzeichnis, sowohl beim Start als auch bei jedem Konfigurations-Reload. Die Entpackschleife löst jeden Eintragsnamen gegen das Entpackverzeichnis auf und schreibt ihn heraus:

ArchiveDeviceProducer.java:129-142

Path basePath = Paths.get(URI.create(StringUtils.replaceSystemProperties(unzipTo)));
ZipInputStream input = new ZipInputStream(new ByteArrayInputStream(vendorData[0]));
ZipEntry entry;
try {
while ((entry = input.getNextEntry()) != null) {
if (!entry.isDirectory()) {
Path filePath = basePath.resolve(entry.getName());
Files.createDirectories(filePath.getParent());
Files.copy(input, filePath, StandardCopyOption.REPLACE_EXISTING);
}
}
} catch (IOException e) {
LOG.error("Failed to extract Device Vendor Data", e);
}

View source →

Path.resolve() grenzt sein Argument nicht ein. Ein Eintragsname mit Traversal-Segmenten löst zu einem Pfad außerhalb von basePath auf, und ein absoluter Eintragsname ersetzt es vollständig. Es gibt keinen normalize()-Aufruf und keine Prüfung, ob das Ergebnis noch mit basePath beginnt. Damit entscheidet das ZIP und nicht das Archiv, wohin jede Datei geschrieben wird. Files.createDirectories(filePath.getParent()) legt anschließend an, welche Zwischenverzeichnisse der gewählte Pfad braucht.

Das ist die erste von zwei Varianten. Die zweite überlebt den Fix an den Eintragsnamen, weil auch das Entpackverzeichnis nicht feststeht:

VarianteBetroffenGesteuerter WertEingrenzung
Traversierender Eintragsnamebis 5.34.3ZIP-EintragsnameKeine; resolve() ohne normalize() oder Präfixprüfung
Umgebogenes Entpackverzeichnis5.35.0dcmUnzipVendorDataToURIEintragsnamen eingegrenzt, aber das Basisverzeichnis stammt aus der Konfiguration

Beide Varianten enden an derselben Stelle. Die ausgelieferte Distribution läuft auf WildFly mit aktiviertem Deployment-Scanner auf standalone/deployments, sodass ein Webanwendungsarchiv, das in diesem Verzeichnis auftaucht, ohne weiteres Zutun aufgenommen und deployt wird. Das Standard-Entpackverzeichnis liegt unter demselben Applikationsserver-Home, was den Traversal-Weg kurz macht. Der Code läuft anschließend unter dem Betriebssystemkonto, unter dem das Archiv betrieben wird.

Die Konfigurationsschnittstelle, die sowohl den Vendor-Data-Blob als auch den Wert dcmUnzipVendorDataToURI trägt, ist die Gerätekonfigurationsressource des Archivs; der Reload, der das Entpacken auslöst, liegt auf dessen Steuerungsressource. In der Standardbereitstellung verlangt keine der beiden eine Authentifizierung (siehe die Anmerkung zur Bereitstellung unter Auswirkung), sodass die gesamte Abfolge einem anonymen Aufrufer offensteht.

Der Fix weist Vendor-Data-ZIP-Einträge zurück, die außerhalb des Entpackverzeichnisses landen, und schränkt zusätzlich ein, wohin das Entpackverzeichnis zeigen darf, sodass sich keiner der beiden Teile allein aus der Konfiguration heraus erreichen lässt. Das Verzeichnis darf unterhalb des temporären Bereichs des Applikationsservers oder vollständig außerhalb des Applikationsserver-Homes liegen; abgelehnt wird der übrige Teil dieses Homes und vor allem das Deployments-Verzeichnis. Die zweite Hälfte wurde in einem späteren Release behoben als die übrigen Funde dieser Reihe, weshalb dieses Advisory eine andere behobene Version trägt.

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. Der Prozess verwahrt die gespeicherten DICOM-Objekte und die Datenbank, die sie indexiert. Studien und die daran hängenden Patientenkennungen lassen sich daher lesen, verändern oder löschen, und die Zugangsdaten, die das Archiv für seine eigenen Backend-Dienste hält, sind in diesem Kontext lesbar.
  • Unabhängig vom Deployment-Schritt ist dasselbe Primitiv ein beliebiger Schreibzugriff im Dienstkonto des Archivs. Dateien außerhalb des Deployments-Verzeichnisses lassen sich anlegen oder ersetzen, was die Konfiguration des Applikationsservers sowie jedes Startskript und jeden Trust Store erreicht, die das Konto schreiben kann.
  • 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.1 oder neuer aktualisieren, wo Vendor-Data-ZIP-Einträge außerhalb des Entpackverzeichnisses zurückgewiesen und das Entpackverzeichnis auf den temporären Bereich des Applikationsservers oder einen Ort vollständig außerhalb des Applikationsserver-Homes begrenzt wird. Zu beachten: 5.35.0 schließt nur die erste Variante. Bis dahin lässt sich die Angriffsfläche verringern, indem dcmUnzipVendorDataToURI ungesetzt bleibt, was das Entpacken vollständig abschaltet, indem Konfigurations- und Steuerungsschnittstellen sowie das LDAP-Konfigurationsbackend auf vertrauenswürdige Netze beschränkt werden, und indem der Deployment-Scanner des Applikationsservers auf Installationen ohne Hot-Deployment deaktiviert wird.

Checkliste für Betreiber

  • Prüfen, ob die Vendor-Data-Extraktion überhaupt aktiv ist.

    Entpackt wird nur, wenn dcmUnzipVendorDataToURI am Archivgerät gesetzt ist. Nutzt die Installation keine Vendor-Data, entfällt der Code-Pfad, wenn der Wert ungesetzt bleibt. Den aktuellen Wert im LDAP- oder JSON-Konfigurationsbackend nachsehen, statt die Voreinstellung anzunehmen.

  • Auf 5.35.1 aktualisieren, nicht auf 5.35.0.

    5.35.0 behebt den traversierenden Eintragsnamen, erlaubt aber weiterhin, das Entpackverzeichnis über die Konfiguration umzubiegen. Erst 5.35.1 schränkt ein, wohin dieses Verzeichnis zeigen darf, und die Form der Einschränkung ist zu beachten: Ein Verzeichnis außerhalb des Applikationsserver-Homes bleibt zulässig, sodass eine Installation, die Vendor-Data an einen eigenen Pfad anderswo im Dateisystem entpackt, weiterhin funktioniert. Wer wegen der übrigen Funde dieser Reihe bereits auf 5.35.0 gegangen ist, hat diesen hier noch offen.

  • Konfigurations- und Steuerungsschnittstellen einschränken.

    Beide Varianten beginnen mit einem Konfigurationsschreibzugriff und einem Reload. Das Archiv bietet keine Möglichkeit, seine Geräte- und Steuerungsressourcen 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, da ein Schreibzugriff dort denselben Code-Pfad erreicht.

  • 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 den im verwandten Advisory beschriebenen Storage-Descriptor-Schreibzugriff.

  • 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:NKonfigurations- und Steuerungsschnittstelle sind HTTP-Ressourcen des Archivs und überall dort erreichbar, wo das Archiv erreichbar ist.AC:LKeine zeitlichen, Race- oder umgebungsabhängigen Voraussetzungen. Standard-Entpackverzeichnis und Deployment-Scanner gehören beide zur Standardkonfiguration.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:NDas Entpacken läuft beim Konfigurations-Reload, den dieselbe Schnittstelle auslöst.S:UDie Auswirkung bleibt auf das Dienstkonto des Archivs und dessen Reichweite begrenzt; Applikationsserver und Archiv sind dieselbe Sicherheitsinstanz.C:HCodeausführung legt gespeicherte Bilddaten, die Index-Datenbank und die Zugangsdaten offen, die das Archiv für seine Backend-Dienste hält.I:HBereits das Schreibprimitiv verändert Dateien im Dienstkonto; Codeausführung dehnt das auf den Bildbestand aus.A:HDasselbe Primitiv ersetzt 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.