Record summary

CVE-2026-0596 has a selected CVSS score of 7.8 (high); EIP currently links 1 repository PoC and 1 lab environment.

Description

A command injection vulnerability exists in mlflow/mlflow when serving a model with `enable_mlserver=True`. The `model_uri` is embedded directly into a shell command executed via `bash -c` without proper sanitization. If the `model_uri` contains shell metacharacters, such as `$()` or backticks, it allows for command substitution and execution of attacker-controlled commands. This vulnerability affects the latest version of mlflow/mlflow and can lead to privilege escalation if a higher-privileged service serves models from a directory writable by lower-privileged users.

Description source: CVE List

Exploitation context

Available material

Repository PoCs
1
Lab environments
1

CISA SSVC decision

ExploitationPoC
AutomatableNo
Technical impactTotal

CISA Coordinator · SSVC 2.0.3 · Evaluated Mar 31, 2026 · Source: CVE List

Affected products and versions

2
ProductSourceVersion rangeStatus
CVE ListThrough latestaffected
GitHub AdvisoryBefore 3.9.0 · Fixed in 3.9.0affected

Proofs of concept

1

Repository PoCs

GitHubSparshBiswas-AI/CVE-2026-0596-ReproductionRepository PoCby SparshBiswas-AIStars: 0Writeup8 files

11.8 KiB

GitHub

PoC details
Analysisdeepseek-v4-pro:cloud ·

Technical assessment

The artifact is a technical writeup (README.md) that documents an attempt to reproduce CVE-2026-0596, a command injection vulnerability in MLflow. The writeup reports that the initial command injection vector via API parameters failed, and instead demonstrates a separate insecure deserialization attack using a pickle payload. The repository also contains a scanner script (verify_poc.py) that tests the original command injection vector, but the primary artifact is the writeup itself.

Backdoor review

No backdoor observed in reviewed code

The repository contains a PoC for CVE-2026-0596, demonstrating command injection and insecure deserialization in MLflow. All provided scripts (Dockerfile, generate_model.py, trigger_native.py, verify_poc.py) perform expected vulnerability reproduction tasks: building a vulnerable environment, creating a malicious pickle payload, and sending a crafted HTTP request. No concealed backdoor, unrelated payload, or deceptive behavior was observed in the reviewed text.

ClassificationWriteup
Model confidence95%
AuthenticationNot required
LanguagesPythonDockerfileMarkdown
Target softwaremlflowmlserver
Attack typesOS Command InjectionInsecure Deserialization
Evidence & reasoningClassification basis · observed behavior · safety review
Technical evidence

Classification basis and observed behavior

Classification basis

The primary file is a 194-line README.md that provides a structured vulnerability research report, including architectural analysis, test results, and mitigation strategies. It does not contain executable exploit code that directly triggers the CVE-2026-0596 command injection; instead, it documents a failed attempt and pivots to a different vulnerability class. The repository also includes a scanner script (verify_poc.py) that sends a payload to test the original injection vector, but the artifact as a whole is best classified as a writeup.

README.md:1-194verify_poc.py:1-41

Requirements

  • MLflow model serving with enable_mlserver=TrueREADME.md:26-28
  • Ability to supply a malicious model_uri or model artifactREADME.md:116-117

Observed behavior

  • The writeup describes a failed command injection test via the /invocations API endpoint, where shell metacharacters in a parameter were treated as a string literal.README.md:93-110
  • The writeup describes a successful insecure deserialization attack using a crafted pickle file that executes 'touch /tmp/native_success_marker.txt' upon loading.README.md:114-167
Safety-review evidence

Behaviors behind the backdoor verdict

Observables

Vulnerability Reproduction
Payload withheldThe README.md describes two test cycles: API parameter injection and insecure deserialization using pickle. The verify_poc.py sends a payload with shell metacharacters, and trigger_native.py creates and loads a malicious pickle file. These are standard PoC activities for the stated CVE.README.md:93-167verify_poc.py:1-41
Review boundaries

What the analysis did not establish

  • The evidence packet does not include the trigger_native.py file referenced in the writeup, so the exact exploit code for the deserialization attack is not provided.
  • The analysis is based solely on the supplied text files; no code was executed to verify the described behaviors.
  • 4 unclassified binary files were present but not analyzed (metadata only).
  • 4 text files were present in the repository but their content was not included in the evidence packet.
  • The review is limited to the supplied text content; no dynamic analysis was performed.
Model interpretation

This review is limited to the supplied PoC code and context. It does not assert that the code works or is safe to execute.

Docker lab environments

1
GitHub

docker-compose.yml

SparshBiswas-AI/CVE-2026-0596-ReproductionCreated
Vuln labCVE-2026-0596Compose · builds

1 Compose manifest · 1 Dockerfile · 1 service

