← All write-ups
December 1, 2025CRITICALCLIENT FINDING

Unauthenticated DICOM parser denial of service

2025 · Client B · Healthtech & medical devices

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

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.