Skip to main content

MONAI Core CVE-2026-48705

CRITICAL
Improper Input Validation (CWE-20)
2026-10-27 https://github.com/Project-MONAI/MONAI GHSA-6hp3-vr39-rqw8
9.3
CVSS 3.1 · GitHub Advisory
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Reach unauthenticated MONAILabel REST API on port 8000
  2. Delivery
    Upload crafted DICOM with NaN/inf DS tags via PUT /datastore/
  3. Exploit
    Trigger inference via POST /infer/segmentation
  4. Execution
    NaN propagates through affine matrix and spatial transforms
  5. Impact
    Crash inference pipeline or return silently corrupted segmentation

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V2 - Validation and Business Logic Input validation, allowlisting
Exploitation Conditions

Exploitation requires a reachable MONAILabel server with its default REST API exposed (default port 8000), which per the description accepts DICOM uploads at PUT /datastore/ with no authentication, no spatial-metadata validation, and no bounds checking; an inference model (e.g. the radiology segmentation app) must be configured so that a crafted file can be fed to POST /infer/segmentation. The malicious geometry only needs NaN or infinity in any DS-VR tag (PixelSpacing, ImagePositionPatient, SliceThickness, ImageOrientationPatient, RescaleSlope, WindowCenter/WindowWidth). Limiting factors for defenders: the flaw is only reachable where MONAILabel (or another MONAI consumer that routes DICOM through PydicomReader) is actually deployed and network-exposed - the underlying MONAI/pydicom library issue is not remotely exploitable on its own without such an ingestion path; deployments that place the API behind authentication or network restrictions remove the unauthenticated-remote precondition.

Impact

The signals point consistently toward a genuine priority for anyone running MONAILabel, though with caveats. The supplied CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L) describes a network-reachable, low-complexity, unauthenticated flaw - matching the description's claim that the default MONAILabel REST API on port 8000 needs no authentication. Note an internal inconsistency in the input: the advisory text states '8.7 HIGH' while the aggregated feed lists a 9.3 CVSS score; both use the same vector, so the discrepancy is a scoring/transcription difference, not a change in mechanism - verify the authoritative base score with the GitHub advisory (GHSA-6hp3-vr39-rqw8). The vuln.today decision label is act_now and a vendor patch exists, which together argue for prompt remediation. Countervailing: there is no CISA KEV listing and no EPSS score in the supplied data, so there is no evidence of active, widespread exploitation - this is not confirmed as being exploited in the wild. A detailed proof-of-concept with demonstrated crash results is documented inside the advisory itself, so exploitability is well-established even absent independent exploitation telemetry. The most consequential dimension is integrity (I:H): silently corrupted medical-AI segmentation results returned with HTTP 200 and no warning, which in a clinical-adjacent pipeline is more dangerous than the loud denial-of-service crash. Net: a real, patch-now issue for exposed MONAILabel deployments, tempered by the fact that the real-world footprint is a niche medical-imaging audience rather than ubiquitous infrastructure.

Exploit ScenarioDerived

An attacker with only network reachability to a default MONAILabel server (port 8000, no authentication) uploads a single ~132 KB DICOM file carrying NaN or infinity values in DS-typed spatial tags such as PixelSpacing or ImagePositionPatient via PUT /datastore/, then triggers POST /infer/segmentation. The non-finite values propagate unchecked through PydicomReader's affine matrix into MONAI's spatial transforms, either crashing the inference pipeline (observed HTTP 500 after ~16s of wasted compute) or silently returning a geometrically corrupted segmentation mask. A working PoC with demonstrated results is published in the vendor advisory.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 28, 2026

Crafted DICOM files uploaded to a reachable MONAILabel REST API can crash the inference pipeline or silently corrupt the geometry of returned segmentation masks, because MONAI Core's PydicomReader builds affine matrices from Decimal String (DS) tags without rejecting NaN or infinity. The affected package is the pip-distributed monai library before 1.6.1, which is used by MONAILabel (default REST API on port 8000, no authentication) as well as other MONAI consumers that route DICOM through PydicomReader; the assessed severity is CVSS 9.3 (AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L). The GitHub advisory includes proof-of-concept code and demonstrated HTTP 500 crashes against MONAI 1.5.2 with pydicom 3.0.2, but there is no CISA KEV listing or other confirmation of exploitation in the wild at time of analysis.