Analysisdeepseek-v4-pro:cloud ·

Environment assessment

A Docker Compose environment that builds and runs an MLflow model server (v2.11.1) with MLServer (v1.3.5) enabled, serving a dummy pyfunc model on port 5000. The README describes it as a reproduction lab for CVE-2026-0596, focusing on insecure deserialization via pickle.

docker-compose.yml:1-7Dockerfile:1-20README.md:1-10

Lab assessment

Vulnerability lab

The README explicitly states the environment is a laboratory to evaluate CVE-2026-0596, describing a containerized setup with specific vulnerable framework versions and reproduction steps. The Dockerfile pins mlflow==2.11.1 and mlserver==1.3.5, and the README details exploit verification via pickle deserialization.

README.md:1-10Dockerfile:10
Lab shapeCompose · builds
Services1
Compose manifests1
Dockerfiles1
Evidence & reasoningComponents · CVE assessment · exercise context · review boundaries
Components

Services and files described by the evidence

vulnerable-mlflow service

vulnerable targetML model server

A container built from the local Dockerfile, running 'mlflow models serve' with --enable-mlserver on port 5000. It serves a dummy pyfunc model generated by generate_model.py.

docker-compose.yml:2-7Dockerfile:10

generate_model.py

model artifact generator

A Python script copied into the image and executed at build time to create a minimal MLflow pyfunc model at /app/saved_model using mlflow.pyfunc.save_model.

Dockerfile:13-16generate_model.py:1-20

trigger_native.py

exploit demonstration script

A standalone script that serializes a malicious pickle payload using __reduce__ to execute 'touch /tmp/native_success_marker.txt' upon deserialization, then simulates loading it. It is not part of the container build or service; the README instructs copying it into the running container and executing it manually.

trigger_native.py:1-29README.md:100-115

verify_poc.py

exploit verification script (command injection attempt)

A script that sends a POST request to the model server with a shell injection payload in the 'params' field, attempting to create /tmp/poc_success_marker.txt. The README notes this test cycle returned negative (no command injection).

verify_poc.py:1-41README.md:80-90
CVE assessment

How the supplied evidence relates each vulnerability

CVE-2026-0596

Insufficient evidence

The README associates CVE-2026-0596 with the lab, but the visible evidence does not demonstrate the claimed vulnerability. The Dockerfile pins mlflow==2.11.1 and mlserver==1.3.5, and the README describes a pickle deserialization exploit, but no actual exploit against the running service is shown. The verify_poc.py script attempts command injection (CWE-78) and fails, while trigger_native.py demonstrates generic pickle deserialization outside the service context. The connection between the CVE and the specific service behavior is not established by the supplied artifacts.

README.md:1-10Dockerfile:10verify_poc.py:1-41trigger_native.py:1-29
Exercise context

Requirements and sequence described by the evidence

Prerequisites

  • Docker and Docker Compose installed on the host to build and run the container.docker-compose.yml:1-7
  • The container must be running and the model server accessible on localhost:5000 for verify_poc.py.verify_poc.py:4
  • trigger_native.py must be manually copied into the running container and executed with 'docker exec'.README.md:100-115

Evidence-described exercise path

  1. Build and start the vulnerable MLflow service using 'docker-compose up'.docker-compose.yml:1-7
  2. Run verify_poc.py to attempt command injection via the /invocations endpoint (expected to fail).verify_poc.py:1-41README.md:80-90
  3. Copy trigger_native.py into the container and execute it to demonstrate pickle deserialization code execution.README.md:100-115trigger_native.py:1-29
  4. Verify the exploit by checking for /tmp/native_success_marker.txt inside the container.README.md:115-120
Safety-review evidence

Behaviors behind the stored safety assessment

No harmful behavior observed

All visible behavior is directed at the lab's own container. The Dockerfile builds a model server, the Compose file maps port 5000, and the exploit scripts target the container's filesystem (/tmp) or the local service. No evidence of host escape, external connectivity, persistence, credential theft, or destructive actions is present. The README explicitly describes the lab purpose and steps.

docker-compose.yml:1-7Dockerfile:1-20trigger_native.py:1-29verify_poc.py:1-41README.md:1-194
Review boundaries

What the analysis did not establish

  • The CVE association is not demonstrated by the visible evidence; the lab shows generic pickle deserialization, not a specific exploit against the running MLflow/MLServer service.
  • The requirements.txt lists different versions (mlflow==2.20.0, mlserver==1.6.0) than the Dockerfile, creating a version inconsistency that is not explained.
  • The README references a 'trigger_native.py' script and 'docker cp' commands, but the script is not part of the container build or service; it requires manual operator intervention.
  • No actual exploit payload is delivered through the model-serving API; the demonstrated deserialization occurs in an isolated script execution.
Model interpretation

This 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.

References

5