CVE-2026-48705
MONAI: MONAILabel Server Crash and Silent Inference Corruption via Crafted DICOM (pydicom DS/IS Validation Bypass)
CVE-2026-48705 is a critical vulnerability (CVSS 9.3) in Project-monai Monai, published October 27, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.51%, the 43rd percentile. Fixed in monai 1.6.1.
- Severity
- 9.3 CriticalCVSS 3.1, CVE List
- Exploit chance
- 0.51%EPSS, 43rd percentile
- Exploitation
- None knownNot on CISA’s or ENISA’s lists
- Fixed in
1.6.1monai +1 more
Description
MONAI (Medical Open Network for AI) is an AI toolkit for health care imaging. Prior to 1.6.1, PydicomReader._get_affine() trusts non-finite values in the DICOM PixelSpacing, ImagePositionPatient, and ImageOrientationPatient fields and composes them into an affine matrix without validation. An unauthenticated attacker who can upload a crafted DICOM to a default MONAILabel deployment can propagate NaN or infinity values through LoadImaged, Spacingd, model inference, and output writing, causing inference failures, persistent datastore poisoning, or geometrically corrupted results. This issue is fixed in version 1.6.1.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- High
- Availability
- Low
Exploit likelihood
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
monaiPyPI | before 1.6.1 | 1.6.1 |
monaiPyPI | before 1.6.1, plus listed versions 0.0.10.1.00.2.00.3.00.4.0 Show 40 moreShow less0.5.00.5.10.5.20.5.30.6.00.7.00.8.00.8.10.9.00.9.11.0.01.0.11.1.01.2.01.3.01.3.11.3.21.3.2rc11.3.3rc11.4.01.4.0rc11.4.0rc101.4.0rc111.4.0rc121.4.0rc21.4.0rc31.4.0rc41.4.0rc51.4.0rc61.4.0rc71.4.0rc81.4.0rc91.4.1rc11.5.01.5.0rc11.5.11.5.21.5.2rc11.6.01.6.1rc0 | 1.6.1 |
What each source reports
CVE List Score used 9.3
MONAI: MONAILabel Server Crash and Silent Inference Corruption via Crafted DICOM (pydicom DS/IS Validation Bypass)
MONAI (Medical Open Network for AI) is an AI toolkit for health care imaging. Prior to 1.6.1, PydicomReader._get_affine() trusts non-finite values in the DICOM PixelSpacing, ImagePositionPatient, and ImageOrientationPatient fields and composes them into an affine matrix without validation. An unauthenticated attacker who can upload a crafted DICOM to a default MONAILabel deployment can propagate NaN or infinity values through LoadImaged, Spacingd, model inference, and output writing, causing inference failures, persistent datastore poisoning, or geometrically corrupted results. This issue is fixed in version 1.6.1.
- Record
CVE-2026-48705- CVSS 3.1
- 9.3 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L - Weakness
- CWE-20, CWE-682
- Updated
- 2026-11-05
EUVDEUVD-2026-117795 9.3
MONAI (Medical Open Network for AI) is an AI toolkit for health care imaging. Prior to 1.6.1, PydicomReader._get_affine() trusts non-finite values in the DICOM PixelSpacing, ImagePositionPatient, and ImageOrientationPatient fields and composes them into an affine matrix without validation. An unauthenticated attacker who can upload a crafted DICOM to a default MONAILabel deployment can propagate NaN or infinity values through LoadImaged, Spacingd, model inference, and output writing, causing inference failures, persistent datastore poisoning, or geometrically corrupted results. This issue is fixed in version 1.6.1.
- Record
EUVD-2026-117795- CVSS 3.1
- 9.3 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L - Updated
- 2026-11-05
GitHub AdvisoriesGHSA-6hp3-vr39-rqw8 9.3
MONAILabel Server Crash and Silent Inference Corruption via Crafted DICOM (pydicom DS/IS Validation Bypass)
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 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:
# 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 mask
Step 2 — Run the attack (NaN DICOM upload + inference):
pip install pydicom numpy requests
python poc_monailabel_ds_bypass.py --server http://localhost:8000
The PoC script:
- Confirms pydicom accepts NaN/inf in DS fields
- Creates three malicious DICOM files (~132 KB each) with NaN/inf in PixelSpacing and ImagePositionPatient
- Uploads each via
PUT /datastore/(no auth required) — HTTP 200 accepted
- Uploads each via
- Triggers inference via
POST /infer/segmentation— HTTP 500, server crash Demonstrated Results:
- Triggers inference via
| 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…
- Record
GHSA-6hp3-vr39-rqw8- CVSS 3.1
- 9.3 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L - Weakness
- CWE-20
- Updated
- 2026-11-02
NVD 9.3
MONAI (Medical Open Network for AI) is an AI toolkit for health care imaging. Prior to 1.6.1, PydicomReader._get_affine() trusts non-finite values in the DICOM PixelSpacing, ImagePositionPatient, and ImageOrientationPatient fields and composes them into an affine matrix without validation. An unauthenticated attacker who can upload a crafted DICOM to a default MONAILabel deployment can propagate NaN or infinity values through LoadImaged, Spacingd, model inference, and output writing, causing inference failures, persistent datastore poisoning, or geometrically corrupted results. This issue is fixed in version 1.6.1.
- Record
CVE-2026-48705- CVSS 3.1
- 9.3 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L - Weakness
- CWE-20, CWE-682
- Updated
- 2026-11-05
OSV 9.3
MONAI: MONAILabel Server Crash and Silent Inference Corruption via Crafted DICOM (pydicom DS/IS Validation Bypass)
MONAI (Medical Open Network for AI) is an AI toolkit for health care imaging. Prior to 1.6.1, PydicomReader._get_affine() trusts non-finite values in the DICOM PixelSpacing, ImagePositionPatient, and ImageOrientationPatient fields and composes them into an affine matrix without validation. An unauthenticated attacker who can upload a crafted DICOM to a default MONAILabel deployment can propagate NaN or infinity values through LoadImaged, Spacingd, model inference, and output writing, causing inference failures, persistent datastore poisoning, or geometrically corrupted results. This issue is fixed in version 1.6.1.
- Record
CVE-2026-48705- CVSS 3.1
- 9.3 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L - Weakness
- CWE-20, CWE-682
- Updated
- 2026-11-07
OSVGHSA-6hp3-vr39-rqw8 9.3
MONAILabel Server Crash and Silent Inference Corruption via Crafted DICOM (pydicom DS/IS Validation Bypass)
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 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:
# 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 mask
Step 2 — Run the attack (NaN DICOM upload + inference):
pip install pydicom numpy requests
python poc_monailabel_ds_bypass.py --server http://localhost:8000
The PoC script:
- Confirms pydicom accepts NaN/inf in DS fields
- Creates three malicious DICOM files (~132 KB each) with NaN/inf in PixelSpacing and ImagePositionPatient
- Uploads each via
PUT /datastore/(no auth required) — HTTP 200 accepted
- Uploads each via
- Triggers inference via
POST /infer/segmentation— HTTP 500, server crash Demonstrated Results:
- Triggers inference via
| 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…
- Record
GHSA-6hp3-vr39-rqw8- CVSS 3.1
- 9.3 Critical
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:L - Weakness
- CWE-20
- Updated
- 2026-11-02
History
| Recorded | Changed | Sources |
|---|---|---|
| references | NVD, OSV | |
| aliases | EUVD | |
| references | CVE List | |
| cwes, description, facts, products, references, severity, title | CVE List | |
| first indexed | GitHub Advisories, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
References
github.com/Project-MONAI/MONAI/security/advisories/GHSA-6hp3-vr39-rqw8
github.com/Project-MONAI/MONAI/pull/9087
github.com/Project-MONAI/MONAI/commit/434c094a3e6b84cca5b6e81da51e0d18a0100607
github.com/Project-MONAI/MONAI/releases/tag/1.6.1
github.com/advisories/GHSA-6hp3-vr39-rqw8
github.com/CVEProject/cvelistV5/tree/main/cves/2026/48xxx/CVE-2026-48705.json
nvd.nist.gov/vuln/detail/CVE-2026-48705
github.com/Project-MONAI/MONAI
Left out here: the rest of 2 source descriptions. The JSON record has them.