MLflow Server
A container running MLflow 2.14.1 UI on port 5000, using a file-based backend store at /home/nit/mlruns. It is the target for the deserialization exploit.
Dockerfile:24-33MLFlow unsafe deserialization
CVE-2024-37054 has a selected CVSS score of 8.8 (high); EIP currently links 6 repository PoCs and 1 lab environment.
Deserialization of untrusted data can occur in versions of the MLflow platform running version 0.9.0 or newer, enabling a maliciously uploaded PyFunc model to run arbitrary code on an end user’s system when interacted with.
| Product | Source | Version range | Status |
|---|---|---|---|
MLflowBrowse MLflow / MLflowDefault status: unaffected | CVE List | 0.9.0 to ≤ * | affected |
Default status: unknown | CVE List | 0.9.0 to ≤ * | affected |
mlflowBrowse PyPI / mlflow | GitHub Advisory | 0.9.0 to ≤ 2.14.1 | affected |
The artifact is a Proof of Concept (PoC) for CVE-2024-37054, a deserialization vulnerability in MLflow. It contains two Python scripts: one that logs a malicious model containing a pickled payload (poc/log_malicious_model.py), and another that loads the model, triggering arbitrary code execution via cloudpickle deserialization (poc/load_vulnerable_model.py). The README explicitly describes the steps to execute the attack and observe the RCE.
No backdoor observed in reviewed code
The repository is a documented Proof of Concept for CVE-2024-37054, demonstrating a known MLflow deserialization vulnerability. The payload (os.system call) is explicitly described in the README and source code as the intended exploit demonstration. No concealed, unrelated, or operator-directed harmful behavior was observed.
The artifact contains functional Python code that, when executed, logs a malicious model and then loads it to trigger arbitrary command execution. The README explicitly labels it as a 'Proof of Concept (PoC)' and provides step-by-step instructions to perform the attack. This is code intended to exercise a vulnerability, meeting the definition of an exploit.
README.md:19README.md:34poc/log_malicious_model.py:1-53poc/load_vulnerable_model.py:1-30README.md:49Dockerfile:26poc/log_malicious_model.py:6poc/log_malicious_model.py:46-50poc/load_vulnerable_model.py:24poc/log_malicious_model.py:17-23poc/load_vulnerable_model.py:21-24README.md:48poc/log_malicious_model.py:22README.md:155poc/log_malicious_model.py:22-23README.md:96-97Dockerfile:26This review is limited to the supplied PoC code and context. It does not assert that the code works or is safe to execute.
A Python exploit for CVE-2024-37054 that achieves remote code execution on MLflow Tracking Server by overwriting a model's python_model.pkl artifact with a malicious pickle payload and triggering deserialization via a prediction request.
No backdoor observed in reviewed code
The supplied evidence consists of a Python proof-of-concept exploit (poc.py) and its documentation (readme.md) for CVE-2024-37054, a pickle deserialization vulnerability in MLflow. The code implements a documented exploit chain: authenticate, upload training data, retrieve a run ID, overwrite a model artifact with a malicious pickle payload, and trigger deserialization to execute a user-supplied command or reverse shell. All behavior is consistent with the stated purpose of demonstrating the CVE. No concealed, deceptive, or unrelated harmful behavior was observed.
The artifact contains a complete, functional Python script (poc.py) that implements a multi-step exploit chain to achieve remote code execution on a vulnerable MLflow server. The script generates a malicious pickle payload, uploads it to overwrite a model artifact, and triggers deserialization to execute arbitrary commands. The README explicitly describes it as a 'Proof-of-concept exploit'.
poc.py:1-644readme.md:9readme.md:34readme.md:35readme.md:36poc.py:319-357poc.py:359-403poc.py:405-460poc.py:462-498poc.py:500-529poc.py:286-317poc.py:198-211poc.py:531-597poc.py:286-317readme.md:46-51poc.py:319-357poc.py:359-403poc.py:405-460poc.py:462-498poc.py:500-529This review is limited to the supplied PoC code and context. It does not assert that the code works or is safe to execute.
Full exploit for CVE-2024-37054 targeting MLflow. The code registers an account, trains a model, uploads a malicious pickle payload via the MLflow artifact API, and triggers deserialization to achieve remote code execution via a reverse shell.
No backdoor observed in reviewed code
The supplied evidence is a proof-of-concept exploit for CVE-2024-37054, a deserialization vulnerability in MLflow. The code builds a malicious pickle payload that executes a reverse shell when loaded by the vulnerable MLflow server. All behavior is consistent with the stated exploit objective: triggering arbitrary code execution on the target MLflow instance. No concealed backdoor, unrelated payload, or operator-directed harm beyond the advertised exploit was observed.
The artifact contains a complete, multi-step exploit that actively exercises the CVE-2024-37054 vulnerability to achieve remote code execution. It includes account registration, payload generation, artifact upload, and trigger mechanisms, going beyond mere detection or scanning.
shell.py:1-185README.MD:3-4shell.py:26-27shell.py:31-32shell.py:40-76shell.py:181shell.py:40-76shell.py:78-116shell.py:118-128shell.py:130-146shell.py:148-159shell.py:120malicious_payload.py:13shell.py:122-126malicious_payload.py:15-17shell.py:50-55shell.py:64-69shell.py:84-88shell.py:136-141shell.py:154-158This review is limited to the supplied PoC code and context. It does not assert that the code works or is safe to execute.
Exploit for CVE-2024-37054 that generates a malicious pickle payload, uploads it to an MLflow model registry, and triggers remote code execution via a reverse shell.
No backdoor observed in reviewed code
The supplied evidence describes a standard proof-of-concept exploit for CVE-2024-37054, which leverages pickle deserialization in MLflow to achieve remote code execution. The code in generate_model.py creates a reverse shell payload, and upload_model.py uploads it to an MLflow instance. This behavior is consistent with the stated vulnerability and does not exhibit any concealed backdoor or deceptive payload targeting the person running the PoC. The binary file model.pkl is flagged as uninspected, but its generation is fully explained by the provided Python script.
The artifact contains code that generates a malicious payload (generate_model.py) and uploads it to a vulnerable service (upload_model.py) with the explicit purpose of achieving remote code execution, as described in the README. This constitutes an exploit.
generate_model.py:6-12upload_model.py:28-82README.md:51-55upload_model.py:4-5upload_model.py:6README.md:23-25generate_model.py:6-12upload_model.py:28-56upload_model.py:58-82README.md:37-47generate_model.py:8generate_model.py:6-9upload_model.py:1-83This review is limited to the supplied PoC code and context. It does not assert that the code works or is safe to execute.
The artifact is a Python exploit for CVE-2024-37054, a deserialization vulnerability in MLflow. It automates discovery of MLflow models, uploads a malicious cloudpickle payload to overwrite the model's python_model.pkl artifact, and triggers remote code execution via a reverse shell.
No backdoor observed in reviewed code
The artifact is a proof-of-concept exploit for CVE-2024-37054. It demonstrates a legitimate deserialization attack against MLflow by uploading a malicious pickle payload. All behavior is consistent with the stated exploit purpose: it validates MLflow access, optionally registers/logs into a target application, trains a model, resolves run/experiment IDs, builds a reverse-shell pickle, uploads it to the MLflow artifact store, and triggers model loading. No concealed, deceptive, or unrelated harmful behavior was observed.
The artifact contains a complete, automated Python script (exploit.py) that actively exploits CVE-2024-37054 by uploading a malicious pickle payload and triggering its deserialization to achieve remote code execution. The README describes it as an exploit and provides usage examples for obtaining a reverse shell. The code includes payload construction (build_revshell_pickle), artifact poisoning (upload_pickle), and trigger mechanisms (trigger_load), which are hallmarks of an exploit, not a scanner or writeup.
exploit.py:1-4exploit.py:202-207exploit.py:211-228exploit.py:232-243README.md:1README.md:19-29README.md:4exploit.py:39-40exploit.py:148-164exploit.py:324-328README.md:40exploit.py:232-243exploit.py:48-75exploit.py:303-313exploit.py:79-144exploit.py:148-164exploit.py:168-198exploit.py:202-207exploit.py:211-228exploit.py:232-243exploit.py:362-366exploit.py:202-207exploit.py:79-144This review is limited to the supplied PoC code and context. It does not assert that the code works or is safe to execute.
A detailed penetration testing walkthrough for the Hack The Box 'SmartHire' machine, documenting the exploitation of CVE-2024-37054 (MLflow pickle deserialization) and a Python .pth file hijacking privilege escalation. The artifact contains no executable exploit or scanner code; it is a technical report with redacted commands and payloads.
No backdoor observed in reviewed code
The supplied evidence consists of a Hack The Box writeup (README.md and index.html) for the 'SmartHire' machine. The content describes a standard penetration testing methodology, including reconnaissance, exploitation of CVE-2024-37054 (MLflow pickle deserialization), and privilege escalation via Python .pth file hijacking. All commands and payloads are consistent with the documented attack path and target the stated victim machine. No concealed executable behavior, deceptive payloads, or operator-directed harm unrelated to the described CTF scenario was observed.
The artifact is a writeup. It provides a substantive technical analysis of a penetration testing engagement, including reconnaissance, exploitation, and privilege escalation steps. It does not contain functional exploit or scanner code; the provided code snippets are illustrative and redacted. The README.md explicitly states it is a 'complete penetration testing walkthrough' and the index.html is a styled presentation of the same content.
README.md:3-5README.md:136-138README.md:101-106README.md:111-121README.md:198-201README.md:101-106README.md:126-131README.md:140-143README.md:159-162README.md:218-235README.md:130README.md:162README.md:226This review is limited to the supplied PoC code and context. It does not assert that the code works or is safe to execute.
A Dockerized MLflow 2.14.1 server intended as a vulnerable target for CVE-2024-37054 deserialization RCE. The image runs as non-root user 'nit' and serves the MLflow UI on port 5000.
Dockerfile:1-33The README explicitly states this is a Proof of Concept for CVE-2024-37054, a deserialization vulnerability in MLflow. The Dockerfile installs a vulnerable version (2.14.1) and the repository includes attacker and victim scripts to demonstrate RCE.
README.md:1-179Dockerfile:24A container running MLflow 2.14.1 UI on port 5000, using a file-based backend store at /home/nit/mlruns. It is the target for the deserialization exploit.
Dockerfile:24-33A Python script that connects to the MLflow server, crafts a malicious model containing a pickled payload (os.system call), and logs it to the server. The payload creates a file 'pwned.txt' and prints a message.
poc/log_malicious_model.py:1-53A Python script that connects to the MLflow server and loads the malicious model using mlflow.pyfunc.load_model, triggering deserialization of the payload and executing the attacker's command.
poc/load_vulnerable_model.py:1-30Supported by supplied evidence
The README describes CVE-2024-37054 as a deserialization vulnerability in mlflow.pyfunc.load_model affecting versions up to 2.14.1. The Dockerfile installs mlflow==2.14.1, and the PoC scripts demonstrate RCE via a malicious pickled model, consistent with the CVE description.
README.md:1-179Dockerfile:24poc/log_malicious_model.py:1-53poc/load_vulnerable_model.py:1-30README.md:60-65README.md:72README.md:60-65poc/log_malicious_model.py:5README.md:62-63README.md:65README.md:100README.md:120README.md:123-125The payload in the attacker script only echoes a message and creates a file named pwned.txt. It does not target the host, exfiltrate data, establish persistence, or perform any destructive action. The Dockerfile runs as a non-root user and does not mount the Docker socket or use privileged mode. All behavior is contained within the lab's intended demonstration of CVE-2024-37054.
poc/log_malicious_model.py:17-19Dockerfile:1-33This review is limited to the supplied lab evidence packet. It does not assert that the environment runs, reproduces a vulnerability, or is safe to execute. Contract: eip-docker-lab-analysis-v1.