Sanitized finding from Client B. Product names, network details and proof files are intentionally omitted.
Context
The assessed workstation exposed a DICOM service used to receive medical imaging data. The service accepted network input before a strong authentication boundary was established.
Finding
Fuzzing showed that recursively nested DICOM sequences were processed without a reliable maximum depth. A compact malformed object was enough to drive excessive stack and CPU consumption and terminate the parser process.
The issue was more serious because the parser was reachable through an unauthenticated C-STORE workflow. The result was a denial-of-service condition against a medical workstation rather than a local-only parser crash.
Technical workflow
The assessment combined protocol-level observation, bounded malformed fixtures and process telemetry. No production patient data was used. The request below shows the shape of the authorized retest with a sanitized fixture:
# Authorized lab only: bounded fixture, short timeout, no retry loop
curl --fail-with-body --max-time 5 \
-H 'Content-Type: application/dicom' \
--data-binary @fixtures/nested-sequence.dcm \
'https://AUTHORIZED_HOST/dicom/c-store'
The parser guard was also checked independently before sending a fixture to the service:
from pathlib import Path
MAX_BYTES = 1_048_576
MAX_DEPTH = 32
def read_bounded(path: str) -> bytes:
data = Path(path).read_bytes()
if len(data) > MAX_BYTES:
raise ValueError("fixture exceeds the parser byte budget")
return data
def accept_sequence(depth: int) -> None:
if depth > MAX_DEPTH:
raise ValueError("nested sequence depth exceeded")
The important control is not the client-side check: the same byte, depth, element-count and time budgets must be enforced inside the DICOM service before recursive processing. During validation I recorded HTTP status, parser exit state, CPU, memory and recovery time.
Impact
An attacker with network reachability could interrupt image reception or degrade the availability of the workstation. In a clinical workflow, availability has a direct operational and safety impact.
Remediation
- Enforce authentication and an allowlist of known application entities before parsing untrusted objects.
- Reject excessive sequence depth, object size and element counts before recursive processing.
- Upgrade the DICOM stack and add malformed-object regression tests to the release pipeline.
- Isolate the service at the network layer and monitor repeated parser failures.
Validation
Retest with bounded-depth and oversized nested-sequence cases. The service should reject the object without process termination, excessive resource use or workflow interruption.
Expected result: a bounded 4xx rejection, stable process health and a security log entry. A parser crash, unbounded memory growth or a delayed watchdog restart is a failed retest.