Description
A security vulnerability has been detected in DLR-RM stable-baselines3 up to 2.9.0. This affects the function PPO.load/load_replay_buffer/VecNormalize.load of the file save_util.py. Such manipulation leads to deserialization. It is possible to launch the attack remotely. The exploit has been disclosed publicly and may be used. In v2.9.0 the PyTorch tensor load path is hardened (weights_only=True), but that hardening was later reverted on master via PR #1913 "Hotfix: revert loading with weights_only=True" [blocked] to fix PyTorch 1.13 compat - so even the one "safe" path is inconsistent across versions. #2281 was closed as a duplicate of #1831 since both are unsafe pickle deserialization - but #1831's fix (PR #41) only gated the Hugging Face Hub loader in the separate huggingface_sb3 package. This finding covers the core stable_baselines3 load APIs (PPO.load, load_replay_buffer, VecNormalize.load), which have no safe mode or gate and remained exploitable in v2.9.0 until the outstanding hardening (PR #2264) ships.
Published: 2026-09-20
Score: 5.3 Medium
EPSS: n/a
KEV: No
Impact: Remote Code Execution via unsafe pickle deserialization
Action: Immediate Patch
AI Analysis

Impact

The vulnerability lies in the load functions of stable-baselines3, where they deserialize data using Python’s pickle without proper validation. Pickle deserialization is known to execute arbitrary code present in the payload, thus an attacker can craft a malicious file to achieve remote code execution. The weakness is classified under CWE-20 and CWE-502, indicating improper input validation and unsafe deserialization of untrusted data. The public disclosure and the fact that the exploit is available make the threat real and actionable for services that load models from untrusted sources.

Affected Systems

All installations of the DLR‑RM stable‑baselines3 library prior to the hardening fix are affected. Specifically the PO load, load_replay_buffer, and VecNormalize.load functions in CPython files under save_util.py can be triggered with an attacker‑provided file. Versions up to 2.9.0, as well as later releases that reverted the hardening patch (via PR #1913), remain vulnerable. Users relying on more recent releases that incorporate PR #2264 should verify that the loading path has been hardened (weights_only=True).

Risk and Exploitability

The CVSS score of 5.3 assigns moderate severity. EPSS data is not available and the vulnerability is not listed in the CISA KEV catalog, indicating no known large‑scale exploitation yet. Nonetheless, because the attack vector is remote—an attacker can supply a malicious pickle file to any code that calls the vulnerable load functions—the risk can be significant if the target system imports or processes an untrusted file. Exploitation requires the ability to run the vulnerable library, so an application that accepts user‑supplied models or buffers is a potential entry point. In the absence of additional mitigation, a successful exploit can lead to full remote code execution on the host running the Python process.

Generated by OpenCVE AI on September 21, 2026 at 00:25 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade to a stable-baselines3 release that includes the hardened deserialization change (after PR #2264).
  • If unable to upgrade immediately, disable or replace PPO.load, load_replay_buffer, and VecNormalize.load uses with safe alternatives or custom wrappers that validate the input format before deserialization.
  • Ensure that only trusted, signed, or otherwise validated model files are passed to the load functions, and avoid loading files from untrusted sources.

Generated by OpenCVE AI on September 21, 2026 at 00:25 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Sun, 20 Sep 2026 23:00:00 +0000

Type Values Removed Values Added
Description A security vulnerability has been detected in DLR-RM stable-baselines3 up to 2.9.0. This affects the function PPO.load/load_replay_buffer/VecNormalize.load of the file save_util.py. Such manipulation leads to deserialization. It is possible to launch the attack remotely. The exploit has been disclosed publicly and may be used. In v2.9.0 the PyTorch tensor load path is hardened (weights_only=True), but that hardening was later reverted on master via PR #1913 "Hotfix: revert loading with weights_only=True" [blocked] to fix PyTorch 1.13 compat - so even the one "safe" path is inconsistent across versions. #2281 was closed as a duplicate of #1831 since both are unsafe pickle deserialization - but #1831's fix (PR #41) only gated the Hugging Face Hub loader in the separate huggingface_sb3 package. This finding covers the core stable_baselines3 load APIs (PPO.load, load_replay_buffer, VecNormalize.load), which have no safe mode or gate and remained exploitable in v2.9.0 until the outstanding hardening (PR #2264) ships.
Title DLR-RM stable-baselines3 save_util.py VecNormalize.load deserialization
First Time appeared Dlr-rm
Dlr-rm stable-baselines3
Weaknesses CWE-20
CWE-502
CPEs cpe:2.3:a:dlr-rm:stable-baselines3:*:*:*:*:*:*:*:*
Vendors & Products Dlr-rm
Dlr-rm stable-baselines3
References
Metrics cvssV2_0

{'score': 7.5, 'vector': 'AV:N/AC:L/Au:N/C:P/I:P/A:P/E:POC/RL:ND/RC:UR'}

cvssV3_0

{'score': 6.3, 'vector': 'CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:L/E:P/RL:X/RC:R'}

cvssV3_1

{'score': 6.3, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:L/E:P/RL:X/RC:R'}

cvssV4_0

{'score': 5.3, 'vector': 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N/E:P'}


Subscriptions

Dlr-rm Stable-baselines3
cve-icon MITRE

Status: PUBLISHED

Assigner: VulDB

Published:

Updated: 2026-09-20T22:45:17.509Z

Reserved: 2026-09-20T08:39:03.152Z

Link: CVE-2026-94093

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-09-20T23:17:03.343

Modified: 2026-09-20T23:17:03.343

Link: CVE-2026-94093

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-09-21T00:30:06Z

Weaknesses
  • CWE-20

    Improper Input Validation

  • CWE-502

    Deserialization of Untrusted Data