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.
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;
}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());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
Referenzen
- GHSA-rf29-xp3v-4wp3 (dcm4che)
- dcm4chee-arc-light Issue 4987 (Hersteller-Fix)
- dcm4chee-arc-light 5.35.0 Release
- dcm4chee-arc-light Repository
- Verwandt: XSLT-Attribute-Coercion in dcm4chee-arc-light
- Verwandt: XML External Entity Injection in dcm4chee-arc-light
- Verwandt: Vendor-Data-Extraktion in dcm4chee-arc-light
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.