RemediationAI

Upgrade the monai package to 1.6.1, the vendor-released fix referenced by GHSA-6hp3-vr39-rqw8 (https://github.com/Project-MONAI/MONAI/releases/tag/1.6.1); the corresponding change is commit https://github.com/Project-MONAI/MONAI/commit/434c094a3e6b84cca5b6e81da51e0d18a0100607, which makes PydicomReader._get_affine raise ValueError when ImageOrientationPatient, ImagePositionPatient, PixelSpacing, derived spacing, lastImagePositionPatient or the composed affine is not finite. Because the advisory documents that a crafted DICOM is stored permanently through PUT /datastore/ and crashes every subsequent inference on that image ID, also audit and purge previously uploaded studies from the datastore and treat any pre-patch segmentation output as untrusted, since silent geometric corruption can be returned with HTTP 200. Where upgrading immediately is not possible, remove the unauthenticated-remote precondition: place the MONAILabel API behind authentication and restrict network access to port 8000 so only trusted clinical clients can reach PUT /datastore/ and POST /infer/segmentation; the trade-off is added client configuration and token/key management, and it does not protect against an authenticated or network-positioned attacker. Blocking or fronting the datastore upload endpoint with a proxy that validates DICOM geometry is another option, but it requires a parser that rejects non-finite DS values, which the advisory notes pydicom does not do by default (WARN mode returns the invalid value). Track the separately filed pydicom advisory, since the same NaN/inf acceptance in DS/IS affects any application that reads DICOM metadata directly, and coordinate the pydicom update with MONAI rather than replacing it in isolation.

Affected Packages

pypi monai fix: 1.6.1

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Root cause is improper input validation (CWE-20) that leads to incorrect calculation (CWE-682). Layer one is pydicom: DSfloat.__new__ delegates to Python's float(), which accepts 'NaN', 'inf' and '-inf' even though DICOM PS3.5 Table 6.2-1 permits only digits, sign, decimal point and exponent in DS values; the is_valid_ds() check runs only in RAISE validation mode, and the default WARN mode returns the invalid value. The related IS type accepts scientific notation such as '1e4' through an int(float(val)) fallback. This behavior spans pydicom 0.9.7 through 3.0.2. Layer two is MONAI Core: PydicomReader._get_affine() composes a 4x4 affine from ImageOrientationPatient (0020,0037), ImagePositionPatient (0020,0032) and PixelSpacing (0028,0030) with no isfinite/isnan checks, so a NaN spacing value lands on the affine diagonal and propagates through LoadImaged, Spacingd, the model and the writer. Layer three is the MONAILabel deployment surface: the default REST API accepts uploads at PUT /datastore/ with no authentication and no spatial-metadata validation, and the stored file is reused for later POST /infer/segmentation calls. In the demonstrated case the failure surfaces as an ITK/GDCM RuntimeError during output writing; the advisory notes that where the writer does not crash, a geometrically incorrect mask can be returned with HTTP 200 and no warning. Note that the underlying library weakness is not remotely exploitable without a DICOM ingestion path such as MONAILabel. The published fix commit 434c094 adds a _raise_if_not_finite() helper validating ImageOrientationPatient, ImagePositionPatient, PixelSpacing, derived spacing and lastImagePositionPatient, plus a post-composition check that the final affine is finite, with regression tests covering NaN spacing, infinite position/orientation, infinite last position and overflow from finite inputs.

Know when Python gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

GitHub Advisory PRIMARY 9.3 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L
vuln.today AI 9.3 CRITICAL

Default API is network-reachable and unauthenticated (AV:N/PR:N/UI:N), trivially triggered (AC:L); library flaw impacts the separate inference service (S:C); silent result corruption drives I:H, no data disclosure (C:N), per-request crash A:L.

3.1 AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N

Primary rating from GitHub Advisory.

CVSS VectorGitHub Advisory

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Changed
Confidentiality
None
Integrity
High
Availability
Low

DescriptionGitHub Advisory

Summary

An unauthenticated remote attacker can crash a running MONAILabel server or silently corrupt its medical AI inference results by uploading a single crafted DICOM file (~132 KB) via the REST API. The vulnerability stems from pydicom's lack of validation for Decimal String (DS) and Integer String (IS) DICOM Value Representations, which allows NaN and infinity values to pass through MONAI's PydicomReader and propagate through the entire spatial transform and ML inference pipeline.

No authentication is required for the default MONAILabel REST API. The attacker needs only network access to the server (default port 8000).

Severity: CVSS 3.1: 8.7 HIGH CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L CWE: CWE-20 (Improper Input Validation) → CWE-682 (Incorrect Calculation)

Details

Root Cause - Layer 1: pydicom accepts invalid VR values

pydicom's DSfloat.__new__() calls Python's float(val), which silently accepts "NaN", "inf", and "-inf". The DICOM standard (PS3.5 Table 6.2-1) defines DS as digits 0-9, +, -, ., e only. NaN and inf are not valid DS values. The is_valid_ds() check only runs in RAISE validation mode, which is NOT the default. The default mode is WARN, which still returns the invalid value.

python
>>> from pydicom.valuerep import DSfloat
>>> DSfloat("NaN")
nan
# Accepted silently - should be rejected
>>> DSfloat("inf")
inf
# Accepted silently - should be rejected

This affects ALL pydicom versions from 0.9.7 through 3.0.2 (current).

A related bypass exists in pydicom's IS type: IS("1e4") returns 10000 via an int(float(val)) fallback, accepting scientific notation that is not valid per the DICOM standard.

Root Cause - Layer 2: MONAI Core trusts pydicom output without validation

MONAI's PydicomReader._get_affine() builds a 4x4 affine transformation matrix from PixelSpacing, ImagePositionPatient, and ImageOrientationPatient with ZERO isfinite() or isnan() checks. NaN in PixelSpacing produces NaN in the affine diagonal, propagating through every spatial transform: PydicomReader._get_affine() → LoadImaged → Spacingd → Model → Writer

Root Cause - Layer 3: MONAILabel REST API accepts anything

MONAILabel's PUT /datastore/ endpoint accepts DICOM uploads with no authentication (default deployment), no validation of spatial metadata, and no bounds checking on any DICOM tag values. The malicious DICOM is stored permanently and made available for inference.

PoC

Environment Setup:

bash
# Start MONAILabel (Docker)
docker pull projectmonai/monailabel:latest
docker run -d --name monailabel-poc -p 8000:8000 --memory=8g \
    projectmonai/monailabel:latest monailabel start_server \
    --app /opt/monai/sample-apps/radiology \
    --studies /opt/monai/datasets/Task09_Spleen/imagesTr \
    --conf models segmentation
# Verify server is running
curl http://localhost:8000/info/

Step 1 - Establish baseline (legitimate data works):

bash
curl -X POST "http://localhost:8000/infer/segmentation?image=spleen_40" \
     -o baseline.nii.gz -w "HTTP %{http_code} - %{size_download} bytes"
# Result: HTTP 200, ~223,628 bytes valid segmentation mask

Step 2 - Run the attack (NaN DICOM upload + inference):

bash
pip install pydicom numpy requests
python poc_monailabel_ds_bypass.py --server http://localhost:8000

The PoC script:

  1. Confirms pydicom accepts NaN/inf in DS fields
  2. 2. Creates three malicious DICOM files (~132 KB each) with NaN/inf in PixelSpacing and ImagePositionPatient
  3. 3. Uploads each via PUT /datastore/ (no auth required) - HTTP 200 accepted
  4. 4. Triggers inference via POST /infer/segmentation - HTTP 500, server crash

Demonstrated Results:

PayloadUploadInferenceResult
Baseline (spleen_40)N/AHTTP 200Valid 223 KB segmentation
NaN PixelSpacingHTTP 200HTTP 500RuntimeError crash (18.0s wasted compute)
NaN PixelSpacing + IPPHTTP 200HTTP 500RuntimeError crash (16.7s wasted compute)
Inf PixelSpacingHTTP 200HTTP 500RuntimeError crash (16.4s wasted compute)

Server crash traceback:

monailabel/tasks/infer/basic_infer.py → self.writer(data)
monailabel/transform/writer.py → write_itk(...)
itk/ITKCommonBasePython.py → itkProcessObject_Update()
RuntimeError: itkGDCMImageIO.cxx:1226:
  ITK ERROR: GDCMImageIO: A Floating point buffer was passed
  but the stored pixel type was not specified.

Each request burns ~16 seconds of server compute (full ML inference pipeline) before crashing. The NaN DICOM persists in the datastore - any future inference on that image ID crashes the server again.

Library-level confirmation: 17/17 test vectors confirmed against MONAI 1.5.2 and pydicom 3.0.2, including actual MONAI LoadImaged and Spacingd transforms accepting NaN geometry without error.

Impact

  1. Denial of Service: A single ~132 KB DICOM upload crashes the MONAILabel inference pipeline. All active inference requests from legitimate users are aborted. Repeatable indefinitely with minimal bandwidth.
  2. Silent Data Corruption: NaN values in spatial metadata propagate through the entire ML inference pipeline and produce geometrically incorrect segmentation masks. If the output writer does not crash, the result is returned with HTTP 200 and zero warnings.
  3. Persistent Datastore Poisoning: The malicious DICOM is stored permanently via PUT /datastore/. Any future inference request on that image ID reproduces the crash or corruption, persisting across server restarts.

Affected MONAI Ecosystem (9 repositories):

  • MONAI Core: PydicomReader, LoadImaged, Spacingd transforms
  • - MONAILabel: REST API + DICOMweb datastore
  • - MONAI Deploy App SDK: DICOMDataLoaderOperator
  • - model-zoo, VISTA, GenerativeModels, tutorials, research-contributions

Affected DICOM Tags (any DS VR): PixelSpacing, ImagePositionPatient, SliceThickness, ImageOrientationPatient, RescaleSlope, WindowCenter/WindowWidth

Recommended Fix:

  1. Add math.isfinite() validation in PydicomReader._get_affine() on all values from PixelSpacing, IPP, IOP. Raise ValueError for NaN/inf.
  2. 2. Validate spatial metadata of uploaded DICOM in MONAILabel PUT /datastore/. Return HTTP 400 for invalid geometry.
  3. 3. Validate spatial metadata is finite in LoadImaged/Spacingd before resampling.
  4. 4. Coordinate with pydicom upstream to reject NaN/inf in DS fields in all validation modes.

Upstream: pydicom GHSA filed 2026-04-05.

Author: Paulino Calderon (paulino@calderonpale.com)

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 128 pypi packages depend on monai (115 direct, 13 indirect)

Ecosystem-wide dependent count for version 1.6.1.

Technical POC Analysis

CWE-20: Improper Input Validation, leading to incorrect calculation.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

CVE-2026-48705 is a critical vulnerability in the MONAI Core library (monai before 1.6.1) that can be exploited through MONAILabel's unauthenticated REST API by uploading crafted DICOM files, leading to denial-of-service and silent corruption of segmentation results. This directly threatens clinical workflows relying on MONAILabel for imaging analysis, potentially causing misdiagnosis or service disruption, and affects any MONAI consumer routing DICOM through PydicomReader.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

Prevalence
Low
niche medical-imaging AI framework, research and healthcare deployments only
Threat Intel
1
1 source
Data Quality
3 sources
Confidence: Low
NVD CVE.org GHSA GitHub

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity CRITICAL
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
Yes
Human Impact
High

Priority Score

46
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +46
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

Affected Products (CPE)GitHub Advisory

pkg:pip/monai

More in Python

View all
CVE-2025-24016 CRITICAL POC
9.9 Feb 10

Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t

CVE-2025-27520 CRITICAL POC
9.8 Apr 04

BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser

CVE-2025-2945 CRITICAL POC
9.9 Apr 03

pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi

CVE-2013-5093 MEDIUM POC
6.8 Sep 27

The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python

CVE-2025-32375 CRITICAL POC
9.8 Apr 09

BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica

CVE-2014-0224 HIGH POC
7.4 Jun 05

OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph

CVE-2024-21644 HIGH POC
7.5 Jan 08

pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.

CVE-2026-33017 CRITICAL POC
9.3 Mar 17

Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301

CVE-2017-9462 HIGH POC
8.8 Jun 06

In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse

CVE-2026-49869 CRITICAL POC
10.0 Jun 26

Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2024-21645 MEDIUM POC
5.3 Jan 08

pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy