CVE-2026-48705: MONAI: NaN/inf DICOM input causes DoS and corrupt inference
GHSA-6hp3-vr39-rqw8CRITICALMONAI's DICOM reader accepts NaN and infinity in spatial metadata (pixel spacing, patient position), so a single ~132 KB crafted DICOM file uploaded to an unauthenticated MONAILabel server crashes inference or silently corrupts segmentation output. The poisoned file stays in the datastore, so every later inference on that image fails again until it is removed. Exposure is meaningful: 128 downstream dependents, a default deployment with no authentication, and a medical-imaging context where silent geometric corruption could affect clinical decisions. No EPSS score, KEV listing or public exploit is available yet, but the advisory includes a full PoC and the attack is trivial to repeat. Upgrade monai to 1.6.1, put MONAILabel behind authentication and network controls, and audit datastores for DICOMs with non-finite geometry values.
What is the risk?
High. The attack is remote, needs no authentication or user interaction and has low complexity, and the default MONAILabel deployment exposes the vulnerable upload endpoint. The primary impacts are denial of service (each request burns ~16 s of compute before failing) and integrity loss, because NaN geometry can yield wrong segmentation masks with HTTP 200 and no warnings. Healthcare and research environments face the highest consequence. No known in-the-wild exploitation, KEV listing or EPSS data was available at analysis time, which tempers urgency slightly. The 'critical' 9.3 score is inconsistent with the advisory's own 8.7 rating; the impact is real but limited to availability and integrity, with no confidentiality or code execution.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| MONAI | pip | < 1.6.1 | 1.6.1 |
Do you use MONAI? You're affected.
How severe is it?
What is the attack surface?
What should I do?
1 step1) Upgrade monai to 1.6.1 or later and update MONAILabel and MONAI Deploy components that depend on it. 2) Do not expose MONAILabel (default port 8000) to untrusted networks; enforce authentication, a reverse proxy, and upload size and rate limits. 3) Pre-validate DICOM uploads: reject files whose DS/IS fields (PixelSpacing, ImagePositionPatient, ImageOrientationPatient, SliceThickness, RescaleSlope, Window values) contain NaN or inf. Where possible, run pydicom in strict (RAISE) validation mode. 4) Scan existing datastores for DICOMs with non-finite geometry and quarantine them. 5) Detect via repeated HTTP 500 responses on /infer endpoints, ITK GDCMImageIO 'Floating point buffer' errors in logs, and unusual PUT /datastore/ activity. 6) Add output sanity checks (finite affine, expected mask dimensions) before results reach clinicians.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-48705?
MONAI's DICOM reader accepts NaN and infinity in spatial metadata (pixel spacing, patient position), so a single ~132 KB crafted DICOM file uploaded to an unauthenticated MONAILabel server crashes inference or silently corrupts segmentation output. The poisoned file stays in the datastore, so every later inference on that image fails again until it is removed. Exposure is meaningful: 128 downstream dependents, a default deployment with no authentication, and a medical-imaging context where silent geometric corruption could affect clinical decisions. No EPSS score, KEV listing or public exploit is available yet, but the advisory includes a full PoC and the attack is trivial to repeat. Upgrade monai to 1.6.1, put MONAILabel behind authentication and network controls, and audit datastores for DICOMs with non-finite geometry values.
Is CVE-2026-48705 actively exploited?
No confirmed active exploitation of CVE-2026-48705 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-48705?
1) Upgrade monai to 1.6.1 or later and update MONAILabel and MONAI Deploy components that depend on it. 2) Do not expose MONAILabel (default port 8000) to untrusted networks; enforce authentication, a reverse proxy, and upload size and rate limits. 3) Pre-validate DICOM uploads: reject files whose DS/IS fields (PixelSpacing, ImagePositionPatient, ImageOrientationPatient, SliceThickness, RescaleSlope, Window values) contain NaN or inf. Where possible, run pydicom in strict (RAISE) validation mode. 4) Scan existing datastores for DICOMs with non-finite geometry and quarantine them. 5) Detect via repeated HTTP 500 responses on /infer endpoints, ITK GDCMImageIO 'Floating point buffer' errors in logs, and unusual PUT /datastore/ activity. 6) Add output sanity checks (finite affine, expected mask dimensions) before results reach clinicians.
What systems are affected by CVE-2026-48705?
This vulnerability affects the following AI/ML architecture patterns: Model serving, Medical imaging inference pipelines, Data annotation platforms, Training data ingestion pipelines.
What is the CVSS score for CVE-2026-48705?
CVE-2026-48705 has a CVSS v3.1 base score of 9.3 (CRITICAL).
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0029Denial of AI ServiceAML.T0031Erode AI Model IntegrityAML.T0034.001Resource-Intensive QueriesAML.T0043Craft Adversarial DataAML.T0049Exploit Public-Facing ApplicationCompliance Controls Affected
What are the technical details?
Original 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:** | 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 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)
Exploitation Scenario
An attacker finds a MONAILabel server reachable from the internet or a hospital or research network. They craft a DICOM file with 'NaN' in PixelSpacing and upload it through the unauthenticated PUT /datastore/ endpoint. They then trigger inference on that image ID, which burns about 16 seconds of GPU/CPU time and returns HTTP 500. Repeating the request or uploading many such files exhausts compute and disrupts legitimate users. Because the file persists in the datastore, the failure recurs on every use. In variants where the writer does not crash, the pipeline returns geometrically wrong masks that go unnoticed.
Weaknesses (CWE)
CWE-20 — Improper Input Validation: The product receives input or data, but it does not validate or incorrectly validates that the input has the properties that are required to process the data safely and correctly.
- [Architecture and Design] Consider using language-theoretic security (LangSec) techniques that characterize inputs using a formal language and build "recognizers" for that language. This effectively requires parsing to be a distinct layer that effectively enforces a boundary between raw input and internal data representations, instead of allowing parser code to be scattered throughout the program, where it could be subject to errors or inconsistencies that create weaknesses. [REF-1109] [REF-1110] [REF-1111]
- [Architecture and Design] Use an input validation framework such as Struts or the OWASP ESAPI Validation API. Note that using a framework does not automatically address all input validation problems; be mindful of weaknesses that could arise from misusing the framework itself (CWE-1173).
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:LReferences
Timeline
Related Vulnerabilities
CVE-2026-1008428.8MONAI: eval sandbox bypass allows code execution
Same package: monaiCVE-2025-587558.8MONAI: path traversal allows arbitrary file write
Same package: monaiCVE-2025-587568.8MONAI: unsafe deserialization in CheckpointLoader allows RCE
Same package: monaiCVE-2025-587578.8MONAI: unsafe pickle deserialization RCE in data pipeline
Same package: monaiCVE-2026-1008468.8MONAI: unsafe pickle deserialization allows RCE
Same package: monai