MONAI Core CVE-2026-48705
CRITICALAttack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessReach unauthenticated MONAILabel REST API on port 8000
-
DeliveryUpload crafted DICOM with NaN/inf DS tags via PUT /datastore/
-
ExploitTrigger inference via POST /infer/segmentation
-
ExecutionNaN propagates through affine matrix and spatial transforms
-
ImpactCrash 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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
AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L
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.
Primary rating from GitHub Advisory.
CVSS VectorGitHub Advisory
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.
>>> from pydicom.valuerep import DSfloat
>>> DSfloat("NaN")
nan
# Accepted silently - should be rejected
>>> DSfloat("inf")
inf
# Accepted silently - should be rejectedThis 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:
# 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):
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 maskStep 2 - Run the attack (NaN DICOM upload + inference):
pip install pydicom numpy requests
python poc_monailabel_ds_bypass.py --server http://localhost:8000The PoC script:
- Confirms pydicom accepts NaN/inf in DS fields
- 2. Creates three malicious DICOM files (~132 KB each) with NaN/inf in PixelSpacing and ImagePositionPatient
- 3. Uploads each via
PUT /datastore/(no auth required) - HTTP 200 accepted - 4. Triggers inference via
POST /infer/segmentation- HTTP 500, server crash
Demonstrated Results:
| Payload | Upload | Inference | Result |
|---|---|---|---|
| Baseline (spleen_40) | N/A | HTTP 200 | Valid 223 KB segmentation |
| NaN PixelSpacing | HTTP 200 | HTTP 500 | RuntimeError crash (18.0s wasted compute) |
| NaN PixelSpacing + IPP | HTTP 200 | HTTP 500 | RuntimeError crash (16.7s wasted compute) |
| Inf PixelSpacing | HTTP 200 | HTTP 500 | RuntimeError 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
- 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.
- 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.
- 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:
- Add
math.isfinite()validation inPydicomReader._get_affine()on all values from PixelSpacing, IPP, IOP. Raise ValueError for NaN/inf. - 2. Validate spatial metadata of uploaded DICOM in MONAILabel
PUT /datastore/. Return HTTP 400 for invalid geometry. - 3. Validate spatial metadata is finite in
LoadImaged/Spacingdbefore resampling. - 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- 128 pypi packages depend on monai (115 direct, 13 indirect)
Ecosystem-wide dependent count for version 1.6.1.
Articles & Coverage 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
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.
Apply vendor patch.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
Affected Products (CPE)GitHub Advisory
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
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
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
GHSA-6hp3-vr39-rqw8
NVD
CVE.org
Exploit-DB