Back to Intelligence

CVE-2026-97851 & 5 More Critical Flaws in dcm4chee-arc-light 5.35.1 — Healthcare Detection and Remediation Guide

SA
Security Arsenal Team
October 15, 2026
11 min read

CISA published ICS Medical Advisory ICSMA-26-288-02 covering six vulnerabilities in J4Care dcm4chee-arc-light 5.35.1, one of the most widely deployed open-source DICOM archive and PACS (Picture Archiving and Communication System) platforms in the world. The weaknesses disclosed — Missing Authorization, Missing Authentication for Critical Function, Infinite Loop, and Inefficient Algorithmic Complexity — carry a maximum CVSS v3 score of 9.1 (Critical).

The impact statement from the advisory is as blunt as anything I've seen in a medical device advisory: successful exploitation could allow an attacker to delete stored medical images, disclose patient information, inject forged studies, reassign patient records, overwrite files, and cause a denial-of-service condition.

Let that sink in from a clinical safety perspective. This isn't just a HIPAA breach scenario — an attacker who can inject forged studies or reassign patient records can cause a radiologist to read the wrong image for the wrong patient. That's a patient-safety event, not just an IT incident.

Affected Products and Vulnerabilities

ProductAffected VersionCVEs
dcm4chee-arc-light5.35.1CVE-2026-97851, CVE-2026-107621, CVE-2026-105273, CVE-2026-101021, CVE-2026-105279, CVE-2026-105667

Weakness Classes

The advisory maps the six CVEs to four CWE categories:

  1. Missing Authorization (CWE-862) — authenticated or unauthenticated users can invoke archive functions they should not have access to. This is the class behind the ability to delete stored images, reassign patient records, and overwrite files.
  2. Missing Authentication for Critical Function (CWE-306) — critical archive operations are exposed without any authentication requirement at all. In practice this means anyone who can reach the archive's web or DICOM interface can perform destructive or PHI-disclosing actions.
  3. Loop with Unreachable Exit Condition / 'Infinite Loop' (CWE-835) — a crafted request or DICOM object can hang processing threads indefinitely.
  4. Inefficient Algorithmic Complexity (CWE-407) — algorithmic complexity denial-of-service, where a small malicious input forces disproportionate resource consumption.

The last two combine into a reliable denial-of-service against the archive — meaning modalities can't store new studies and clinicians can't retrieve priors. In an emergency department, that's an operational crisis.

How Exploitation Works — Defender's View

From an IR perspective, the attack surface here is predictable to anyone who's assessed PACS infrastructure:

  • dcm4chee-arc-light is a Java application deployed on WildFly/JBoss, typically fronted by HTTP/HTTPS on 8080/8443, a DICOM listener (default 11112), and a management console (9990). It is frequently reachable far more broadly than it should be — flat clinical VLANs, VPN ranges, and occasionally (inexcusably) the public internet.
  • Because the core weaknesses are missing authentication and authorization, exploitation requires no credentials, no phishing, and no malware. Network reachability to the archive's web UI, REST API (/dcm4chee-arc/), or DICOM services is sufficient.
  • The attack chain is trivially simple: enumerate the archive's REST endpoints → invoke unauthenticated study/series manipulation functions → delete, overwrite, or reassign studies → exfiltrate PHI via the same unauthenticated query/retrieve paths → optionally trigger the algorithmic complexity or infinite-loop condition to take the archive offline and destroy forensic timing.

Exploitation status: As of the advisory's publication, CISA reports no known public exploitation of these specific CVEs. That is a narrow window, not a comfort. dcm4chee is open source, the attack surface is well documented, and PACS systems are routinely found exposed on Shodan. Treat this as exploitable-by-design until patched and segmented.

Detection & Response

Because these are missing-auth flaws in a Java web application, your best telemetry is network and web-tier, not endpoint malware signatures. Prioritize: (1) HTTP access logs from the archive and any reverse proxy, (2) Syslog/CEF ingestion of WildFly and OS logs into Sentinel, and (3) network flow data around the archive host.

The following rules are tuned to fire on behavior that should never legitimately happen — unauthenticated destructive operations against the archive and process/network anomalies on the archive host — rather than on generic web noise.

YAML
---
title: Unauthenticated Destructive or Patient-Record Operation Against dcm4chee Archive
id: 3f9c1a72-6b44-4e58-9d21-7a2c5e8f0b31
status: experimental
description: Detects HTTP DELETE/PUT/POST requests to dcm4chee-arc REST endpoints associated with study deletion, patient reassignment, or record overwrite — operations that, per ICSMA-26-288-02, are exposed via missing authentication/authorization in dcm4chee-arc-light 5.35.1.
references:
  - https://www.cisa.gov/news-events/ics-medical-advisories/icsma-26-288-02
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.impact
  - attack.t1485
  - attack.t1565
logsource:
  category: webserver
detection:
  selection_uri:
    cs-uri|contains:
      - '/dcm4chee-arc/aets/'
      - '/dcm4chee-arc/patients/'
      - '/dcm4chee-arc/queue/'
      - '/dcm4chee-arc/monitor/'
  selection_method:
    cs-method:
      - 'DELETE'
      - 'PUT'
      - 'POST'
  condition: selection_uri and selection_method
falsepositives:
  - Legitimate archive administration from authorized workstations — baseline admin source IPs and filter by c-ip
level: high
---
title: dcm4chee Archive Host Process Anomaly — Command Shell Spawned by Java/WildFly
id: 8b2e4d61-1a9f-4c37-b5e6-2d7f0a3c94e8
status: experimental
description: Detects the Java/WildFly process hosting dcm4chee-arc spawning shell or system utilities, consistent with post-exploitation activity on a compromised PACS archive server.
references:
  - https://www.cisa.gov/news-events/ics-medical-advisories/icsma-26-288-02
  - https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.execution
  - attack.t1059
logsource:
  category: process_creation
  product: linux
detection:
  selection_parent:
    ParentImage|contains:
      - 'java'
      - 'standalone.sh'
      - 'wildfly'
      - 'jboss'
  selection_child:
    Image|endswith:
      - '/sh'
      - '/bash'
      - '/dash'
      - '/curl'
      - '/wget'
      - '/nc'
      - '/ncat'
      - '/python'
      - '/python3'
  condition: selection_parent and selection_child
falsepositives:
  - Rare; some WildFly management scripts invoke shells during startup — tune against known startup windows and init scripts
level: critical
---
title: Denial-of-Service Pattern — High-Volume Repeated Requests to dcm4chee Archive Endpoints
id: 5c7a9f23-4d18-4e60-a8b2-9f3e6d1c07a4
status: experimental
description: Detects sustained high-volume or repetitive requests from a single source to dcm4chee-arc endpoints, consistent with the infinite-loop (CWE-835) and algorithmic complexity (CWE-407) denial-of-service conditions described in ICSMA-26-288-02.
references:
  - https://www.cisa.gov/news-events/ics-medical-advisories/icsma-26-288-02
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.impact
  - attack.t1499
logsource:
  category: webserver
detection:
  selection:
    cs-uri|contains:
      - '/dcm4chee-arc/'
  condition: selection | count(c-ip) by cs-uri > 500
falsepositives:
  - Bulk study migration or QA tooling — whitelist known migration source hosts and scheduled maintenance windows
level: medium

Note on the third rule: threshold-based counting isn't native to all Sigma backends — if your pipeline doesn't support count(), implement the equivalent aggregation in your SIEM (the KQL below covers this natively).

