Orthanc DICOM Server
Heap-Buffer-Overflow im DICOM-Bilddecoder durch VR-UL-Dimensionen
Die DICOM-Frame-Größen-Berechnung von Orthanc nutzt 32-Bit-Arithmetik, und Orthanc lehnt Rows/Columns-Tags nicht ab, die statt der Standard-VR US (16 Bit) mit VR UL (32 Bit) kodiert sind. Manipulierte Bildmaße lassen die Multiplikation auf null überlaufen; eine nachgeschaltete memcpy verwendet anschließend die deklarierte Breite als Pitch und liest weit über den eigentlichen Pixelpuffer hinaus.
Beschreibung
DICOM definiert Rows (0028,0010) und Columns (0028,0011) als Value Representation US (Unsigned Short, 2 Bytes, max. 65535). In der Explicit-VR-Little-Endian-Transfer-Syntax wird die VR jedoch inline in der Datei kodiert statt aus dem Daten-Dictionary nachgeschlagen. DCMTK liest die in der Datei deklarierte VR und akzeptiert, was die Datei vorgibt. Orthanc übernimmt diese Werte ohne Prüfung, ob sie im VR-US-Bereich bleiben.
Ein Angreifer kodiert Rows und Columns mit VR UL (Unsigned Long, 4 Bytes) und liefert Werte bis zu 2^32 - 1. GetFrameSize() von Orthanc multipliziert diese anschließend in 32-Bit-Arithmetik:
OrthancFramework/Sources/DicomFormat/DicomImageInformation.cpp:473-476
// GetHeight() und GetWidth() liefern unsigned int (32 Bit) zurück.// GetHeight() * GetWidth() läuft in 32 Bit über, bevor die Promotion auf size_t greift.// Mit Rows=65536, Cols=65536: 65536 * 65536 = 2^32 → trunkiert auf 0return (GetHeight() * GetWidth() * GetBytesPerValue() * GetChannelCount());Mit Standard-VR-US-Werten kann die Multiplikation nicht überlaufen (max. 65535*65535 = 4.294.836.225, immer unterhalb von 2^32). Der VR-UL-Bypass ist daher essenziell, um den Überlauf herbeizuführen.
Nachgeschaltet setzt ImageProcessing::Copy() ein memcpy mit der deklarierten Breite als Pitch ab. Mit width=65536 deklariert, der tatsächliche Pixelpuffer aber nur 64 Bytes groß, liest das Kopieren 65536 Bytes über das Ende des Pixelpuffers hinaus:
OrthancFramework/Sources/Images/ImageProcessing.cpp:576
// memcpy verwendet die deklarierte Breite als Pitch (65536),// der Pixeldatenpuffer ist jedoch nur 64 Bytes großmemcpy(target, source, pitch);Der gesamte manipulierte DICOM-Payload umfasst 876 Bytes. AddressSanitizer verortet den Out-of-Bounds-Zugriff in ImageProcessing.cpp:576, unmittelbar hinter einer 64-Byte-Heap-Region:
AddressSanitizer-Trace
==1==ERROR: AddressSanitizer: heap-buffer-overflow on address 0xffff9783ca20READ of size 65536 at 0xffff9783ca20 thread T18 #0 in __interceptor_memcpy #1 in memcpy string_fortified.h:29 #2 in Orthanc::ImageProcessing::Copy() ImageProcessing.cpp:576 #3 in Orthanc::ImageProcessing::Convert() ImageProcessing.cpp:689 #4 in Orthanc::DicomImageDecoder::DecodeUncompressedImage() DicomImageDecoder.cpp:607 #5 in Orthanc::DicomImageDecoder::Decode() DicomImageDecoder.cpp:827 #6 in Orthanc::ParsedDicomFile::DecodeFrame() ParsedDicomFile.cpp:1823 #7 in Orthanc::ServerContext::DecodeDicomFrame() ServerContext.cpp:1921
0xffff9783ca20 is located 0 bytes to the right of 64-byte region [0xffff9783c9e0,0xffff9783ca20)allocated by thread T18 here: #0 in operator new[] #1 in DcmElement::newValueField() dcelem.cc:788Auf einem Standard-Build läuft die memcpy über die kleine Heap-Region hinaus und der Orthanc-Prozess terminiert. Die Erreichbarkeit entspricht den beiden Pfaden von CVE-2026-5445 (DecodeLookupTable): authentisierter HTTP-Upload + Vorschau, oder unauthentifizierte C-STORE-Ablage auf Port 4242 unter dem Default DicomAlwaysAllowStore: true. Sobald gespeichert, lässt jede Vorschau-Anfrage durch eine beliebige Person den Server abstürzen — das manipulierte DICOM ist persistent und reproduziert den Absturz bei jedem Render-Vorgang.
Der VR-UL-Dimensions-Bypass ist außerdem die Voraussetzung für die Schwester-Schwachstelle CVE-2026-5443, die denselben Überlauf in der PALETTE-COLOR-Validierung und Decodierung ausnutzt. Eine einzige Dimensions-Validierung zur Parse-Zeit behebt beide Schwachstellen.
Auswirkung
- Persistenter Denial-of-Service: Eine einzelne gespeicherte 876-Byte-DICOM-Datei lässt den Orthanc-Prozess bei jeder Vorschau-Anfrage durch eine beliebige Person abstürzen. Ein Neustart stellt den Dienst wieder her, doch das manipulierte DICOM verbleibt; jede nachfolgende Vorschau lässt den Server erneut abstürzen.
- Heap-Read-Primitive: Die
memcpyliest 65536 Bytes aus einem 64-Byte-Puffer und reicht damit in benachbarte Heap-Allokationen hinein. Ein Ausführen von beliebigem Programmcode innerhalb der Sicherheitsautorität des Orthanc-Prozesses wurde nicht nachgewiesen; die Form der Primitive (großer, zusammenhängender Lesezugriff mit angreifer-kontrollierter Länge) macht sie zu einem plausiblen Ziel für weitere Exploitation-Forschung. - In Orthancs Default-Konfiguration (
DicomAlwaysAllowStore: true) ist das Ablegen unauthentifiziert; der Auslöser benötigt nur eine Vorschau-Anfrage einer beliebigen Read-Level-Person.
Abhilfe
Aktualisieren Sie Orthanc auf Version 1.12.11 oder höher. Der Patch führt sowohl eine Dimensionsvalidierung zur Parse-Zeit (Ablehnung von Rows/Columns-Werten oberhalb 65535, der VR-US-Obergrenze) als auch 64-Bit-Arithmetik mit expliziten Überlaufprüfungen in GetFrameSize() durch. Als sofortige Defense-in-Depth-Maßnahme setzen Sie DicomAlwaysAllowStore: false in orthanc.json und konfigurieren eine AET-Allowlist, was den unauthentifizierten Ablegevektor schließt.
Checkliste für Betreiber
Version prüfen.
curl -u <user>:<pass> http://<orthanc>:8042/system | jq .Version— der gepatchte Bereich beginnt bei 1.12.11.Unauthentifizierten C-STORE-Ablegevektor schließen.
Setzen Sie
DicomAlwaysAllowStore: falseinorthanc.jsonund definieren Sie eine expliziteDicomModalities-Allowlist legitimer AETs. Andernfalls kann jeder Host, der Port 4242 erreicht, die persistent abstürzende DICOM-Datei unauthentifiziert ablegen.DICOM-Speicher vor dem Patch in Quarantäne und prüfen.
Durchsuchen Sie den Speicher nach Studien, deren
RowsoderColumns65535 überschreiten — nur mit VR-UL-Kodierung möglich und konstruktionsbedingt manipuliert, da DICOM diese Tags als VR US (max. 65535) definiert. Vor dem Patch in Quarantäne geben, da die nächste Vorschau-Anfrage den Server abstürzen lässt.Vorschau-Berechtigungen prüfen.
Sobald eine manipulierte Studie gespeichert ist, lässt jede Read-Level-Person, die
GET /instances/*/previewaufruft, den Prozess abstürzen. Beschränken Sie den Vorschau-Zugriff am Reverse-Proxy auf die IPs der Integrationspunkte und Viewer, die ihn benötigen.Auf Crash-Restart-Zyklen nach Vorschau-Anfragen achten.
Alarmieren Sie auf Orthanc-Neustarts (
journalctl -u orthanc | grep -E 'SIGSEGV|killed'), die unmittelbarGET /instances/*/preview-Logeinträgen folgen. Wiederholte Abstürze derselben Study-ID deuten auf einen gespeicherten Angriff hin.Crash-Recovery konfigurieren.
Bis der Speicher von der manipulierten Studie bereinigt ist, lässt jede Vorschau den Prozess abstürzen. Eine enge Service-Überwachung (systemd, Kubernetes Liveness Probes, Docker
--restart) hält den Dienst zwischen den Anfragen verfügbar, behebt die Schwachstelle aber nicht.
Bewertung im Detail
DicomAlwaysAllowStore: true unauthentifizierte Requests akzeptiert.UI:NKeine Interaktion durch eine zweite Person erforderlich; Ablegen und Auslösen können von derselben Person durchgeführt werden.S:UNur der Orthanc-Prozess ist betroffen; über diese Primitive sind keine prozessübergreifenden Ressourcen erreichbar.C:HPlausibles Ausführen von beliebigem Programmcode innerhalb der Sicherheitsautorität des Orthanc-Prozesses legt Prozessspeicher und alle vom Prozess lesbaren Daten offen. Nicht nachgewiesen.I:HDieselbe Primitive innerhalb derselben Autorität erlaubt eine Modifikation von In-Memory-Zuständen und aller Daten, die der Prozess schreiben kann. Nicht nachgewiesen.A:HPersistenter Absturz: Das gespeicherte DICOM lässt den Prozess bei jeder Vorschau-Anfrage durch beliebige Personen abstürzen.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.
