Orthanc DICOM Server
GZIP-Dekompressionsbombe über Content-Encoding-Header
Orthanc dekomprimiert Request-Bodies, die mit Content-Encoding: gzip gesendet werden, indem es den gzip-ISIZE-Trailer (die letzten 4 Bytes des Streams, vom Angreifer kontrolliert) liest und einen Ausgabepuffer dieser deklarierten Größe vorab allokiert — ohne Obergrenze. Ein kleiner gzip-Payload, der ~4 GB deklariert, löst pro Anfrage eine riesige Allokation aus.
Beschreibung
Enthält ein POST /instances-Request den Header Content-Encoding: gzip, dekomprimiert Orthanc den Body vor dem Parsen als DICOM. Der Einstiegspunkt liegt im REST-Handler:
OrthancServer/Sources/OrthancRestApi/OrthancRestApi.cpp:232-237
if (boost::iequals(call.GetHttpHeader("content-encoding", ""), "gzip")){ GzipCompressor compressor; compressor.Uncompress(dicom, call.GetBodyData(), call.GetBodySize());}GzipCompressor::Uncompress ermittelt die unkomprimierte Größe durch Lesen des gzip-ISIZE-Trailers — der letzten 4 Bytes des komprimierten Streams, ein vom Angreifer kontrollierter Wert — und nutzt ihn zur Dimensionierung des Ausgabepuffers:
OrthancFramework/Sources/Compression/GzipCompressor.cpp (GuessUncompressedSize)
uint64_t GzipCompressor::GuessUncompressedSize(const void* compressed, size_t compressedSize){ const uint8_t* p = reinterpret_cast<const uint8_t*>(compressed) + compressedSize - 4; return ((static_cast<uint32_t>(p[0]) << 0) + // angreifer-kontrolliert (static_cast<uint32_t>(p[1]) << 8) + // max ~4 GB (uint32) (static_cast<uint32_t>(p[2]) << 16) + (static_cast<uint32_t>(p[3]) << 24));}OrthancFramework/Sources/Compression/GzipCompressor.cpp (Uncompress)
uncompressedSize = GuessUncompressedSize(compressed, compressedSize);uncompressed.resize(static_cast<size_t>(uncompressedSize)); // keine ObergrenzeEin Angreifer komprimiert 64 Null-Bytes (Ergebnis: ein 24 Byte großer gzip-Stream) und patcht das abschließende ISIZE-Feld auf 0xFFFFFFFF (~4 GB). Auf Linux mit Default-Memory-Overcommit gelingt resize() optimistisch und die Null-Initialisierung committet physischen Speicher Seite für Seite während der Page-Fault-Behandlung. Zwanzig parallele Requests allokieren zusammen rund 80 GB, und der OOM-Killer beendet den Prozess mit Exit-Code 137. Der gesamte Angriffs-Payload umfasst 480 Bytes (20 × 24-Byte-gzip-Streams).
Der Geschwister-ZlibCompressor-Pfad ist von Angreifer-Eingaben aus nicht erreichbar — alle Aufrufer in Orthanc übergeben intern komprimierte Daten mit vertrauenswürdigen Größen-Präfixen. Der Angriffsvektor verläuft ausschließlich über GzipCompressor per HTTP-Header Content-Encoding: gzip.
Authentifizierung ist erforderlich: Die Auth-Prüfung in HttpServer.cpp:1298 läuft vor der gzip-Dekomprimierung in OrthancRestApi.cpp:232. Diese Schwachstelle gehört zur selben Klasse von „Den-Metadaten-Vertrauen"-Bugs wie CVE-2026-5440 (unbegrenzte Content-Length) und CVE-2026-5439 (gefälschtes ZIP-uncompressed_size).
Auswirkung
- Denial-of-Service: Eine Welle von ~20 parallelen HTTP-Requests (jeweils ein 24 Byte großer gzip-Stream mit gepatchtem ISIZE) beendet den Orthanc-Prozess über den Linux-OOM-Killer (Exit-Code 137).
- Der gesamte Angriffs-Payload umfasst 480 Bytes (20 × 24-Byte-gzip-Streams). Keine gültigen DICOM-Daten erforderlich, nur das gzip-Framing mit gepatchtem ISIZE-Trailer.
- Der Server muss nach jedem Absturz neu gestartet werden und ist sofort wieder gegen denselben Angriff anfällig.
Abhilfe
Aktualisieren Sie Orthanc auf Version 1.12.11 oder höher. Der Patch begrenzt das Resize gegen eine konfigurierbare maximale dekomprimierte Größe und weist Payloads oberhalb dieses Limits mit BadFileFormat ab. Als Defense-in-Depth konfigurieren Sie an Ihrem Reverse-Proxy eine harte Content-Length-Obergrenze — typischerweise einige hundert MB — was zusätzlich die unbegrenzte Content-Length-Allokation in CVE-2026-5440 und die gefälschte ZIP-Allokation in CVE-2026-5439 eindämmt.
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.Request-Größe am Reverse-Proxy begrenzen.
Konfigurieren Sie eine
Content-Length-Obergrenze passend zu Ihrer DICOM-Workload (client_max_body_size 512m;in nginx). Die gzip-Bombe löst die ~4-GB-Allokation unabhängig von der Upload-Größe aus, doch ein Pro-Request-Body-Limit deckt die Familie der „Metadaten-Vertrauen"-Bomben ab (diese Schwachstelle plusCVE-2026-5440undCVE-2026-5439).Content-Encoding: gzip deaktivieren, falls ungenutzt.
Senden Ihre DICOM-Upload-Clients keine gzip-komprimierten Bodies, entfernen Sie den
Content-Encoding-Header an Ihrem Reverse-Proxy. Der HTTP-Pfad, derGzipCompressorauslöst, hängt vollständig an diesem Header.Zugangsdaten überprüfen.
Jede authentisierte Person mit
POST /instances-Rechten kann die Schwachstelle auslösen. Prüfen SieRegisteredUsersinorthanc.jsonund ein externes Authentifizierungsbackend; widerrufen Sie ungenutzte oder überprivilegierte API-Tokens.Auf OOM-Restart-Zyklen achten.
Alarmieren Sie auf wiederholte SIGKILL-Exits in Ihrer Service-Überwachung (z. B.
journalctl -u orthanc | grep -E 'killed|OOM|exit code 137'). Ein wiederkehrender Zyklus deutet auf laufende Ausnutzung statt auf ein einmaliges Ressourcenereignis hin.
Bewertung im Detail
POST /instances mit Content-Encoding: gzip erreichbar.AC:LEin einzelner 24 Byte großer gzip-Stream mit gepatchtem ISIZE-Trailer; keine Timing- oder Umgebungsvorbedingungen.PR:NDer publizierte Vektor spiegelt Deployments wider, in denen Orthanc ohne HTTP-Authentifizierung exponiert ist, was Orthanc per Konfiguration erlaubt. Bei aktivem AuthenticationEnabled läuft die Auth-Prüfung vor der gzip-Dekomprimierung, sodass nur ein authentisierter Aufrufer die Allokation auslösen kann.UI:NKeine Interaktion durch eine zweite Person erforderlich.S:UDer OOM-Killer beendet den Orthanc-Prozess; betroffen ist der Prozess selbst.C:NKeine Informationen werden gelesen oder offengelegt.I:NEs werden keine Zustände modifiziert.A:HAnhaltende Beendigung des Orthanc-Prozesses; ein Neustart stellt den Dienst wieder her, lässt den Prozess aber sofort wieder angreifbar.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.