KQL — Microsoft Sentinel / Defender
// Hunt: unauthenticated/destructive operations and DoS patterns against dcm4chee-arc
// Assumes archive web access logs or reverse proxy logs ingested via Syslog/CEF
let Lookback = 24h;
let ArchiveHosts = dynamic(["pacs", "dcm4chee", "dicom", "arc-light"]);
union isfuzzy=true
    (CommonSecurityLog
    | where TimeGenerated >= Lookback
    | where DeviceVendor =~ "Apache" or DeviceVendor =~ "nginx" or DeviceCustomString1 has_any (ArchiveHosts)
    | where RequestURL has_any ("/dcm4chee-arc/aets/", "/dcm4chee-arc/patients/", "/dcm4chee-arc/queue/")
    | where RequestMethod in~ ("DELETE", "PUT", "POST")
    | project TimeGenerated, SourceIP, RequestMethod, RequestURL, DeviceCustomString1, _ResourceId),
    (Syslog
    | where TimeGenerated >= Lookback
    | where SyslogMessage has_any ("/dcm4chee-arc/aets/", "/dcm4chee-arc/patients/", "/dcm4chee-arc/queue/")
    | where SyslogMessage has_any ("DELETE", "PUT", "POST")
    | extend RequestSource = extract(@'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', 1, SyslogMessage)
    | project TimeGenerated, Computer, RequestSource, SyslogMessage)
| summarize Operations = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated)
  by SourceIP = coalesce(SourceIP, RequestSource), RequestURL
| where Operations > 5   // any meaningful volume of destructive ops from one source warrants review
| sort by Operations desc;

// Hunt: request-volume anomaly per source against the archive (DoS via CWE-835 / CWE-407)
Syslog
| where TimeGenerated >= 6h
| where SyslogMessage has "/dcm4chee-arc/"
| extend SourceIP = extract(@'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', 1, SyslogMessage)
| summarize Requests = count(), DistinctEndpoints = dcount(extract(@'(/dcm4chee-arc/[^ \"]*)', 1, SyslogMessage)) by SourceIP, bin(TimeGenerated, 5m)
| where Requests > 1000
| sort by Requests desc;
VQL — Velociraptor
-- Hunt the dcm4chee archive host: unexpected child processes of Java/WildFly
-- and inbound connections to DICOM/web listeners from non-clinical subnets
LET proc_hunt = SELECT Pid, Ppid, Name, Exe, CommandLine, Username, CreateTime
FROM pslist()
WHERE (Exe =~ 'java' OR CommandLine =~ 'wildfly|jboss|dcm4chee')
   OR (Name =~ 'sh|bash|curl|wget|nc|python' AND Ppid IN (
        SELECT Pid FROM pslist() WHERE Exe =~ 'java'))

LET net_hunt = SELECT Pid, Name, LocalAddr, LocalPort, RemoteAddr, RemotePort, Status
FROM netstat()
WHERE LocalPort IN (11112, 2762, 8080, 8443, 9990)
   AND Status =~ 'ESTABLISHED|LISTEN'

SELECT * FROM proc_hunt
UNION ALL
SELECT Pid, Ppid=NULL, Name, Exe=NULL,
       CommandLine=format(format='%v:%v <- %v:%v [%v]',
          args=[LocalAddr, LocalPort, RemoteAddr, RemotePort, Status]),
       Username=NULL, CreateTime=NULL
FROM net_hunt
Bash / Shell
#!/bin/bash
# dcm4chee-arc-light exposure check and interim hardening (run on the archive host)
# Reference: CISA ICSMA-26-288-02

echo "=== 1. Identify running dcm4chee version ==="
# Check the deployment directory / WildFly deployments for the archive version
find / -name "dcm4chee-arc-*.war" -o -name "dcm4chee-arc-light*" 2>/dev/null | head -20
# If deployed in Docker:
docker ps --format '{{.Names}} {{.Image}}' 2>/dev/null | grep -i dcm4chee

echo "=== 2. Verify listener exposure ==="
# DICOM 11112, HTTP 8080, HTTPS 8443, WildFly mgmt 9990 — mgmt must never be broadly reachable
ss -tlnp | grep -E ':(11112|2762|8080|8443|9990)\b'

echo "=== 3. Confirm management interface is loopback-only ==="
# 9990 bound to 0.0.0.0 = immediate finding. Restrict in standalone.xml:
#   <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>

echo "=== 4. Emergency containment: restrict DICOM/web ports to clinical subnets ==="
# Adjust subnets to your modality/RIS networks — EXAMPLE ONLY, validate before applying
# firewall-cmd --permanent --new-zone=pacs
# firewall-cmd --permanent --zone=pacs --add-source=10.20.0.0/16   # clinical VLAN
# firewall-cmd --permanent --zone=pacs --add-port=11112/tcp
# firewall-cmd --permanent --zone=pacs --add-port=8443/tcp
# firewall-cmd --reload

echo "=== 5. Capture forensic evidence of prior unauthenticated access BEFORE patching ==="
# WildFly access/audit logs and DICOM association logs
tar czf /tmp/dcm4chee-logs-$(date +%F).tgz \
  /opt/wildfly/standalone/log/ 2>/dev/null
find / -path '*/dcm4chee*' -name '*.log' -mtime -30 2>/dev/null | head -50

echo "=== 6. Check for unexpected studies/patient-record churn in the archive DB ==="
# Review archive audit logs for DELETE/MOVE/merge patient operations you cannot attribute
# to scheduled reconciliation workflows before assuming the archive is clean.

Remediation

  1. Patch immediately. Upgrade dcm4chee-arc-light 5.35.1 to the fixed release identified in the J4Care advisory. Review the CISA advisory at https://www.cisa.gov/news-events/ics-medical-advisories/icsma-26-288-02 and J4Care's project resources (GitHub dcm4che/dcm4chee-arc-light releases) for the exact patched version. Given CVSS 9.1, unauthenticated access, and patient-safety impact, treat this with the urgency of a KEV-listed flaw even though it is not (yet) in the KEV catalog.
  2. Network segmentation is non-negotiable. The archive's DICOM listener, web UI, and REST API should be reachable only from authorized modalities, RIS/HIS systems, and designated clinical workstations. The WildFly management interface (9990) must be loopback-only or behind a jump host. If your PACS is reachable from general user VLANs — and in my experience most are — fix that this week, patched or not.
  3. Enforce authentication in front of the archive. Place a reverse proxy (nginx, Traefik, or your WAF) in front of the dcm4chee web tier requiring authentication and TLS. Enable dcm4chee's built-in security features (Keycloak integration) rather than running the archive in its default permissive configuration.
  4. Validate integrity, not just availability. Because exploitation can inject forged studies and reassign patient records, patching alone doesn't close the incident. Work with your imaging and clinical informatics teams to audit study/patient linkages and recent deletion events for the exposure window. Reconciling a forged-study injection after the fact is a patient-safety review, not an IT ticket.
  5. Preserve logs before patching. Capture WildFly access logs, archive audit trails, and database transaction logs prior to upgrade — these are your only record of whether the unauthenticated paths were exercised.
  6. Hunt for exposure. Query your perimeter telemetry and any internet-facing asset inventory for dcm4chee instances. If you find one publicly reachable, assume compromise and initiate IR — do not just firewall it and move on.
  7. Report suspected compromise. CISA encourages organizations to report suspected exploitation of these vulnerabilities and to follow established internal incident response procedures for medical imaging systems, including coordination with your biomedical engineering and privacy office given the PHI and patient-safety dimensions.

Bottom Line

PACS archives are the crown jewels of clinical imaging, and dcm4chee-arc-light is everywhere. Six CVEs, a 9.1 CVSS ceiling, and a weakness set that amounts to "the archive does what anyone asks it to" means your exposure is determined entirely by network reachability. Patch on the vendor's fixed release, but treat segmentation and archive-integrity validation as equally urgent. In healthcare security, data integrity failures are patient safety failures — respond accordingly.

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.