MLflow Statsmodels Flavor Security Control Bypass
The MLflow 'statsmodels' flavor fails to implement the 'MLFLOW_ALLOW_PICKLE_DESERIALIZATION' security control, allowing unauthenticated attackers to achieve arbitrary code execution via crafted pickle model artifacts.
CVE search metadata
CVE search record: CVE-2024-37052. Severity: high. CVSS: 8.8. EPSS: 0.62%. KEV: no. Product: mlflow (>= 2.1.0, < 3.15.0). Brief: MLflow Statsmodels Flavor Security Control Bypass. Brief link: https://feed.craftedsignal.io/briefs/2026-09-mlflow-statsmodels-bypass/
CVE search record: CVE-2024-37060. Severity: high. CVSS: 8.8. EPSS: 0.78%. KEV: no. Product: mlflow (>= 2.1.0, < 3.15.0). Brief: MLflow Statsmodels Flavor Security Control Bypass. Brief link: https://feed.craftedsignal.io/briefs/2026-09-mlflow-statsmodels-bypass/
MLflow contains a security vulnerability where the mlflow.statsmodels flavor bypasses the MLFLOW_ALLOW_PICKLE_DESERIALIZATION security control. This control was originally introduced to prevent unsafe pickle.load execution during model loading, specifically to mitigate risks associated with CVE-2024-37052 through CVE-2024-37060. When operators set this variable to False, they intend to block all pickle-based deserialization. However, the mlflow.statsmodels implementation completely omits this security guard. An attacker who can upload or place a crafted MLmodel artifact into an accessible artifact store can trigger arbitrary code execution on any system or process that invokes mlflow.pyfunc.load_model() against the malicious model, regardless of the environment configuration. This vulnerability effectively nullifies a primary defense-in-depth measure against remote code execution in MLflow deployments.
Attack Chain
- Attacker identifies an accessible MLflow artifact store or model registry without authentication (default deployments).
- Attacker crafts a malicious
model.pklpayload that triggers command execution upon deserialization. - Attacker creates a corresponding
MLmodelYAML file specifyingmlflow.statsmodelsas the loader module. - Attacker uploads the malicious
model.pklandMLmodelfiles to the target artifact store. - Attacker influences a target application or ML pipeline to call
mlflow.pyfunc.load_model()with the path to the malicious model. - The
mlflow.pyfunc.load_model()function dispatches the load request tomlflow.statsmodels._load_pyfunc(). mlflow.statsmodelsexecutessmio.load_pickle()without checking theMLFLOW_ALLOW_PICKLE_DESERIALIZATIONenvironment variable.- The malicious pickle payload deserializes, resulting in arbitrary code execution with the privileges of the calling process.
Impact
Successful exploitation allows unauthenticated attackers to execute arbitrary code with the permissions of the MLflow service or the application loading the model. This can lead to full system compromise, exfiltration of sensitive model data, or persistence within the environment. Targeted sectors include organizations leveraging MLflow for MLOps, particularly those with internet-exposed model registries lacking authentication.
Recommendation
- Upgrade MLflow to version 3.15.0 or later immediately to include the guard logic.
- Implement strict authentication for all MLflow artifact stores and model registries to prevent unauthorized model uploads.
- Audit all artifact stores for suspicious or unknown
MLmodelfiles referencing themlflow.statsmodelsflavor. - If upgrading is not immediately feasible, implement strict file-system access controls (ACLs) on model storage locations to ensure only trusted service identities can modify model artifacts.
Immediate actions
Upgrade MLflow to 3.15.0 or later.
Mitigations
Enable authentication on all MLflow model registries.
Unauthenticated artifact store access