VU#369093: MLflow dspy and statsmodels flavors bypass pickle deserialization control
CERT/CC warns MLflow's dspy and statsmodels flavors bypass the MLFLOW_ALLOW_PICKLE_DESERIALIZATION control, enabling remote code execution.
CERT/CC vulnerability note VU#369093 describes a flaw in MLflow 3.12.0 where the dspy flavor conditionally applies the pickle deserialization safety control based only on the model path's .pkl extension, while the statsmodels flavor skips the check entirely, permitting arbitrary code execution via malicious pickle payloads even when users disallow pickle. The statsmodels flavor is patched in versions 3.15.0 and later, but no dspy fix exists yet, so users should avoid loading models through that flavor. Exploitation requires write access to any location from which a user obtains MLflow models.
- dspy flavor checks only the .pkl extension; renamed pickle files bypass the control
- statsmodels flavor ignores MLFLOW_ALLOW_PICKLE_DESERIALIZATION entirely
- Patched in statsmodels flavor versions 3.15.0 and later; no dspy fix yet
- Attack requires write access to MLflow model storage locations
Full article354 words · extracted from kb.cert.org · click to collapse
Overview
A vulnerability in MLflow’s dspy and statsmodels model flavors allows unauthorized pickle deserialization executions despite a safety control. Specifically, the dspy flavor conditionally applies the control based on the model path’s file extension, and the statsmodels flavor does not apply the control.
Description
MLflow is an open-source platform for managing machine learning lifecycles, including model packaging, versioning, and deployment. "Flavors" refer to the specialized frameworks through which supported models are stored and loaded. In response to previous vulnerability concerns, MLflow implemented the MLFLOW_ALLOW_PICKLE_DESERIALIZATION safety control to block and disable executing any pickle deserialization and subsequent loads per the user’s choice.
When loading models through mlflow.pyfunc.load_model(model), users must specify a model flavor and path in an MLmodel file. With the dspy flavor, MLflow checks the value of MLFLOW_ALLOW_PICKLE_DESERIALIZATION, and whether the specified model path ends in .pkl. A model path that does not end in .pkl (even if the file is actually a pickle file), will route to a separate branch for pickle deserialization, bypassing the safety control. However, when loading through the statsmodels flavor, there is no check for MLFLOW_ALLOW_PICKLE_DESERIALIZATION at all.
Impact
Exploitation of this vulnerability allows for arbitrary remote code execution through a malicious pickle-loaded payload, regardless of a user explicitly disallowing pickle serialization, through vulnerable flavor specifications in the MLmodel configuration file. The attack path requires write access to any location from which a user obtains MLflow models. This vulnerability was confirmed against MLflow 3.12.0.
Solution
MLFlow could not be reached to coordinate this vulnerability; however, the statsmodels flavor was patched in versions >= 3.15.0. Users should upgrade immediately. Until a further fix remedying the dspy flavor vulnerability is available, MLflow users who wish to block pickle deserialization and loads should avoid loading any models via the dspy flavor.
Acknowledgements
Thanks to Prasanna Dabi for reporting this vulnerability. This document was written by Alex Lewis.
Vendor Information
369093
Filter by status:
Filter by content: Additional information available
Sort by:
References
Other Information
| API URL: | VINCE JSON | CSAF |
| Date Public: | 2026-09-16 |
| Date First Published: | 2026-09-16 |
| Date Last Updated: | 2026-09-16 17:10 UTC |
| Document Revision: | 1 |
Text extracted automatically; images, tables and formatting may be missing. Original: https://kb.cert.org/vuls/id/369093